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.


Nenhum comentário:

Postar um comentário