#include <Wire.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <DHT.h>
#define ssid "Wokwi-GUEST"
#define password ""
const char *mqttBroker = "broker.hivemq.com";
WiFiClient wiFiClient;
PubSubClient mqttClient(wiFiClient);
unsigned long tempoUltimaMensagem;
#define RELAY_PIN 16
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
bool conectarWiFi()
{
Serial.println("Tentando estabelecer uma conexao com a rede Wi-Fi...");
const unsigned long tempoInicial = millis();
WiFi.begin(ssid, password);
do
{
if (WiFi.status() == WL_CONNECTED)
{
Serial.println("Conexao Wi-Fi estabelecida com sucesso!");
return true;
}
delay(1000);
} while ((millis() - tempoInicial) < 30000L);
Serial.println("Impossivel estabelecer uma conexao com a rede Wi-Fi!");
return false;
}
bool verificarWiFi()
{
if (WiFi.status() == WL_CONNECTED)
return true;
Serial.println("Conexao Wi-Fi perdida.");
WiFi.disconnect(true);
delay(5000);
return conectarWiFi();
}
bool conectarMQTT()
{
Serial.println("Tentando estabelecer uma conexao com o broker MQTT...");
const unsigned long tempoInicial = millis();
char clientId[32];
sprintf(clientId, "inteli_%02X%02X%02X%02X%02X%02X%02X%02X",
random(256), random(256), random(256), random(256),
random(256), random(256), random(256), random(256));
do
{
if (mqttClient.connect(clientId))
{
if (!mqttClient.subscribe("dht_inteli")) #topic
{
Serial.println("Erro ao se inscrever em dht_inteli");
}
Serial.print("Conectado ao broker MQTT utilizando o client id ");
Serial.print(clientId);
Serial.println(", e inscrito no tópico dht_inteli");
return true;
}
delay(1000);
if (!verificarWiFi())
break;
} while ((millis() - tempoInicial) < 30000L);
Serial.println("Impossivel estabelecer uma conexao com o broker MQTT!");
return false;
}
bool verificarMQTT()
{
if (!verificarWiFi())
return false;
if (mqttClient.connected())
return true;
Serial.println("Conexao com o broker perdida.");
mqttClient.disconnect();
delay(5000);
return conectarMQTT();
}
void mensagemRecebida(char *topic, byte *payload, unsigned int length)
{
String mensagem = "";
Serial.print("Mensagem recebida! Topic: ");
Serial.print(topic);
Serial.print(" - Payload (");
Serial.print(length);
Serial.print(" bytes): ");
for (int i = 0; i < length; i++)
{
mensagem += (char)payload[i];
}
Serial.println(mensagem);
if (strcmp(topic, "relay_inteli") == 0)
{
if (mensagem == "liga")
{
Serial.println("LIGA");
digitalWrite(RELAY_PIN, HIGH);
}
if (mensagem == "desliga")
{
Serial.println("DESLIGA");
digitalWrite(RELAY_PIN, LOW);
}
}
Serial.println();
}
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.flush();
delay(1000);
Serial.println();
Serial.flush();
delay(1000);
Serial.println("Iniciando...");
WiFi.mode(WIFI_STA);
conectarWiFi();
mqttClient.setBufferSize(256);
mqttClient.setKeepAlive(60);
mqttClient.setSocketTimeout(15);
mqttClient.setCallback(mensagemRecebida);
mqttClient.setServer(mqttBroker, 1883);
tempoUltimaMensagem = millis();
randomSeed(micros());
conectarMQTT();
Serial.println("Iniciando o envio...");
dht.begin();
pinMode(RELAY_PIN, OUTPUT);
}
void loop()
{
if (!verificarMQTT())
return;
mqttClient.loop();
float temperatura = dht.readTemperature();
char payload[16];
const unsigned long agora = millis();
if ((agora - tempoUltimaMensagem) >= 5000L)
{
tempoUltimaMensagem = agora;
sprintf(payload, "%.2f", temperatura);
Serial.print("Enviando temperatura...");
Serial.println(payload);
if (mqttClient.publish("dht_inteli", payload)) # dht_inteli é o subscription
{
Serial.println("Temperatura enviada!");
}
else
{
Serial.println("Erro ao enviar a temperatura!");
}
Serial.println();
Serial.println("Aguardando para repetir o processo...");
Serial.println();
}
}