Taula de continguts:

Sistema senzill d'estat i reserva de Kicker amb integració Slack: 12 passos (amb imatges)
Sistema senzill d'estat i reserva de Kicker amb integració Slack: 12 passos (amb imatges)

Vídeo: Sistema senzill d'estat i reserva de Kicker amb integració Slack: 12 passos (amb imatges)

Vídeo: Sistema senzill d'estat i reserva de Kicker amb integració Slack: 12 passos (amb imatges)
Vídeo: Часть 2 - Трипланетная аудиокнига Э. Э. Смита (главы 5–8) 2024, Desembre
Anonim
Sistema senzill d'estat i reserva de Kicker amb integració Slack
Sistema senzill d'estat i reserva de Kicker amb integració Slack

En una empresa on treballo hi ha una taula de kickers. L'empresa ocupa moltes plantes i per a alguns dels empleats triga fins a 3 minuts a arribar a la taula i … adonar-se que la taula ja està ocupada.

Per tant, va sorgir una idea per construir una mena de sistema de transmissió i reserva d'estat simple que funcioni en temps real.

L'empresa utilitza l'eina de comunicació Slack, on cada empleat té un compte. Fins i tot tenim un canal #kicker només per a discussions sobre … kicker. El canal es podria utilitzar com una mena de "punt d'entrada" per a la reserva i per ser informat sobre l'estat de la taula actual.

Com és habitual, hi ha molts conceptes sobre com fer front a aquest sistema. Però, en general, apareixia una regla bàsica en totes: ha de ser senzilla d'utilitzar sense fer passos excessius quan es tracta del sistema.

El dispositiu i el servei no s’enganxen a la taula de kickers i es poden utilitzar per a qualsevol "recurs comú" (com ara taula de ping-pong, consola, etc …) que necessiti algun tipus de solució de reserva de difusió d'estat i de distribució.

Comencem, doncs, …

Pas 1: Prova de concepte i prototipatge

Prova de concepte i prototipatge
Prova de concepte i prototipatge
Prova de concepte i prototipatge
Prova de concepte i prototipatge
Prova de concepte i prototipatge
Prova de concepte i prototipatge

Per descomptat, la idea era construir un dispositiu que es posaria al costat de la taula de kickers seguint aquests requisits:

  • alguns indicadors sobre l'estat actual de la taula: si esteu al costat, hauríeu de saber que és lliure o reservat i que algú vindrà a jugar en 3 minuts. Els semàfors s’adapten perfectament a la idea:

    • llum verda: lliure de jugar,
    • llum groga - reservat,
    • llum vermella: ocupada.
  • botó (s) Podeu fer clic abans i després del partit perquè tothom s'informi sobre l'estat de la taula actual. En lloc d'un botó d'activació, vaig decidir utilitzar 2 botons separats:

    • botó vermell: ocupa la taula i comença un joc (després de la reserva o ad hoc).
    • botó verd: llança la taula.
  • algunes pantalles amb informació més detallada sobre "què passa": temps d'espera de reserva, estat de taula repetit, temps d'espera de joc, etc.

Per reserva em refereixo només a la reserva dels pròxims 3 minuts. El sistema no està dissenyat perquè l’usuari pugui reservar la taula a l’hora exacta (per exemple, a les 14:00). No funciona com la reserva, per exemple. als restaurants, però només per uns minuts més recents.

A causa de la manca de connexió LAN al seu lloc, l'única opció és utilitzar WLAN, de tota manera és la millor opció. El cervell del sistema ha d’utilitzar l’API Slack per enviar i rebre ordres des del canal Slack. Primer vaig intentar utilitzar NodeMCU. Vaig poder rebre i rebre missatges des de i cap a Slack, però a causa de l'ús d'HTTPS i també de la mida del "missatge de benvinguda" de Slack (~ 300kB), NodeMCU perdia la connexió i / o tenia alguna excepció estranya que no vaig poder resoldre excavant per Internet.

Així que vaig decidir utilitzar alguna cosa més potent: Raspberry Pi 3 (Zero W amb WiFi encara no es va llançar en aquell moment). Tenint RPi, podria canviar el llenguatge d’implementació de C a Java, ja que és més convenient per a mi, de manera que això era un avantatge. Avui en dia podeu utilitzar alguna cosa més potent que NodeMCU i menys potent que RPi. Raspberry Zero potser?

Després de construir el primer prototip sobre una taula de treball amb un cablejat boig, molts esbossos i prototips, el sistema semblava que pot funcionar.

Tenint totes aquestes idees i funcionant amb PoC, vaig començar a planificar diferents configuracions de col·locació dels elements anteriors en un tauler frontal perquè siguin el més informatiu i convenient d’utilitzar. Podeu consultar algunes de les altres propostes, potser algunes s’adapten millor a vosaltres. L’últim va ser l’escollit per mi.

Pas 2: materials i eines

Materials que he utilitzat:

  • Caixa
  • Raspberry Pi, targeta microSD, font d'alimentació micro USB
  • Botons arcade verds i vermells
  • Pantalla LCD de 16x2
  • LED: he utilitzat RGB, però podeu utilitzar el color adequat
  • Cables de pont de panell de femella a femella i femella a femella
  • Interfície micro USB
  • Mini taulell per connectar alguns cables
  • Cable micro USB curt que funciona com a pont dins de la caixa per alimentar el RPi

Eines que he fet servir:

  • Ganivet esmolat (per exemple, ganivet utilitzat per tallar catifes)
  • Eina rotativa
  • Pistola de cola calenta
  • Estació de soldadura
  • Alicates, alicates diagonals / talladores laterals
  • Tornavís
  • Dossier
  • Jo

Eines que probablement necessiteu:

Tot això, però en lloc de "Jo" hauria de ser: "Tu":)

Pas 3: Tauler frontal: pantalla LCD

Tauler frontal: pantalla LCD
Tauler frontal: pantalla LCD
Tauler frontal: pantalla LCD
Tauler frontal: pantalla LCD

El forat de la pantalla LCD era senzill. Només un rectangle que s’adapta a la meva pantalla LCD. Després d’intentar tallar-lo amb un ganivet afilat, em vaig adonar que el plàstic de la caixa és força dur. Així que vaig utilitzar una eina de perforació per tallar la finestra i polir les vores.

Pas 4: Tauler frontal: LEDs d'estat

Tauler frontal: LEDs d'estat
Tauler frontal: LEDs d'estat
Tauler frontal: LEDs d'estat
Tauler frontal: LEDs d'estat

Els forats LED també són senzills. Acabo de fer un trepant gran per a la fusta i després he polit les vores amb una eina de trepat. Els grans LED s’adaptaven perfectament. Encara no he soldat cap resistència als LED: ho he deixat per al procés de muntatge.

Pas 5: Tauler frontal: botons

Tauler frontal: botons
Tauler frontal: botons
Tauler frontal: botons
Tauler frontal: botons
Tauler frontal: botons
Tauler frontal: botons
Tauler frontal: botons
Tauler frontal: botons

El problema més gran amb aquests dos grans botons era situar-los uniformement amb l’espai adequat. Vaig tallar els forats només amb la meva eina de perforació, ja que podia augmentar el diàmetre pas a pas perquè els botons quedessin ben ajustats.

Pas 6: Connector d'alimentació

Connector d'alimentació
Connector d'alimentació

Un petit forat per a l'alimentació micro USB era una feina molt delicada de fer. Volia que el forat fos el més ajustat possible, així que vaig passar molt de temps aquí per polir. Però em va quedar satisfet amb el resultat final.

Després vaig tallar un curt mini cable USB que es va col·locar dins de la caixa. Per una banda, està connectat a RPi i, per l'altra, tots els cables es van soldar a la interfície micro USB segons els pinouts USB.

Després vaig enganxar el petit PCB directament a la caixa (es pot veure en una foto al pas del muntatge).

Pas 7: ajuntar-ho tot

Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt

Primer he soldat les resistències adequades als LED segons el seu color (voltatge) per a 3,3V volt. He utilitzat 100 Ω per al vermell, dues resistències 82 i 100 per al groc (node verd i vermell) i 100 Ω per al verd. Podeu utilitzar la resistència en línia per a la calculadora LED. Però, si us plau, investigueu vosaltres mateixos segons la brillantor i el to de color exacte que vulgueu aconseguir.

Les potes de LED groc es van soldar juntes, de manera que el mateix LED es pot controlar només mitjançant un pin a RPi.

Segons aquest diagrama de fixació:

Es van connectar nodes LED:

  • LED verd - GPIO1 a Rpi
  • LED groc (ambdues potes) a GPIO2 a RPi
  • LED vermell a GPIO0 a RPi

Vaig connectar LCD mitjançant pins I2C als pins RPi

  • LCD SDA a GPIO8 a RPi
  • LCD SCL a GPIO9 a RPi
  • LCD PWR a 5V en RPi
  • LCD GND a GND a RPi

La pantalla LCD es va enganxar a la caixa com a protecció addicional.

Vaig connectar 3.3V i GND a la petita tauleta per poder utilitzar-los com a botons.

El botó verd es va connectar al 3,3 V mitjançant mini taulers de suport i a GPIO5 a RPi.

El botó vermell es va connectar al 3,3V mitjançant mini taulers de suport i a GPIO4 a RPi.

Per tant, sempre que premeu el botó, hi ha un estat alt al pin RPi.

El mini tauler funciona molt bé, de manera que he saltat la soldadura de tots els cables al PCB. En lloc d’això, només he cobert la mini placa amb cola calenta perquè els cables no caiguin.

També he enganxat la coberta de RPi a la caixa perquè no es vacili dins.

Vaig cargolar el tauler frontal amb totes les coses a dins.

Després vaig imprimir, tallar i enganxar etiquetes senzilles al costat dels semàfors i dels botons.

Pas 8: Configuració de Slack

Configuració de Slack
Configuració de Slack
Configuració de Slack
Configuració de Slack

Creeu el vostre equip a Slack.com o utilitzeu el que teniu i teniu almenys drets d'administrador.

A Slack, creeu un canal per a la integració de Slack del servei (o ometeu la creació d'un canal si en voleu utilitzar un que ja teniu).

Afegiu la integració de Webhooks entrants al vostre equip. Seleccioneu el canal i copieu l'URL del webhook.

Afegiu la integració de Bots al vostre equip. Trieu un nom per al bot i copieu el testimoni de l'API del bot.

La pàgina de la vostra gestió d’integracions personalitzades hauria de semblar a la imatge.

Heu de convidar el bot com a membre del vostre canal. Ja ho podríeu fer durant la creació d'un canal.

Si voleu personalitzar el servei més endavant, consulteu l'API Slack.

Pas 9: Implementació de programari

He utilitzat Raspbian com a sistema operatiu per al meu RPi seguint aquest tutorial. Perdoneu-me, no ho explicaré, ja que ja està documentat en molts llocs i el procés és senzill. Espero que tingueu la suficient experiència i experiència com per configurar RPi pel vostre compte. No oblideu configurar l'accés WiFi al vostre Raspberry Pi;)

Com es va esmentar a la secció de prototipatge, vaig utilitzar Java per implementar el cervell de tot el sistema. El codi està disponible a GitHub -

Les biblioteques Java que he utilitzat:

  • pi4j: per utilitzar Raspberry Pi de Java
  • Springboot com a aplicació platrorm
  • allbegray / slack-api com a integració de Slack

Cal editar el fitxer de configuració a src / resources / config.properties. Hi ha 3 entrades que heu de configurar per utilitzar l'API Slack:

  • channelName: nom del canal Voleu publicar canvis d'estat i rebre ordres.
  • slackBotToken: testimoni d'un bot configurat a les integracions del vostre equip Slack que s'utilitzarà per publicar missatges al canal esmentat anteriorment. Tingueu en compte que heu d'afegir Slack Bot com a membre del canal.
  • webhookUrl: l'URL que podeu obtenir de les integracions personalitzades de Slack Team.

El projecte està Mavenized, de manera que per construir-lo només cal que escriviu (Necessiteu almenys Java 8 i Maven instal·lats):

paquet mvn net

I a la tirectòria de destinació, podeu trobar el fitxer JAR Springbooted. Per iniciar un servei:

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

He establert aquesta línia en l'script.sh i l'he afegit com a inici automàtic. Així, sempre que s’encén, el servei arrenca automàticament.

Cal una explicació especial a la pantalla LCD.

He provat diferents enfocaments / biblioteques per controlar la pantalla LCD sobre I2C des de RPi, però he fallat. Per a alguns LCD no funcionava correctament, per a alguns mostrava escombraries.

Però una cosa funcionava molt bé al sortir de la caixa. És l'eina de línia d'ordres que he trobat que podeu utilitzar per controlar la pantalla LCD. Així que vaig decidir utilitzar aquesta eina directament des de Java. Funciona així que es crida a un procés normal de Linux (lcdi2c) (amb paràmetres preparats) cada vegada que vull mostrar alguna cosa a la pantalla LCD.

Heu de descarregar l'eina i col·locar-la al costat del servei JAR

L’ús d’aquesta eina és una mena de solució pirata i estúpida, però segueixo la primera regla de l’enginyeria:

Si és estúpid, però funciona … no és estúpid

Pas 10: instruccions d'ús

Instruccions d'ús
Instruccions d'ús

Podeu comprovar l'estat actual de la taula de kickers al canal Slack creat escrivint l'ordre "status" (o en breu "st") o comprovar directament els semàfors del dispositiu.

Si només voleu jugar, premeu el botó vermell. El missatge s’enviarà al canal Slack amb la informació que ocupa la taula kicker. Quan hàgiu acabat de jugar, premeu el botó verd. El missatge s’enviarà al canal Slack amb la informació que indica que el kicker table és lliure de jugar.

Els semàfors també canviaran i la pantalla LCD mostrarà informació detallada.

Per si us oblideu de deixar anar la taula després d’haver acabat de jugar, hi ha un temps d’espera establert a 20 minuts. Si encara jugueu i necessiteu més temps, torneu a prémer el botó vermell i el partit s’ampliarà 5 minuts (només s’aplicarà quan quedin menys de 5 minuts abans del temps mort). El temps d'espera de reproducció es mostrarà a la pantalla LCD.

Per reservar la taula de kickers, escriviu un missatge de "reserva" (o simplement: "res") al canal Slack.

El semàfor groc s’encendrà informant a altres persones que hi ha a prop de la taula de kickers que està reservat i que aviat algú vindrà a jugar.

El temps d'espera de la reserva s'estableix en 3 minuts. Després d’això, la taula kicker canvia el seu estat a lliure per jugar.

Si ho necessiteu, podeu cancel·lar la reserva escrivint "cancel·lar" al canal Slack.

El sistema també té algunes altres funcions menors com:

  • Després de la reserva, els botons es congelen durant 5 segons. Això és així per prevenir situacions, que just al mateix temps algú es reserva i un mil·lisegon després algú prem el botó vermell pensant que Ell / Ella és qui ocupa la taula però sense saber que algú ha reservat la taula només un mil·lisegon abans.
  • Si premeu qualsevol botó, els dos es congelaran durant mig segon. Això és així per evitar clics de botons esbojarrats, de manera que el canal Slack no serà tan brossa com a correu brossa.
  • La versió gratuïta de Slack permet emmagatzemar 10.000 missatges de tot l’equip. Per conservar alguns dels missatges, el servei elimina els missatges antics relacionats amb el sistema de reserva / estat) i només en conserva els darrers 6. Per què 6? Perquè la majoria de vegades hi ha dos escenaris d'estat: "Reserved-Occupied-Free" i "Occupied-Free". Així, el sistema pot emmagatzemar almenys dues sessions completes sense ocupar. Per netejar tots els missatges del sistema, escriviu l'ordre "clean" (o "clear").

Pas 11: Alliberament

Alliberament
Alliberament
Alliberament
Alliberament

Fins ara (el moment de publicar aquesta informació instructiva), el sistema funciona durant més de 2,5 mesos i és utilitzat per més de 30 persones. A causa de l’actualització de l’estat de la taula de kickers, sempre sabem quan està lliure o ocupada, de manera que ja no perdem temps per anar endavant i enrere. La connexió i el servei són molt estables, de manera que podem confiar-hi.

Fins ara, tot bé…

Pas 12: PMF

Per què el temps d'espera de reserva s'estableix en 3 minuts?

3 minuts és el temps màxim de reserva. Adopteu-lo com vulgueu al codi. En general poques vegades succeirà, passaran 3 minuts complets i la reserva s’espera. En la majoria dels casos, algú vindrà eventualment i ocuparà la taula.

Per què el temps d'espera de reproducció s'estableix a 20 minuts?

Depenent dels jugadors, el temps mitjà de joc és de ~ 10 minuts. Si heu de jugar més temps, torneu a prémer el botó vermell quan falten menys de 5 minuts i el temps d'espera es perllongarà fins a 5 minuts. Aquest temps d'espera està configurat per si algú s'oblida de deixar anar la taula.

Per què no hi ha cap teclat PIN al dispositiu per confirmar la reserva? sense connexions i contrasenyes?

La idea principal era mantenir-ho-simple-estúpid. En cas contrari, si la reserva, iniciar i acabar el joc necessita massa esforç, ningú voldrà utilitzar-lo.

Per què el dispositiu sembla tan industrialment lleig?

Com que no tenia tallador làser, impressora CNC, impressora 3D, fabricant d'etiquetes de colors de luxe, etc. Està encantat de millorar-lo i fer-lo més bonic.

Per què no només implementeu alguna aplicació i enganxeu la tauleta barata a la paret amb la mateixa funcionalitat?

Aplicacions, aplicacions a tot arreu. A la gent li agrada interactuar físicament amb les coses i no només toquen les pantalles planes.

Recomanat: