//EXEMPLO COM A TAGO.IO
#include <WiFi.h>
#include <ArduinoJson.h>
#include <DHTesp.h>
#include <PubSubClient.h>
// Configurações de WiFi
const char *SSID = "Wokwi-GUEST";
const char *PASSWORD = ""; // Substitua pelo sua senha
// Configurações de MQTT
const char *BROKER_MQTT = "mqtt.tago.io";
const int BROKER_PORT = 1883;
const char *ID_MQTT = "facef_mqtt";
const char *TOPIC_SUBSCRIBE_LED = "facef/iot/led";
const char *TOPIC_PUBLISH_TEMP_HUMI = "tago/data/post";
const char *USERNAME = ""; // Deixe em branco se não for usar um nome de usuário MQTT
const char *PASSWORD_MQTT = "38482e94-1168-4c53-ae53-98ef60186e79"; // Adicione a senha aqui
const char *TOPIC_SEND_VARIABLE = "tago/data/post"; // Tópico para enviar as variáveis
// Configurações de Hardware
#define PIN_DHT 12
#define PIN_LED 15
#define PUBLISH_DELAY 2000
// Variáveis globais
WiFiClient espClient;
PubSubClient MQTT(espClient);
DHTesp dht;
unsigned long publishUpdate = 0;
TempAndHumidity sensorValues;
const int TAMANHO = 200;
int valorLed = 0;
// Protótipos de funções
void updateSensorValues();
void initWiFi();
void initMQTT();
void callbackMQTT(char *topic, byte *payload, unsigned int length);
void reconnectMQTT();
void reconnectWiFi();
void checkWiFIAndMQTT();
void updateSensorValues() {
sensorValues = dht.getTempAndHumidity();
}
void initWiFi() {
Serial.print("Conectando com a rede: ");
Serial.println(SSID);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println();
Serial.print("Conectado com sucesso: ");
Serial.println(SSID);
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
void initMQTT() {
MQTT.setServer(BROKER_MQTT, BROKER_PORT);
MQTT.setCallback(callbackMQTT);
}
void callbackMQTT(char *topic, byte *payload, unsigned int length) {
String msg = String((char*)payload).substring(0, length);
StaticJsonDocument<TAMANHO> json;
DeserializationError error = deserializeJson(json, msg);
if (error) {
Serial.println("Falha na deserialização do JSON.");
return;
}
if (json.containsKey("led")) {
valorLed = json["led"];
if (valorLed == 1) {
digitalWrite(PIN_LED, HIGH);
Serial.println("LED ligado via comando MQTT");
} else if (valorLed == 0) {
digitalWrite(PIN_LED, LOW);
Serial.println("LED desligado via comando MQTT");
}
}
}
void reconnectMQTT() {
while (!MQTT.connected()) {
Serial.print("Tentando conectar com o Broker MQTT: ");
Serial.println(BROKER_MQTT);
if (MQTT.connect(ID_MQTT, USERNAME, PASSWORD_MQTT)) {
Serial.println("Conectado ao broker MQTT!");
MQTT.subscribe(TOPIC_SUBSCRIBE_LED);
} else {
Serial.println("Falha na conexão com MQTT. Tentando novamente em 2 segundos.");
delay(2000);
}
}
}
void checkWiFIAndMQTT() {
if (WiFi.status() != WL_CONNECTED) reconnectWiFi();
if (!MQTT.connected()) reconnectMQTT();
}
void reconnectWiFi(void)
{
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("Wifi conectado com sucesso");
Serial.print(SSID);
Serial.println("IP: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
pinMode(PIN_LED, OUTPUT);
digitalWrite(PIN_LED, LOW);
dht.setup(PIN_DHT, DHTesp::DHT22);
initWiFi();
initMQTT();
}
void loop() {
checkWiFIAndMQTT();
MQTT.loop();
if ((millis() - publishUpdate) >= PUBLISH_DELAY) {
publishUpdate = millis();
updateSensorValues();
if (!isnan(sensorValues.temperature) && !isnan(sensorValues.humidity) && !isnan(valorLed)) {
// Enviar umidade
StaticJsonDocument<TAMANHO> doc_umidade;
doc_umidade["variable"] = "umidade";
doc_umidade["unit"] = "percent";
doc_umidade["value"] = sensorValues.humidity;
char buffer_umidade[TAMANHO];
serializeJson(doc_umidade, buffer_umidade);
MQTT.publish(TOPIC_SEND_VARIABLE, buffer_umidade);
Serial.println(buffer_umidade);
// Enviar temperatura
StaticJsonDocument<TAMANHO> doc_temperatura;
doc_temperatura["variable"] = "temperatura";
doc_temperatura["unit"] = "º Celsius";
doc_temperatura["value"] = sensorValues.temperature;
char buffer_temperatura[TAMANHO];
serializeJson(doc_temperatura, buffer_temperatura);
MQTT.publish(TOPIC_SEND_VARIABLE, buffer_temperatura);
Serial.println(buffer_temperatura);
// Enviar led
StaticJsonDocument<TAMANHO> doc_led;
doc_led["variable"] = "led";
doc_led["unit"] = "";
doc_led["value"] = valorLed;
char buffer_led[TAMANHO];
serializeJson(doc_led, buffer_led);
MQTT.publish(TOPIC_SEND_VARIABLE, buffer_led);
Serial.println(buffer_led);
}
}
}