#include <WiFi.h> // conexão wifi
#include <PubSubClient.h> // conexao MQTT
#include <DHT.h> // biblioteca modulo DHT22/11
// Configurações para rede Wi-FI
const char* ssid = "Wokwi-GUEST";
const char* password = "";
//Configuração do Broker MQTT
const char* mqttServer = "broker.hivemq.com"; //Broker MQTT publico
const int mqttPort = 1883; //Porta do Broker
const char* mqttTopic = "brunex/lerSensor"; //Topico onde dados serao publicados
//Configuração do DHT22
#define DHTPIN 15 // Pino sensor
#define DHTTYPE DHT22 // Tipo sensor
DHT dht(DHTPIN, DHTTYPE); // Cria objeto "dht" com o pino e tipo de sensor
// Criação dos objetos de rede e MQTT
WiFiClient espClient; //Objeto do cliente wifi
PubSubClient client(espClient); //Objeto de cliente MQTT utilizando o cliente wifi
unsigned long lastMsg = 0; // Armazena o tempo da ultima menssagem enviada
const long interval = 2000; // Intervalo entre publicações (2s)
void setup_wifi() {
delay(10); // Pequeno atraso inicial
Serial.println("Conectando ao WiFi...");
WiFi.begin(ssid, password); // Inicia conexão Wi-Fi
while (WiFi.status() != WL_CONNECTED) { // Aguarda até conectar
delay(500); Serial.print(".");
}
Serial.println("\n✅ WiFi conectado. IP: " + WiFi.localIP().toString());
}
// Função para reconectar ao Broker MQTT (Servidor), se desconectado.
void reconnect(){
// ID Randomico
String clientId = "Esp32_" + String(random(0xffff), HEX);
while(!client.connected()){
Serial.println("Tentando conectar ao MQTT...");
if(client.connect(clientId.c_str())){ // Tenta fazer a conexao com o ID Esp32Client
Serial.println("Conectado ao Broker.");
client.subscribe(mqttTopic, 0); // Inscrever-se no tópico com QoS 0
}else{
Serial.println("Falha ao conectar-se... Tentando novamente em 5s...");
Serial.print("Código da Falha: ");
Serial.println(client.state()); // Exibe codigo do erro
delay(5000); // Espera para tentar novamente
}
}
}
void setup(){
Serial.begin(115200);
dht.begin();
setup_wifi();
client.setServer(mqttServer, mqttPort);
}
void loop(){
if(!client.connected()){ //Verifica se esta conectado
reconnect(); //Tenta se reconectar caso erro
}
client.loop(); //Mantem a conexao MQTT ativa
unsigned long now = millis();
if(now - lastMsg > interval)
{
lastMsg = now;
//pegar os valores do sensor
float h = dht.readHumidity();
float t = dht.readTemperature();
if(isnan(h) || isnan(t)){ //Verifica se houve erro na leitura
Serial.println("Erro ao ler Sensor");
return; //Sai da função se houver erro
}
//Cria uma variavel no formato JSON
String payload = "{";
payload += "\"temperatura\":" + String(t,1) + ","; // Um digito decimal
payload += "\"umidade\":" + String(h,1); // Um digito decimal
payload += "}";
Serial.print("Publicando : "); //Mostra oque sera enviado
Serial.println(payload);
client.publish(mqttTopic, payload.c_str()); //publica o topico definido
}
}