Mục lục:

Trạng thái Kicker đơn giản và hệ thống đặt chỗ với tích hợp Slack: 12 bước (có hình ảnh)
Trạng thái Kicker đơn giản và hệ thống đặt chỗ với tích hợp Slack: 12 bước (có hình ảnh)

Video: Trạng thái Kicker đơn giản và hệ thống đặt chỗ với tích hợp Slack: 12 bước (có hình ảnh)

Video: Trạng thái Kicker đơn giản và hệ thống đặt chỗ với tích hợp Slack: 12 bước (có hình ảnh)
Video: thỏ đẻ trứng 2024, Tháng bảy
Anonim
Trạng thái Kicker đơn giản và hệ thống đặt chỗ với tích hợp Slack
Trạng thái Kicker đơn giản và hệ thống đặt chỗ với tích hợp Slack

Trong một công ty nơi tôi làm việc có một bàn kicker. Công ty chiếm nhiều tầng và đối với một số nhân viên, phải mất đến 3 phút để đến bàn và… nhận ra rằng bàn đã có người.

Vì vậy, một ý tưởng đã nảy sinh để xây dựng một loại hệ thống đặt trước và phát sóng trạng thái đơn giản hoạt động trong thời gian thực.

Công ty sử dụng công cụ giao tiếp Slack mà mọi nhân viên đều có tài khoản. Chúng tôi thậm chí còn có một kênh #kicker chỉ để thảo luận về… kicker. Kênh có thể được sử dụng như một loại "điểm vào" để đặt chỗ và được thông báo về trạng thái của bàn hiện tại.

Như thường lệ, có nhiều khái niệm làm thế nào để đối phó với một hệ thống như vậy. Nhưng nhìn chung, một quy tắc cơ bản xuất hiện trong tất cả chúng: nó phải đơn giản để sử dụng mà không cần thực hiện bất kỳ bước nào quá mức khi xử lý hệ thống.

Thiết bị và dịch vụ không bị dính vào bàn kicker và có thể được sử dụng cho bất kỳ "tài nguyên chung" nào (như bàn bóng bàn, bảng điều khiển, v.v.) cần một số loại giải pháp đặt trước amd rộng rãi trạng thái.

Vậy hãy bắt đầu…

Bước 1: Bằng chứng về Khái niệm và Tạo mẫu

Bằng chứng về Khái niệm và Tạo mẫu
Bằng chứng về Khái niệm và Tạo mẫu
Bằng chứng về Khái niệm và Tạo mẫu
Bằng chứng về Khái niệm và Tạo mẫu
Bằng chứng về Khái niệm và Tạo mẫu
Bằng chứng về Khái niệm và Tạo mẫu

Ý tưởng của Raughly là xây dựng một thiết bị sẽ được đặt bên cạnh bàn kicker theo các yêu cầu sau:

  • một số chỉ báo về tình trạng bảng hiện tại - nếu Bạn đang đứng cạnh nó, Bạn sẽ có thể biết rằng nó là miễn phí hay được đặt trước và sẽ có người đến chơi sau 3 phút nữa. Đèn giao thông hoàn toàn phù hợp với ý tưởng:

    • đèn xanh - chơi miễn phí,
    • đèn vàng - dành riêng,
    • đèn đỏ - bị chiếm dụng.
  • (các) nút Bạn có thể nhấp vào trước và sau trận đấu để mọi người khác được thông báo về tình trạng của bảng hiện tại. Thay vì 1 nút bật tắt, tôi quyết định sử dụng 2 nút tách biệt:

    • nút màu đỏ - chiếm bàn, bắt đầu trò chơi (sau khi đặt trước hoặc đặc biệt).
    • nút màu xanh lá cây - bảng phát hành.
  • một số màn hình hiển thị với thông tin chi tiết hơn về "chuyện gì đang xảy ra" - thời gian chờ đặt trước, trạng thái bàn lặp lại, hết giờ chơi, v.v.

Bằng cách đặt trước, tôi có nghĩa là chỉ đặt chỗ trong 3 phút tiếp theo. Hệ thống không được thiết kế để người dùng có thể đặt bàn vào thời điểm chính xác (ví dụ: 02:00 PM). Nó không hoạt động giống như đặt trước, ví dụ: trong các nhà hàng nhưng chỉ trong những phút giao tiếp.

Vì thiếu kết nối mạng LAN, lựa chọn duy nhất là sử dụng mạng WLAN - dù sao đây cũng là lựa chọn tốt nhất. Bộ não của hệ thống phải sử dụng API Slack để gửi và nhận lệnh từ kênh Slack. Đầu tiên tôi đã thử sử dụng NodeMCU. Tôi có thể nhận và nhận tin nhắn đến và đi từ Slack nhưng do việc sử dụng HTTPS và kích thước "tin nhắn chào mừng" của Slack (~ 300kB), NodeMCU đã mất kết nối và / hoặc có một số ngoại lệ kỳ lạ mà tôi không thể giải quyết việc đào qua Internet.

Vì vậy, tôi quyết định sử dụng thứ gì đó mạnh mẽ hơn: Raspberry Pi 3 (Zero W với WiFi vẫn chưa được phát hành vào thời điểm đó). Bằng cách có RPi, tôi có thể chuyển ngôn ngữ triển khai từ C sang Java vì nó thuận tiện hơn cho tôi - vì vậy đây là một lợi thế. Ngày nay Bạn có thể sử dụng thứ gì đó mạnh hơn NodeMCU và ít mạnh hơn RPi. Raspberry Zero có thể?

Sau khi xây dựng nguyên mẫu đầu tiên trên một breadboard với một số hệ thống dây điên rồ, rất nhiều phác thảo và tạo mẫu, hệ thống có vẻ như nó có thể hoạt động.

Có tất cả những ý tưởng này và PoC đang hoạt động, tôi bắt đầu lên kế hoạch cho các cấu hình vị trí khác nhau của các mục trên trên bảng điều khiển phía trước để chúng có nhiều thông tin và thuận tiện nhất khi sử dụng. Bạn có thể kiểm tra một số đề xuất khác, có thể một số đề xuất phù hợp hơn với Bạn. Người cuối cùng là người do tôi chọn.

Bước 2: Vật liệu và công cụ

Vật liệu tôi đã sử dụng:

  • Hộp
  • Raspberry Pi, thẻ nhớ microSD, bộ cấp nguồn micro USB
  • Các nút arcade màu xanh lá cây và màu đỏ
  • Màn hình LCD 16x2
  • Đèn LED - Tôi đã sử dụng RGB nhưng Bạn có thể sử dụng màu thích hợp
  • Cáp jumper breadboard từ Nam đến Nữ và Nữ đến Nữ
  • Giao diện micro USB
  • Breadboard mini chỉ để kết nối một số dây
  • Cáp micro USB ngắn hoạt động như một dây nối bên trong hộp để cấp nguồn cho RPi

Các công cụ tôi đã sử dụng:

  • Dao sắc (ví dụ như dao tiện ích để cắt thảm)
  • Dụng cụ xoay
  • Súng bắn keo nóng
  • Trạm hàn
  • Kìm, kìm chéo / kìm cắt cạnh
  • Cái vặn vít
  • Tập tin
  • Tôi

Các công cụ có thể bạn cần:

Tất cả những điều trên nhưng thay vì "Tôi" thì nên là: "Bạn":)

Bước 3: Mặt trước - Màn hình LCD

Mặt trước - Màn hình LCD
Mặt trước - Màn hình LCD
Mặt trước - Màn hình LCD
Mặt trước - Màn hình LCD

Lỗ cho màn hình LCD rất đơn giản. Chỉ là một hình chữ nhật phù hợp với màn hình LCD của tôi. Sau khi cố gắng cắt nó bằng một con dao sắc, tôi nhận ra rằng nhựa của hộp khá cứng. Vì vậy, tôi đã sử dụng công cụ khoan để cắt cửa sổ và đánh bóng các cạnh.

Bước 4: Mặt trước - Đèn LED trạng thái

Bảng điều khiển phía trước - Đèn LED trạng thái
Bảng điều khiển phía trước - Đèn LED trạng thái
Bảng điều khiển phía trước - Đèn LED trạng thái
Bảng điều khiển phía trước - Đèn LED trạng thái

Các lỗ LED cũng đơn giản. Tôi chỉ lấy một cái khoan lớn cho gỗ và sau đó tôi đánh bóng các cạnh bằng công cụ khoan. Các đèn LED lớn được trang bị hoàn hảo chặt chẽ. Tôi chưa hàn bất kỳ điện trở nào với đèn LED - tôi đã để nó cho quá trình lắp ráp.

Bước 5: Bảng điều khiển phía trước - Các nút

Bảng điều khiển phía trước - Các nút
Bảng điều khiển phía trước - Các nút
Bảng điều khiển phía trước - Các nút
Bảng điều khiển phía trước - Các nút
Bảng điều khiển phía trước - Các nút
Bảng điều khiển phía trước - Các nút
Bảng điều khiển phía trước - Các nút
Bảng điều khiển phía trước - Các nút

Vấn đề lớn nhất với 2 nút lớn này là đặt chúng đều nhau với khoảng cách thích hợp. Tôi cắt các lỗ chỉ bằng cách sử dụng công cụ khoan của mình vì tôi có thể tăng đường kính từng bước để các nút vừa khít.

Bước 6: Đầu nối nguồn

Đầu nối nguồn
Đầu nối nguồn

Một lỗ nhỏ cho nguồn micro USB là một công việc rất tinh vi. Tôi muốn lỗ vừa khít nhất có thể nên tôi đã dành rất nhiều thời gian cho việc đánh bóng ở đây. Nhưng tôi hài lòng với kết quả cuối cùng.

Sau đó, tôi cắt một cáp USB mini ngắn được đặt bên trong hộp. Một bên nó được cắm vào RPi và bên kia, tất cả các cáp đã được hàn vào giao diện micro USB theo sơ đồ chân USB.

Sau đó, tôi dán trực tiếp PCB nhỏ vào hộp (có thể thấy nó trên ảnh ở bước lắp ráp).

Bước 7: Kết hợp mọi thứ lại với nhau

Kết hợp mọi thứ lại với nhau
Kết hợp mọi thứ lại với nhau
Kết hợp mọi thứ lại với nhau
Kết hợp mọi thứ lại với nhau
Kết hợp mọi thứ lại với nhau
Kết hợp mọi thứ lại với nhau

Đầu tiên, tôi hàn các điện trở thích hợp với đèn LED theo màu sắc (điện áp) của chúng cho điện áp 3,3V. Tôi đã sử dụng 100Ω cho màu đỏ, hai điện trở 82 và 100 cho màu vàng (nút xanh lá cây và đỏ), và 100Ω cho màu xanh lá cây. Bạn có thể sử dụng một trong những điện trở trực tuyến cho máy tính LED. Nhưng hãy tự mình nghiên cứu theo độ sáng và tông màu chính xác mà Bạn muốn đạt được.

Các chân của đèn LED màu vàng được hàn lại với nhau để có thể điều khiển chính đèn LED chỉ bằng một chân trên RPi.

Theo sơ đồ sơ đồ chân này:

Các nút LED đã được kết nối:

  • Đèn LED xanh - GPIO1 trên Rpi
  • Đèn LED màu vàng (cả hai chân) thành GPIO2 trên RPi
  • Đèn LED đỏ thành GPIO0 trên RPi

Tôi đã kết nối LCD bằng chân I2C trên chân RPi

  • LCD SDA đến GPIO8 trên RPi
  • LCD SCL sang GPIO9 trên RPi
  • LCD PWR đến 5V trên RPi
  • LCD GND sang GND trên RPi

Màn hình LCD được dán nóng vào hộp như một biện pháp bảo vệ bổ sung.

Tôi đã kết nối 3.3V và GND với bảng mạch nhỏ để tôi có thể sử dụng chúng cho các nút.

Nút màu xanh lá cây được kết nối với 3.3V thông qua breadboard mini và với GPIO5 trên RPi.

Nút màu đỏ được kết nối với 3.3V thông qua breadboard mini và với GPIO4 trên RPi.

Vì vậy, bất cứ khi nào Bạn nhấn nút, sẽ có trạng thái cao trên chân RPi.

Bo mạch chủ mini hoạt động tốt nên tôi đã bỏ qua việc hàn tất cả các dây vào PCB. Thay vào đó, tôi chỉ phủ keo nóng lên bảng mạch bánh mì mini để dây cáp không bị rơi ra.

Tôi cũng dán nóng nắp của RPi vào hộp để nó không bị lung lay bên trong.

Tôi đã vặn bảng điều khiển phía trước với tất cả những thứ bên trong.

Sau đó, tôi in, cắt và dán các nhãn đơn giản bên cạnh các nút và đèn giao thông.

Bước 8: Cấu hình Slack

Cấu hình Slack
Cấu hình Slack
Cấu hình Slack
Cấu hình Slack

Tạo nhóm của Bạn trên Slack.com hoặc sử dụng nhóm Bạn có và Bạn có ít nhất quyền quản trị viên.

Trong Slack, hãy tạo một kênh để tích hợp Slack của dịch vụ (hoặc bỏ qua việc tạo kênh nếu Bạn muốn sử dụng kênh mà Bạn đã có).

Thêm tích hợp Webhooks Incomming vào nhóm của bạn. Chọn kênh và sao chép URL webhook.

Thêm tích hợp Bots vào nhóm của bạn. Chọn một số tên cho bot của bạn và sao chép mã thông báo API bot.

Trang quản lý tích hợp tùy chỉnh của bạn sẽ giống như trên hình.

Bạn phải mời bot làm thành viên kênh của bạn. Bạn có thể làm điều đó trong quá trình tạo kênh.

Nếu Bạn muốn tùy chỉnh dịch vụ sau này, vui lòng kiểm tra API Slack.

Bước 9: Triển khai phần mềm

Tôi đã sử dụng Raspbian làm hệ điều hành cho RPi của mình bằng cách làm theo hướng dẫn này. Xin hãy tha thứ cho tôi, tôi sẽ bỏ qua việc giải thích nó vì nó đã được ghi lại ở nhiều nơi và quá trình này rất đơn giản. Tôi hy vọng Bạn đủ kỹ năng và kinh nghiệm để tự mình thiết lập RPi. Xin đừng quên định cấu hình truy cập WiFi trên Raspberry Pi của bạn;)

Như đã đề cập trong phần tạo mẫu, tôi đã sử dụng Java để triển khai bộ não của toàn hệ thống. Mã hiện có trên GitHub -

Các thư viện Java tôi đã sử dụng:

  • pi4j - để sử dụng Raspberry Pi từ Java
  • Springboot như một ứng dụng cố định
  • allbegray / slack-api dưới dạng tích hợp Slack

Bạn cần chỉnh sửa tệp cấu hình trong src / resources / config.properties. Có 3 mục nhập Bạn phải định cấu hình để sử dụng API Slack:

  • channelName - tên kênh Bạn muốn đăng các thay đổi trạng thái và nhận lệnh.
  • slackBotToken - mã thông báo của một bot được định cấu hình trong tích hợp nhóm Slack của bạn sẽ được sử dụng để đăng thông báo lên kênh được đề cập ở trên. Xin lưu ý Bạn phải thêm Slack Bot làm thành viên của kênh.
  • webhookUrl - URL Bạn có thể lấy từ các tích hợp tùy chỉnh của Nhóm Slack.

Dự án được Mavenized vì vậy để xây dựng nó chỉ cần nhập (Bạn cần cài đặt ít nhất Java 8 và Maven):

gói sạch mvn

Và trong thư mục đích Bạn có thể tìm thấy tệp JAR của Springbooted. Để bắt đầu một dịch vụ:

sudo java -jar kicker-booking-service-0.3.0.jar

Tôi đặt dòng này thành tập lệnh.sh và thêm nó dưới dạng tự động khởi động. Vì vậy, bất cứ khi nào bật nguồn, dịch vụ sẽ tự động khởi động.

Một lời giải thích đặc biệt là cần thiết cho màn hình LCD.

Tôi đã thử các cách tiếp cận / thư viện khác nhau để điều khiển LCD qua I2C từ RPi nhưng không thành công. Đối với một số màn hình LCD không hoạt động bình thường, đối với một số màn hình hiển thị rác.

Nhưng có một điều đã hoạt động rất tốt ngay từ đầu. Nó là công cụ dòng lệnh tiện ích mà tôi tìm thấy Bạn có thể sử dụng để điều khiển màn hình LCD. Vì vậy, tôi quyết định chỉ sử dụng công cụ này trực tiếp từ Java. Nó hoạt động như thế này mà một tiến trình Linux bình thường (lcdi2c) được gọi (với các tham số đã chuẩn bị) mỗi khi tôi muốn hiển thị thứ gì đó trên màn hình LCD.

Bạn cần tải xuống công cụ và đặt nó bên cạnh dịch vụ JAR

Sử dụng công cụ này là một kiểu hack và giải pháp ngu ngốc Nhưng tôi tuân theo quy tắc đầu tiên của kỹ thuật:

Nếu nó là ngu ngốc, nhưng nó hoạt động … nó không phải là ngu ngốc

Bước 10: Hướng dẫn sử dụng

Hướng dẫn sử dụng
Hướng dẫn sử dụng

Bạn có thể kiểm tra trạng thái hiện tại của bảng kicker trên kênh Slack đã tạo bằng cách gõ lệnh "status" (hay ngắn gọn là "st") hoặc kiểm tra trực tiếp đèn giao thông trên thiết bị.

Nếu bạn chỉ muốn chơi - nhấn nút màu đỏ. Tin nhắn sẽ được gửi đến kênh Slack với thông tin rằng bàn kicker đã được sử dụng. Khi bạn chơi xong - nhấn nút màu xanh lá cây. Tin nhắn sẽ được gửi đến kênh Slack với thông tin rằng kicker table có thể chơi miễn phí.

Đèn giao thông cũng sẽ thay đổi và màn hình LCD sẽ hiển thị một số thông tin chi tiết.

Đề phòng trường hợp Bạn quên thả bàn sau khi chơi xong, sẽ có thời gian chờ được đặt thành 20 phút. Nếu Bạn vẫn đang chơi và cần thêm thời gian, hãy nhấn lại nút màu đỏ và trận đấu sẽ được kéo dài thêm 5 phút (chỉ áp dụng khi chỉ còn dưới 5 phút trước khi hết giờ). Thời gian chờ chơi sẽ được hiển thị trên màn hình LCD.

Để đặt trước bảng kicker, hãy viết một tin nhắn “dự trữ” (hoặc chỉ: „res”) vào kênh Slack.

Đèn giao thông màu vàng sẽ bật để thông báo cho những người khác gần bàn kicker rằng nó đã được đặt trước và sẽ sớm có người đến chơi.

Thời gian chờ đặt trước được đặt thành 3 phút. Sau đó, kicker table chuyển trạng thái sang tự do để chơi.

Nếu Bạn cần, Bạn có thể hủy đặt chỗ bằng cách viết “hủy bỏ” trên kênh Slack.

Hệ thống cũng có một số tính năng nhỏ khác như:

  • Sau khi đặt trước, các nút sẽ bị đóng băng trong 5 giây. Điều này là để ngăn ngừa các tình huống, chỉ trong cùng một thời điểm có người đặt trước và một phần nghìn giây sau đó ai đó nhấn nút màu đỏ và nghĩ rằng Anh / Cô ấy là người chiếm bàn nhưng không biết rằng ai đó đã đặt bàn trước đó chỉ một phần nghìn giây.
  • Nhấn bất kỳ nút nào sẽ đóng băng cả hai nút trong nửa giây. Điều này là để ngăn chặn những người nhấp vào nút điên cuồng để kênh Slack sẽ không bị spam nhiều như vậy.
  • Phiên bản miễn phí của Slack cho phép lưu trữ 10000 tin nhắn của cả nhóm. Để giữ lại một số tin nhắn, dịch vụ xóa các tin nhắn cũ liên quan đến hệ thống đặt chỗ / trạng thái) và chỉ giữ lại 6 tin nhắn cuối cùng. Tại sao 6? Bởi vì thông thường có 2 tình huống trạng thái: "Đã dành sẵn-Chiếm-Miễn phí" và "Không bị Chiếm giữ". Vì vậy hệ thống có thể lưu trữ ít nhất 2 phiên hoàn toàn không bị chiếm dụng. Để làm sạch tất cả các thư hệ thống, hãy gõ lệnh "clean" (hoặc "clear").

Bước 11: Phát hành

Phát hành
Phát hành
Phát hành
Phát hành

Cho đến bây giờ (thời điểm xuất bản hướng dẫn này), hệ thống đang chạy trong hơn 2,5 tháng và được hơn 30 người sử dụng. Bởi vì tính năng cập nhật trạng thái của bảng kicker, chúng tôi luôn biết khi nào nó rảnh hoặc bị chiếm đóng nên chúng tôi không mất thời gian quay đi quay lại nữa. Kết nối và dịch vụ rất ổn định nên chúng tôi có thể tin tưởng vào nó.

Càng xa càng tốt…

Bước 12: Câu hỏi thường gặp

Tại sao thời gian chờ đặt chỗ được đặt thành 3 phút?

3 phút là thời gian đặt trước tối đa, áp dụng nó như bạn muốn trong mã. Nói chung điều đó sẽ hiếm khi xảy ra, 3 phút đầy đủ sẽ trôi qua và đặt trước sẽ hết thời gian. Trong hầu hết các trường hợp, ai đó cuối cùng sẽ đến và chiếm bàn.

Tại sao thời gian chờ chơi lại được đặt thành 20 phút?

Tùy thuộc vào người chơi, thời gian chơi trung bình là ~ 10 phút. Nếu Bạn cần chơi lâu hơn, hãy nhấn lại nút màu đỏ khi còn dưới 5 phút và thời gian chờ sẽ được kéo dài trở lại 5 phút. Thời gian chờ này được thiết lập chỉ trong trường hợp ai đó quên giải phóng bảng.

Tại sao không có bảng mã PIN trên thiết bị để xác nhận đặt chỗ; không có thông tin đăng nhập và mật khẩu?

Ý tưởng chính là giữ cho nó-đơn-giản-ngu ngốc. Ngược lại, nếu việc đặt trước, bắt đầu và kết thúc trò chơi cần quá nhiều nỗ lực, thì sẽ không ai muốn sử dụng nó.

Tại sao thiết bị trông rất công nghiệp-xấu xí?

Bởi vì tôi không có máy cắt laser, CNC, máy in 3D, máy sản xuất nhãn màu ưa thích, v.v. Bạn rất vui khi cải thiện nó và làm cho nó đẹp hơn.

Tại sao không chỉ triển khai một số ứng dụng và gắn máy tính bảng giá rẻ vào tường với cùng chức năng?

Ứng dụng, ứng dụng ở khắp mọi nơi. Mọi người thích tương tác vật lý với mọi thứ chứ không chỉ chạm vào màn hình phẳng.

Đề xuất: