Índice:

Status simples do Kicker e sistema de reservas com integração Slack: 12 etapas (com imagens)
Status simples do Kicker e sistema de reservas com integração Slack: 12 etapas (com imagens)
Anonim
Status simples do kicker e sistema de reserva com integração Slack
Status simples do kicker e sistema de reserva com integração Slack

Na empresa onde trabalho existe uma mesa de kicker. A empresa ocupa muitos andares e para alguns dos funcionários demora até 3 minutos para chegar à mesa e… perceber que a mesa já está ocupada.

Portanto, surgiu a ideia de construir uma espécie de sistema simples de transmissão e reserva de status, que opera em tempo real.

A empresa usa a ferramenta de comunicação Slack onde cada funcionário tem uma conta. Temos até um canal #kicker apenas para discussões sobre … kicker. O canal pode ser utilizado como uma espécie de “ponto de entrada” para reservas e para ser informado sobre o estado da mesa atual.

Como de costume, existem muitos conceitos sobre como lidar com esse sistema. Mas, geralmente, uma regra básica apareceu em todos eles: tem que ser simples de usar, sem etapas excessivas a serem executadas ao lidar com o sistema.

O dispositivo e o serviço não são fixados na tabela de kicker e podem ser usados para qualquer "recurso comum" (como mesa de pingue-pongue, console, etc …) que precisa de algum tipo de solução de reserva e transmissão de status.

Então vamos começar…

Etapa 1: Prova de conceito e prototipagem

Prova de conceito e prototipagem
Prova de conceito e prototipagem
Prova de conceito e prototipagem
Prova de conceito e prototipagem
Prova de conceito e prototipagem
Prova de conceito e prototipagem

Raughly a ideia era construir um dispositivo que será colocado ao lado da mesa do kicker seguindo estes requisitos:

  • alguns indicadores sobre o estado atual da mesa - se você estiver ao lado dela, você deve saber se ela está livre ou reservada e alguém virá jogar em 3 minutos. Os semáforos se adaptam perfeitamente à ideia:

    • luz verde - grátis para jogar,
    • luz amarela - reservada,
    • luz vermelha - ocupada.
  • botão (s) Você pode clicar antes e depois do jogo para que todos sejam informados sobre o status da mesa atual. Em vez de 1 botão de alternância, decidi usar 2 botões separados:

    • botão vermelho - ocupar a mesa, iniciar um jogo (após reserva ou ad hoc).
    • botão verde - mesa de liberação.
  • alguns exibem informações mais detalhadas sobre "o que está acontecendo" - tempo limite de reserva, status de mesa repetida, tempo limite de jogo etc …

Por reserva, quero dizer apenas a reserva para os próximos 3 minutos. O sistema não foi projetado para que o usuário possa reservar a mesa no horário exato (por exemplo, 14h). Não funciona como reserva, por exemplo em restaurantes, mas apenas por alguns minutos.

Por causa da falta de conexão LAN, a única opção é usar WLAN - é a melhor opção de qualquer maneira. O cérebro do sistema deve usar a API Slack para enviar e receber comandos do canal Slack. Primeiro tentei usar o NodeMCU. Consegui obter e receber mensagens de e para o Slack, mas devido ao uso de HTTPS e também ao tamanho da "mensagem de boas-vindas" do Slack (~ 300kB), o NodeMCU estava perdendo a conexão e / ou teve alguma exceção estranha que não consegui resolver vasculhando na Internet.

Então decidi usar algo mais poderoso: Raspberry Pi 3 (Zero W com WiFi ainda não havia sido lançado naquela época). Com o RPi, pude mudar a linguagem de implementação de C para Java, pois é mais conveniente para mim - isso foi uma vantagem. Hoje você pode usar algo mais poderoso do que NodeMCU e menos poderoso do que RPi. Raspberry Zero, talvez?

Depois de construir o primeiro protótipo em uma placa de ensaio com alguns fios malucos, muitos esboços e protótipos, o sistema parecia que poderia funcionar.

Tendo todas essas idéias e PoC trabalhando, comecei a planejar diferentes configurações de posicionamento dos itens acima em um painel frontal para que sejam mais informativos e convenientes de usar. Você pode verificar algumas das outras propostas, talvez algumas se ajustem melhor a você. O último foi o escolhido por mim.

Etapa 2: Materiais e Ferramentas

Materiais que usei:

  • Caixa
  • Raspberry Pi, cartão microSD, fonte de alimentação micro USB
  • Botões de arcade verde e vermelho
  • Tela LCD 16x2
  • LEDs - Usei RGB, mas você pode usar a cor adequada
  • Cabos de jumper da placa de ensaio macho para fêmea e fêmea para fêmea
  • Interface micro USB
  • Mini breadboard apenas para conectar alguns fios
  • Cabo micro USB curto funcionando como um jumper dentro da caixa para alimentar o RPi

Ferramentas que usei:

  • Faca afiada (por exemplo, faca para cortar carpete)
  • Ferramenta rotativa
  • Pistola de cola quente
  • Estação de solda
  • Alicates, alicates diagonais / cortadores laterais
  • Chave de fenda
  • Arquivo
  • Mim

Ferramentas de que você provavelmente precisa:

Todas as opções acima, mas em vez de "Eu", deveria ser: "Você":)

Etapa 3: Painel frontal - tela LCD

Painel Frontal - Tela LCD
Painel Frontal - Tela LCD
Painel Frontal - Tela LCD
Painel Frontal - Tela LCD

O furo para a tela LCD era simples. Apenas um retângulo que cabe na minha tela LCD. Depois de tentar cortá-lo com uma faca afiada, percebi que o plástico da caixa é bem duro. Usei uma ferramenta de perfuração para cortar a janela e polir as bordas.

Etapa 4: Painel frontal - LEDs de status

Painel frontal - LEDs de status
Painel frontal - LEDs de status
Painel frontal - LEDs de status
Painel frontal - LEDs de status

Os orifícios para LED também são simples. Peguei uma furadeira grande para fazer madeira e poli as bordas com uma ferramenta de perfuração. Os grandes LEDs se encaixaram perfeitamente. Ainda não soldei nenhum resistor aos LEDs - deixei para o processo de montagem.

Etapa 5: Painel frontal - botões

Painel Frontal - Botões
Painel Frontal - Botões
Painel Frontal - Botões
Painel Frontal - Botões
Painel Frontal - Botões
Painel Frontal - Botões
Painel Frontal - Botões
Painel Frontal - Botões

O maior problema com esses 2 botões grandes era colocá-los uniformemente com o espaçamento adequado. Eu cortei os furos usando apenas minha ferramenta de perfuração, pois poderia aumentar o diâmetro passo a passo para que os botões ficassem firmes.

Etapa 6: Conector de alimentação

Conector de força
Conector de força

Um pequeno orifício para alimentação do micro USB foi um trabalho muito delicado de se fazer. Queria que o furo fosse o mais adequado possível, por isso passei muito tempo aqui a polir. Mas fiquei satisfeito com o resultado final.

Então cortei um cabo mini USB curto que foi colocado dentro da caixa. De um lado, ele é conectado a RPi e, do outro, todos os cabos foram soldados à interface micro USB de acordo com a pinagem USB.

Em seguida, colei o pequeno PCB diretamente na caixa (pode ser visto em uma foto na etapa de montagem).

Etapa 7: juntando tudo

Juntando tudo
Juntando tudo
Juntando tudo
Juntando tudo
Juntando tudo
Juntando tudo

Primeiro, soldei resistores apropriados aos LEDs de acordo com sua cor (voltagem) para 3,3V volt. Usei 100Ω para vermelho, dois resistores 82 e 100 para amarelo (nó verde e vermelho) e 100Ω para verde. Você pode usar um do resistor online para calculadora LED. Mas, por favor, faça uma pesquisa por conta própria de acordo com o brilho e o tom de cor exato que deseja alcançar.

Pernas de LED amarelo foram soldadas juntas para que o próprio LED possa ser controlado apenas por um pino no RPi.

De acordo com este diagrama de pinagem:

Os nós de LED foram conectados:

  • LED verde - GPIO1 em Rpi
  • LED amarelo (ambas as pernas) para GPIO2 no RPi
  • LED vermelho para GPIO0 no RPi

Eu conectei o LCD usando pinos I2C em pinos RPi

  • LCD SDA para GPIO8 no RPi
  • LCD SCL para GPIO9 em RPi
  • LCD PWR para 5V no RPi
  • LCD GND para GND em RPi

O LCD foi colado a quente na caixa como proteção adicional.

Liguei 3,3V e GND à pequena placa de ensaio para poder usá-los como botões.

O botão verde foi conectado ao 3.3V através do mini breadboard e ao GPIO5 no RPi.

O botão vermelho foi conectado ao 3.3V através do mini breadboard e ao GPIO4 no RPi.

Portanto, sempre que você pressiona o botão, há um estado alto no pino RPi.

O mini bradboard funciona bem, então pulei a soldagem de todos os fios no PCB. Em vez disso, apenas cobri a mini placa de ensaio com cola quente para que os cabos não caíssem.

Eu também colei a tampa de RPi com cola quente na caixa para que ela não balançasse por dentro.

Eu parafusei o painel frontal com todas as coisas dentro.

Em seguida, imprimi, cortei e colei etiquetas simples ao lado dos semáforos e botões.

Etapa 8: Configuração do Slack

Configuração do Slack
Configuração do Slack
Configuração do Slack
Configuração do Slack

Crie sua equipe no Slack.com ou use aquela que você tem e que tenha pelo menos direitos de administrador.

No Slack, crie um canal para integração do serviço com o Slack (ou pule a criação de um canal se quiser usar um que já tenha).

Adicione integração de Webhooks Incomming à sua equipe. Selecione o canal e copie o URL do webhook.

Adicione integração de Bots à sua equipe. Escolha algum nome para Seu bot e copie o token da API do bot.

A página de gerenciamento de integrações personalizadas deve ter a aparência da imagem.

Você tem que convidar o bot como membro do seu canal. Você já poderia fazer isso durante a criação de um canal.

Se você quiser personalizar o serviço mais tarde, verifique a API do Slack.

Etapa 9: Implementação de Software

Usei Raspbian como sistema operacional para meu RPi seguindo este tutorial. Por favor, me perdoe, vou pular a explicação, pois já está documentado em muitos lugares e o processo é simples. Espero que você seja qualificado e experiente o suficiente para gerenciar a configuração do RPi por conta própria. Não se esqueça de configurar o acesso Wi-Fi no seu Raspberry Pi;)

Conforme mencionado na seção de prototipagem, usei Java para implementar o cérebro de todo o sistema. O código está disponível no GitHub -

As bibliotecas Java que usei:

  • pi4j - para usar Raspberry Pi de Java
  • Springboot como uma plataforma de aplicativo
  • allbegray / slack-api como integração do Slack

Você precisa editar o arquivo de configuração em src / resources / config.properties. Existem 3 entradas que você deve configurar para usar a API Slack:

  • channelName - nome do canal. Você deseja postar mudanças de status e receber comandos.
  • slackBotToken - token de um bot configurado nas integrações de sua equipe do Slack que será usado para postar mensagens no canal mencionado acima. Observe que você deve adicionar o Slack Bot como membro do canal.
  • webhookUrl - o URL que você pode obter nas integrações personalizadas do Slack Team.

O projeto é Mavenizado, portanto, para compilá-lo, basta digitar (você precisa de pelo menos Java 8 e Maven instalados):

pacote limpo mvn

E na tiretória de destino, você pode encontrar o arquivo JAR do Springbooted. Para iniciar um serviço:

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

Eu defini esta linha como.sh script e o adicionei como um autostart. Portanto, sempre que a energia está ligada, o serviço é inicializado automaticamente.

É necessária uma explicação especial para o LCD.

Tentei diferentes abordagens / bibliotecas para controlar o LCD sobre I2C do RPi, mas não consegui. Para alguns, o LCD não estava funcionando corretamente, para alguns estava exibindo um pouco de lixo.

Mas uma coisa estava funcionando muito bem fora da caixa. É a ferramenta de linha de comando do utilitário que descobri que você pode usar para controlar o LCD. Então decidi usar essa ferramenta diretamente do Java. Funciona assim que um processo normal do Linux (lcdi2c) é chamado (com parâmetros preparados) toda vez que eu quero exibir algo na tela LCD.

Você precisa baixar a ferramenta e colocá-la ao lado do serviço JAR

Usar esta ferramenta é uma espécie de hack e solução estúpida, mas eu sigo a 1ª regra da engenharia:

Se é estúpido, mas funciona … não é estúpido

Etapa 10: Instrução de uso

Instrução de uso
Instrução de uso

Você pode verificar o status atual da tabela de kicker no canal Slack criado digitando o comando "status" (ou logo "st") ou verificar diretamente os semáforos no dispositivo.

Se você quiser apenas jogar - pressione o botão vermelho. A mensagem será enviada para o canal do Slack com informações de que a mesa de kicker está ocupada. Quando terminar de jogar - pressione o botão verde. A mensagem será enviada para o canal do Slack com informações de que a mesa de kicker está livre para jogar.

Os semáforos também mudarão e a tela LCD mostrará algumas informações detalhadas.

Caso você se esqueça de liberar a mesa depois de terminar de jogar, há um tempo limite definido para 20 minutos. Se você ainda estiver jogando e precisar de mais tempo, pressione o botão vermelho novamente e a partida será prolongada por 5 minutos (aplica-se apenas quando faltam menos de 5 minutos para o tempo limite). O tempo limite de reprodução será apresentado na tela LCD.

Para reservar a mesa de kicker, escreva uma mensagem „reserve” (ou apenas: „res”) para o canal Slack.

O semáforo amarelo acenderá informando aos outros próximos à mesa de kicker que ela está reservada e logo alguém virá jogar.

O tempo limite de reserva é definido para 3 minutos. Depois disso, a mesa de kicker muda seu estado para livre para jogar.

Se precisar, você pode cancelar a reserva escrevendo “cancel” no canal Slack.

O sistema também possui alguns outros recursos menores, como:

  • Após a reserva, os botões ficam congelados por 5 segundos. Isto é para prevenir situações, que ao mesmo tempo alguém reserva e um milissegundo depois alguém aperta o botão vermelho pensando que é Ele / Ela quem está ocupando a mesa mas sem saber que alguém reservou a mesa apenas um milissegundo antes.
  • Pressionar qualquer botão congela os dois por meio segundo. Isso evita cliques malucos de botões para que o canal do Slack não receba muito spam.
  • A versão gratuita do Slack permite armazenar 10.000 mensagens de toda a equipe. Para preservar algumas das mensagens, exclua as mensagens antigas relacionadas ao sistema de reserva / status e mantenha apenas as 6 últimas. Por que 6? Porque na maioria das vezes há 2 cenários de status: "Reservado-Ocupado-Livre" e "Ocupado-Livre". Assim, o sistema pode armazenar pelo menos 2 sessões livres ocupadas completas. Para limpar todas as mensagens do sistema, digite o comando "clean" (ou "clear").

Etapa 11: Liberando

Liberando
Liberando
Liberando
Liberando

Até agora (o momento da publicação deste instrutível), o sistema está funcionando por mais de 2,5 meses e é usado por mais de 30 pessoas. Por causa da atualização do status da tabela de kicker, sempre sabemos quando ela está livre ou ocupada, então não perdemos mais tempo indo e voltando. A conexão e o serviço são muito estáveis, então podemos contar com isso.

Até agora tudo bem…

Etapa 12: FAQ

Por que o tempo limite da reserva está definido para 3 minutos?

3 minutos é o tempo máximo de reserva, adote-o como quiser no código. Geralmente isso raramente acontecerá, que 3 minutos completos passarão e a reserva será expirada. Na maioria dos casos, alguém virá eventualmente e ocupará a mesa.

Por que o tempo limite de reprodução está definido para 20 minutos?

Dependendo do jogador, o tempo médio de jogo é de aproximadamente 10 minutos. Se precisar jogar por mais tempo, pressione o botão vermelho novamente quando faltarem menos de 5 minutos e o tempo limite será estendido para 5 minutos. Este tempo limite é configurado para o caso de alguém se esquecer de liberar a mesa.

Por que não há PIN pad no dispositivo para confirmar a reserva; sem logins e senhas?

A ideia principal era manter as coisas simples e estúpidas. Caso contrário, se a reserva, o início e o término do jogo exigirem muito esforço, ninguém vai querer usá-lo.

Por que o dispositivo parece tão feio industrialmente?

Porque eu não tinha cortador a laser, CNC, impressora 3D, fabricante de etiquetas coloridas, etc. Você está mais do que satisfeito em melhorá-lo e torná-lo mais bonito.

Por que não implementar um aplicativo e colar um tablet barato na parede com a mesma funcionalidade?

Aplicativos, aplicativos em todos os lugares. As pessoas gostam de interagir fisicamente com as coisas e não apenas tocar em telas planas.

Recomendado: