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.
Microcontrolador versátil, de baixo custo e baixo consumo de energia.
Placa que possui furos e conexões para montagem de circuitos.
Display LCD I2C, de tamanho 16 colunas x 2 linhas.
Buzzer é um dispositivo para geração de sinais sonoros (beeps).
Cabos jumper fêmea-fêmea, para efetuar as conexões.
//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();
}
//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);
//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();
}
//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();
}
}
© Copyright 2022 | Developed by Guilherme Giovannini | All rights reserved