// Bibliotecas
#include <EspMQTTClient.h> // EspMQTTClient
#include <ArduinoJson.h> // ArduinoJson
/* Este programa implementa o exemplo apresentado no tutorial
"Configurando o ESP32 para trabalhar com o protocolo MQTT no
portal TAGO.IO"
link para download do tutorial:
https://tinyurl.com/45pn9yp6
O ESP32 irá publicar/monitorar o estado de 3
variáveis em 2 tópicos distintos.
- uma variável que detecta botão aberto ou fechado ESP32 >> TAGO.IO
- uma variável randômica que muda seu valor continuamente ESP32 >> TAGO.IO
- uma variável que determina se um led sera ligado ou desligado ESP32 << TAGO.IO
*/
#define SIZE_LED_TOPIC 12
#define LED_PIN 26
#define PUSH_BUTTON_PIN 32
float numeroRandom = 0.0;
DynamicJsonDocument dados(1024);
String dadosJson;
// Conexões WI-FI e MQTT
EspMQTTClient client(
"Wokwi-GUEST", //Rede wi-fi
"", // Senha wi-fi
"mqtt.tago.io", // Broker
"Default", // Usuário (qq string)
"aqui-deve-estar-o-token-gerado-na-plataforma-tago.io", // Token da plataforma Tago.io
"ESP32_Tutorial" // Identificação única (qq string)
);
// Define a função de callback associada ao delay
void delayedFunction() {
// MQTT (Publish) e controle (alteração de valores)
Serial.println("Publicando topico le_botao_push_button caso conexao OK...");
Serial.println(dadosJson);
client.publish("le_botao_pushbutton", dadosJson);
// chama novamente função de callback
client.executeDelayed(5000, delayedFunction);
}
// Setup
void setup() {
// alteração dos parâmetros default por causa das desconexões frequentes
// do wifi dummy do wokwi
client.enableMQTTPersistence();
client.setMqttReconnectionAttemptDelay(2000);
client.setWifiReconnectionAttemptDelay(3000);
client.setKeepAlive(20);
//habilita msgs de debug
client.enableDebuggingMessages(true);
client.setMaxPacketSize(256);
// delay com callback, não posso usar delay(x ms)
// devido a conexão wifi
client.executeDelayed(5000, delayedFunction);
pinMode(LED_PIN, OUTPUT);
pinMode(PUSH_BUTTON_PIN, INPUT);
Serial.begin(115200);
}
// Loop
void loop() {
client.loop();
// Insere os dados no JSON
dados[0]["variable"] = "estado_chave";
dados[0]["unit"] = "";
dados[0]["value"] = digitalRead(PUSH_BUTTON_PIN) == HIGH ? "CHAVE ABERTA" : "CHAVE FECHADA";
dados[1]["variable"] = "numero_ramdomico";
//dados[1]["unit"] = "°C";
dados[1]["unit"] = "";
dados[1]["value"] = numeroRandom;
// conversão da estrutura de dados (JSON)
serializeJson(dados, dadosJson);
numeroRandom = random(1,41) + ( 2 - random(1,4))*0.25;
}
// MQTT (Função que recebe dados do Subscribe)
void onMessageReceived(const String& msg) {
// payload sempre será a string "estado_led 0" ou "estado_led 1"
int estadoLed;
int msgLength = msg.length();
if ( msgLength == SIZE_LED_TOPIC) { // checa se tamanho string do payload é a correta
// Extrai o caracter no index 11 (assumindo space depois de '...led') e converte para inteiro
// subtraindo '0' (48)
estadoLed = msg.charAt(SIZE_LED_TOPIC-1) - '0';
if (estadoLed == 1) {
digitalWrite(LED_PIN,HIGH);
Serial.println("Led ligado por MQTT");
} else if (estadoLed == 0) {
digitalWrite(LED_PIN,LOW);
Serial.println("Led desligado por MQTT");
}
} else {
// Handle error: tamanho do payload inváldo
Serial.println("Erro: tamanho do payload invalido!");
}
}
// MQTT (Subscribe)
void onConnectionEstablished() {
Serial.println("Conexao com tago.io estabelecida, assinando topicos...");
Serial.println("Assinando o topico le_botao_pushbutton sem função de callback....");
client.subscribe("le_botao_pushbutton", [] (const String &payload) {
});
Serial.println("Assinando o topico liga_desliga_led com função de callback....");
client.subscribe("liga_desliga_led", onMessageReceived); // necessário registrar a função de callback pra tratar
}