#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
// ==== CONFIGURAÇÕES DE REDE E MQTT ====
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
// ==== TÓPICOS MQTT ====
const char* topicTemp = "estufa/sensores/temperatura";
const char* topicHumAr = "estufa/sensores/umidade_ar";
const char* topicLum = "estufa/sensores/luminosidade";
const char* topicVent = "estufa/atuadores/ventilador";
// ==== PINOS ====
#define DHTPIN 15
#define DHTTYPE DHT22
#define LED_PIN 2
#define LDR_PIN 34
DHT dht(DHTPIN, DHTTYPE);
// ==== VARIÁVEL DE CONTROLE ====
bool modoAutomatico = true; // começa no automático
// ==== FUNÇÃO DE RECONEXÃO ====
void reconnect() {
while (!client.connected()) {
Serial.print("Conectando ao MQTT...");
String clientId = "ESP32Client-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Conectado!");
client.subscribe(topicVent);
} else {
Serial.print("Falha, rc=");
Serial.print(client.state());
Serial.println(" Tentando novamente em 5s...");
delay(5000);
}
}
}
// ==== CALLBACK PARA MENSAGENS RECEBIDAS ====
void callback(char* topic, byte* payload, unsigned int length) {
String msg;
for (int i = 0; i < length; i++) {
msg += (char)payload[i];
}
Serial.print("Mensagem recebida em ");
Serial.print(topic);
Serial.print(": ");
Serial.println(msg);
if (String(topic) == topicVent) {
if (msg == "ON") {
digitalWrite(LED_PIN, HIGH);
Serial.println("Ventilador LIGADO (via MQTT)");
modoAutomatico = false; // desativa automático
} else if (msg == "OFF") {
digitalWrite(LED_PIN, LOW);
Serial.println("Ventilador DESLIGADO (via MQTT)");
modoAutomatico = false; // desativa automático
} else if (msg == "AUTO") {
modoAutomatico = true; // ativa automático
Serial.println("Modo automático ativado");
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
dht.begin();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
float temperatura = dht.readTemperature();
float umidadeAr = dht.readHumidity();
int luminosidade = analogRead(LDR_PIN);
if (!isnan(temperatura) && !isnan(umidadeAr)) {
client.publish(topicTemp, String(temperatura).c_str());
client.publish(topicHumAr, String(umidadeAr).c_str());
client.publish(topicLum, String(luminosidade).c_str());
Serial.printf("Temp: %.2f °C | Umidade: %.2f %% | Luminosidade: %d\n",
temperatura, umidadeAr, luminosidade);
// ==== LÓGICA AUTOMÁTICA ====
if (modoAutomatico) {
if (temperatura > 30.0) {
digitalWrite(LED_PIN, HIGH);
Serial.println("Ventilador LIGADO (automático)");
client.publish(topicVent, "ON");
} else {
digitalWrite(LED_PIN, LOW);
Serial.println("Ventilador DESLIGADO (automático)");
client.publish(topicVent, "OFF");
}
}
} else {
Serial.println("Falha na leitura do DHT22!");
}
delay(5000);
}