31 maio 2018

Sistema Chama Garçom com Arduino e módulo RF 433MHz

Faz tempo que o módulo RF 433MHz não aparece aqui no blog. Mais precisamente desde abril de 2015, quando eu escrevi o post Comunicação sem fio com módulo RF 433MHz. Então hoje vamos aproveitar e usar o módulo para criar um Sistema Chama Garçom com Arduino.

Chama Garçom com Arduino e modulo RF 433 MHz

Mas o que é um Chama Garçom?

O Chama Garçom


O Chama Garçom (também conhecido como "Chama Atendente", "Smart Call", "Garçom Eletrônico" e outros nomes) é aquele sistema que você encontra em cafés, bares, restaurantes e afins, que nada mais é do que um botão que fica (geralmente) em cima da sua mesa, você aperta, e o número da sua mesa aparece em um painel, avisando o pessoal do estabelecimento que você deseja alguma coisa.

Painel Chama Garçom
Imagem: www.valrem.com.br

É um sistema muito prático, já que você não precisa chamar (gritar?) ou ficar esperando que o atendente olhe para você para fazer o seu pedido. Simplesmente aperte o botão e aguarde o atendimento. Fácil, não?

Nós vamos montar um Chama Garçom com Arduino e módulo RF 433MHz, mostrando o número da mesa em um display Oled. O circuito pode ser usado também para cuidadores, em asilos, hospitais, controle de alunos, jogos, etc.

Chama Garçom com Arduino e módulo RF 433MHz


Vamos montar o nosso Chama Garçom utilizando módulos RF Transmissor e Receptor 433MHz, mas com 2 emissores (que seriam colocados nas mesas) e 1 receptor (no balcão de atendimento). Se você precisar de mais emissores, verá que expandir o sistema é bem fácil.

O material que vamos usar é o seguinte:

Com o material em mãos, vamos montar primeiro o circuito receptor.

Circuito Receptor RF


O circuito receptor será o responsável por "escutar" a frequência de 433MHz e, caso receba informações de um dos emissores, mostrar o número da mesa no display Oled. Monte o circuito abaixo, com o pino de dados do módulo RF conectado ao pino digital 7, e os pinos SDA e SCL do display conectados nas portas A4 e A5, respectivamente, que são os pinos da interface I2C do Arduino Uno:


Circuito Arduino com modulo RF 433 MHz Receptor

Fique atento apenas às conexões do Vcc e GND do display Oled, já que alguns podem vir com a pinagem invertida, ok?

Programa Receptor RF


O programa vai utilizar as bibliotecas u8glib e VirtualWire. A u8glib pode ser instalada à partir da própria IDE do Arduino, no menu Sketch -> Incluir Biblioteca -> Gerenciar Bibliotecas:

Biblioteca u8glib Arduino

Já a biblioteca VirtualWire você encontra neste link. Descompacte o arquivo e coloque a pasta VirtualWire dentro da pasta LIBRARIES da IDE do Arduino.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//Programa: Chama Garcom com Arduino e Modulo RF 433MHz - Receptor
//Autor: Arduino e Cia

#include <VirtualWire.h>
#include <U8glib.h>

//Definicoes do display Oled
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_FAST);

//Armazena o numero da mesa que esta chamando
int mesa_chamando;
char recebido_RF_char[4];

void draw()
{
  //Comandos graficos para o display devem ser colocados aqui
  u8g.setFont(u8g_font_fub14);
  u8g.drawRFrame(0, 0, 128, 63, 4);
  u8g.drawStr(35, 19, "MESA");
  u8g.setPrintPos(55, 31);
  u8g.setFont(u8g_font_fub30);
  u8g.setPrintPos(55, 57);
  u8g.print(mesa_chamando);
}

void setup()
{
  Serial.begin(9600);

  //Pino ligado ao pino DATA do receptor RF
  vw_set_rx_pin(7);
  //Velocidade de comunicacao (bits por segundo)
  vw_setup(5000);
  //Inicia a recepcao
  vw_rx_start();
  Serial.println("Modulo Receptor Chama Garcom - Aguardando...");

  //Display Oled
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);         // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255, 255, 255);
  }
}

void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  u8g.firstPage();
  if (vw_get_message(buf, &buflen))
  {
    int i;
    for (i = 0; i < buflen; i++)
    {
      //Armazena os caracteres recebidos
      recebido_RF_char[i] = char(buf[i]);
    }
    recebido_RF_char[buflen] = '\0';

    //Converte o valor recebido para integer
    mesa_chamando = atoi(recebido_RF_char);

    //Mostra no serial monitor o valor recebido
    Serial.print("A mesa ");
    Serial.print(mesa_chamando);
    Serial.println(" esta chamando!");
  }

  // Chama a rotina de desenho na tela
  do
  {
    draw();
  }
  while ( u8g.nextPage() );
}

Carregue o programa no Arduino. Como ainda não foi enviado nenhum dado para o receptor, será mostrada a informação "Mesa 0" no display.

Circuito Emissor RF


O circuito abaixo é o mesmo para os dois emissores que vamos usar. Usando a porta digital 4 do Arduino Nano vamos verificar se o botão foi pressionado, e os dados serão enviados para o módulo emissor RF 433MHz pela porta A4. Usei a porta A4 para que o circuito ficasse mais simples, mas você pode usar as outras portas do Arduino para fazer essa conexão.

Circuito Arduino com modulo RF 433 MHz Emissor

Os resistores pull-up que usei nos botões são de 1K, mas o valor não importa muito, tente adaptar aos resistores que você tem em mãos.

Programa Emissor RF


O programa é o mesmo para os dois emissores, utilizando também a biblioteca VirtualWire. A única informação que você vai alterar é o número da mesa, na linha 14 do programa.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//Programa: Chama Garcom com Arduino e Modulo RF 433MHz - Emissor
//Autor: Arduino e Cia

#include <VirtualWire.h>

//Define pinos Led e Botao
const int ledPin = 13;
const int pino_botao = 4;

int valor_botao;
char Valor_CharMsg[4]; 

//Armazena o numero da mesa
int mesa = 1;

void setup() 
{
  Serial.begin(9600);   
  pinMode(ledPin,OUTPUT);
  pinMode(pino_botao,INPUT);
  
  //Pino ligado ao pino DATA do transmissor RF
  vw_set_tx_pin(A4);
  //Velocidade de comunicacao (bits por segundo)
  vw_setup(5000);
  
  //Informacoes iniciais
  Serial.print("Voce esta na mesa ");
  Serial.print(mesa);
  Serial.println(" - Acione o botao...");
}

void loop() 
{
  //Verifica o estado do push-button
  valor_botao = digitalRead(pino_botao);
  
  //Caso o botao seja pressionado, envia dados
  if (valor_botao == 0)
  {
    //Converte valor para envio
    itoa(mesa,Valor_CharMsg,10);
    //Liga o led da porta 13 para indicar envio dos dados
    digitalWrite(13, true);
    //Envio dos dados
    vw_send((uint8_t *)Valor_CharMsg, strlen(Valor_CharMsg));
    //Aguarda envio dos dados
    vw_wait_tx();
    //Desliga o led da porta 13 ao final da transmissao
    digitalWrite(13, false);
    Serial.print("Dados enviados! Mesa ");
    Serial.print(mesa);
    Serial.println(" chamando!");
    delay(500);
  }
}

Com os programas carregados, é só usar o sistema. Se você estiver com dúvidas sobre o funcionamento, o envio de dados ou até mesmo se os botões estão funcionando corretamente, tente abrir o Serial Monitor e ver se os dados estão sendo enviados pelo emissor:

Serial Monitor Arduino - Emissor

e chegando no receptor:

Serial Monitor Arduino - Receptor

Experimente melhorar o circuito adicionando um buzzer para avisos sonoros e um sistema de "fila", no caso de várias mesas chamando ao mesmo tempo.


21 comentários:

  1. Qual o alcance obtido com estes módulos com e sem a antena?
    Grato!

    ResponderExcluir
    Respostas
    1. Oi Carlos,

      Eu testei os meus sem antena, não pega muito longe não. Recomendo que você use uma antena para melhorar o sinal.

      Abraço!

      Adilson

      Excluir
  2. ÒTIMO PROJETO! PARABÉNS.....ESTOU TERMINANDO A FATEC (AUTOMAÇÃO INDUSTRIAL) E LOGO QUE TIVER TEMPO VOU VOLTAR PARA MEU ARDUINO.

    ResponderExcluir
    Respostas
    1. Sucesso! E se precisar de ajuda estamos aí. :)

      Abraço!

      Adilson

      Excluir
  3. Quero comprar esse material vcs vendem ???

    ResponderExcluir
    Respostas
    1. Oi Roberio,

      Dê uma olhada no site da FilipeFlop, por favor. Lá eles vendem tudo o que você precisa. :)

      Abraço!

      Adilson

      Excluir
  4. Como fazer uma fila no receptor quando mais de um sinal for recebido? A idéia é só liberar para outra mesa quando aquela sinalizada tiver sido atendida.

    ResponderExcluir
    Respostas
    1. Boa noite,

      Vai ter que mexer na programação, além de incluir algum recurso (um botão?) para indicar que a mesa atual foi atendida.

      Abraço!

      Adilson

      Excluir
  5. Muito bom, mas como implementar mais de um emissor para um único receptor e só permitir a mudança no receptor após o segundo acionamento do emissor, desta forma passando para o próximo emissor que já foi acionado?

    ResponderExcluir
  6. Gostaria de comprar varias unidades, quanto custa?

    ResponderExcluir
    Respostas
    1. Oi Roberto,

      Dê uma olhada no site da FilipeFlop, por favor. Lá eles vendem tudo o que você precisa. :)

      Abraço!

      Adilson

      Excluir
  7. vc não tem um projeto de controle remoto 16 canais com Arduino?é pra acionar 16 relés via rf...

    ResponderExcluir
    Respostas
    1. Oi Aslem,

      Ainda não, mas se você precisar disso eu posso desenvolver sob encomenda. Entre em contato utilizando o formulário de contato no lado direito da página.

      Abraço!

      Adilson

      Excluir
  8. Oi preciso conversar com a pessoa que fez o projeto, temos uma proposta de parceria.

    ResponderExcluir
    Respostas
    1. Boa noite,

      Obrigado. Por favor utilize o formulário de contato no lado direito da página. Vamos conversar. ;)

      Abraço!

      Adilson

      Excluir
  9. Bom dia,
    Parabéns pelo projeto e por compartilhar o conhecimento, me tire uma dúvida posso usar um Arduíno pro mini no lugar do nano? Obrigado pela atenção.

    Jorge Sousa

    ResponderExcluir
  10. Bom dia,
    Me tire uma dúvida posso usar um Arduíno pro mini no lugar do nano? Obrigado pela atenção dispensada.

    Jorge Sousa

    ResponderExcluir