Olá! Bem-vindos ao

Projeto Futuro

Conheça o nosso projeto.

Projeto
  • Robson Paulo

    Host
  • Lucas Nunes

    Developer
  • Guilherme Giovannini

    Designer

Resumo do projeto

Projeto de um painel informativo para estabelecimentos

Desenvolvido em wiring, o projeto Futuro consiste em um protótipo de um painel informativo para estabelecimentos comerciais que possuam diversos caixas. Utilizando um módulo ESP32, combinado à duas protoboards, um display LCD 16x2 I2C, buzzer e alguns cabos, criamos um painel informativo que indica qual caixa está livre, seguido de uma sequência de tons musicais reproduzidos pelo buzzer. Tudo isso é feito remotamente por mensagens que são transmitidas via protocolo MQTT.

Componentes Utilizados Componentes

ESP32

Microcontrolador versátil, de baixo custo e baixo consumo de energia.

Protoboard

Placa que possui furos e conexões para montagem de circuitos.

Display LCD

Display LCD I2C, de tamanho 16 colunas x 2 linhas.

Buzzer

Buzzer é um dispositivo para geração de sinais sonoros (beeps).

Cabos

Cabos jumper fêmea-fêmea, para efetuar as conexões.

Programação do Projeto Códigos

Componentes

Display LCD

                                        
//Inclui a biblioteca do display lcd
#include LiquidCrystal_I2C.h

//Define o display
LiquidCrystal_I2C lcd(0x27, 16, 2);

//Limpa o display e deixa em modo espera
void resetaDisplay(void){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Aguarde um Caixa");
  lcd.setCursor(2,1);
  lcd.print("Ficar Livre!");
}

//Imprime no display qual caixa está livre
if (msg.equals("1")){
    caixaLivre = 1;
    // Imprime a mensagem na tela LCD
    lcd.clear();
    lcd.setCursor(2,0);
    lcd.print("Caixa Livre: ");
    lcd.setCursor(0,1);
    lcd.print("Caixa: ");
    lcd.print(caixaLivre);
}else if (msg.equals("2")){
    caixaLivre = 2;
    //imprime a mensagem na tela LCD
    lcd.clear();
    lcd.setCursor(2,0);
    lcd.print("Caixa Livre: ");
    lcd.setCursor(0,1);
    lcd.print("Caixa: ");
    lcd.print(caixaLivre);
}

void setup(){
  // Inicializa o monitor LCD
  lcd.init();
  // Imprime a mensagem de inicialização do display
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print("Bem-Vindo!");
  lcd.setCursor(1,1);
  lcd.print("Mercado Futuro");
  delay(300);
}

void loop(){
  //Reseta o display
  resetaDisplay();
}
                                        
                                      

Buzzer

                                        
//Inclui a biblioteca de manipulação do buzzer
#include PubSubClient.h

// Define o PIN do buzzer
#define BUZZER 23

void setup(){
  // Configura as funcionalidades do buzzer
  ledcSetup(3, 8000, 12);
  // Acopla o pino do buzzer
  ledcAttachPin(BUZZER, 3);
}

// Toca o som do caixa
ledcWriteTone(3, 500);
delay(600);
ledcWriteTone(3,400);
delay(600);
ledcWriteTone(3,300);
delay(600);
ledcWriteTone(3, 0);
                                        
                                      

Conexão

WiFi

                                        
//Inclui a biblioteca de wifi
#include WiFi.h

// ID e Senha do WiFi
const char *SSID = "Wokwi-GUEST"; // SSID / nome da rede WI-FI que deseja se conectar
const char *PASSWORD = "";        // Senha da rede WI-FI que deseja se conectar

/* Inicializa e conecta-se na rede WI-FI desejada */
void initWiFi(void)
{
  delay(10);
  Serial.println("------Conexao WI-FI------");
  Serial.print("Conectando-se na rede: ");
  Serial.println(SSID);
  Serial.println("Aguarde");

  reconnectWiFi();
}

/* Verifica o estado das conexões WiFI e ao broker MQTT.
  Em caso de desconexão (qualquer uma das duas), a conexão é refeita. */
void checkWiFIAndMQTT(void)
{
  if (!MQTT.connected())
    reconnectMQTT(); // se não há conexão com o Broker, a conexão é refeita

  reconnectWiFi(); // se não há conexão com o WiFI, a conexão é refeita
}

void reconnectWiFi(void)
{
  // se já está conectado a rede WI-FI, nada é feito.
  // Caso contrário, são efetuadas tentativas de conexão
  if (WiFi.status() == WL_CONNECTED)
    return;

  WiFi.begin(SSID, PASSWORD); // Conecta na rede WI-FI

  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print(".");
  }

  Serial.println();
  Serial.print("Conectado com sucesso na rede ");
  Serial.print(SSID);
  Serial.println("IP obtido: ");
  Serial.println(WiFi.localIP());
}

void setup(){
  // Inicializa a conexao Wi-Fi
  initWiFi();
}

void loop(){
    // Verifica o funcionamento das conexões WiFi e ao broker MQTT
    checkWiFIAndMQTT();
}
                                        
                                      

MQTT

                                        
//Topico do MQTT
#define TOPIC_SUBSCRIBE_LCD "topico_caixa"
//Tempo de espera para verificar novas mensagens
#define PUBLISH_DELAY 3500
//Define o ID do MQTT
#define ID_MQTT "painelCaixa"

// URL do broker MQTT que se deseja utilizar
const char *BROKER_MQTT = "broker.mqttdashboard.com";

 // Porta do Broker MQTT
int BROKER_PORT = 1883;

//define o tempo de leitura das publicações
unsigned long publishUpdate;

/* Inicializa os parâmetros de conexão MQTT(endereço do broker, porta e seta
  função de callback) */
void initMQTT(void)
{
  MQTT.setServer(BROKER_MQTT, BROKER_PORT); // Informa qual broker e porta deve ser conectado
  MQTT.setCallback(callbackMQTT);           // Atribui função de callback (função chamada quando qualquer informação de um dos tópicos subescritos chega)
}

/* Função de callback  esta função é chamada toda vez que uma informação
   de um dos tópicos subescritos chega */
void callbackMQTT(char *topic, byte *payload, unsigned int length)
{
  String msg;

  // Obtem a string do payload recebido
  for (int i = 0; i < length; i++) {
    char c = (char)payload[i];
    msg += c;
  }

  Serial.printf("Chegou a seguinte string via MQTT: %s do topico: %s\n", msg, topic);

/* Reconecta-se ao broker MQTT (caso ainda não esteja conectado ou em caso de a conexão cair)
   em caso de sucesso na conexão ou reconexão, o subscribe dos tópicos é refeito. */
void reconnectMQTT(void)
{
  while (!MQTT.connected()) {
    Serial.print("* Tentando se conectar ao Broker MQTT: ");
    Serial.println(BROKER_MQTT);
    if (MQTT.connect(ID_MQTT)) {
      Serial.println("Conectado com sucesso ao broker MQTT!");
      MQTT.subscribe(TOPIC_SUBSCRIBE_LCD);
    } else {
      Serial.println("Falha ao reconectar no broker.");
      Serial.println("Nova tentativa de conexao em 2 segundos.");
      delay(2000);
    }
  }
}

/* Verifica o estado das conexões WiFI e ao broker MQTT.
  Em caso de desconexão (qualquer uma das duas), a conexão é refeita. */
void checkWiFIAndMQTT(void)
{
  if (!MQTT.connected())
    reconnectMQTT(); // se não há conexão com o Broker, a conexão é refeita

  reconnectWiFi(); // se não há conexão com o WiFI, a conexão é refeita
}

void setup(){
  // Inicializa a conexao Wi-Fi
  initWiFi();

  // Inicializa a conexao ao broker MQTT
  initMQTT();
}

void loop(){
  //Função que verifica se o tempo de espera foi suprido
  if ((millis() - publishUpdate) >= PUBLISH_DELAY) {
    publishUpdate = millis();

    // Verifica o funcionamento das conexões WiFi e ao broker MQTT
    checkWiFIAndMQTT();

        // Keep-alive da comunicação com broker MQTT
    MQTT.loop();
  }
}
                                        
                                      

Galeria do Projeto Galeria

Módulo ESP32
Visualizar
Placa Protoboard
Visualizar
Display LCD 16x2 (I2C)
Visualizar
Buzzer
Visualizar
Projeto Montado
Visualizar