// =======================
// BIBLIOTECAS
// =======================
#include <WiFi.h> // Biblioteca para conexão Wi-Fi no ESP32
#include <PubSubClient.h> // Biblioteca para comunicação MQTT
// =======================
// DEFINIÇÕES DE PINOS
// =======================
#define LED_IRRIGACAO 26 // LED que representa a bomba de irrigação
// =======================
// CREDENCIAIS WI-FI (WOKWI)
// =======================
const char* ssid = "Wokwi-GUEST"; // Nome da rede Wi-Fi
const char* password = ""; // Senha (vazia no Wokwi)
// =======================
// CONFIGURAÇÃO MQTT
// =======================
const char* mqtt_server = "broker.hivemq.com"; // Broker público MQTT
WiFiClient espClient; // Cliente Wi-Fi
PubSubClient client(espClient); // Cliente MQTT usando Wi-Fi
// =======================
// VARIÁVEIS DOS SENSORES (SIMULADAS)
// =======================
float temperatura = 28.5; // Temperatura do ar (°C)
float umidade_ar = 60.0; // Umidade do ar (%)
float umidade_solo = 55.0; // Umidade do solo (%)
// =======================
// CONTROLE DO SISTEMA
// =======================
bool bombaLigada = false; // Estado da irrigação
bool modoManual = false; // Modo automático por padrão
// =======================
// FUNÇÃO: CONECTAR AO WI-FI
// =======================
void conectarWiFi() {
Serial.print("Conectando ao Wi-Fi");
WiFi.begin(ssid, password); // Inicia conexão Wi-Fi
while (WiFi.status() != WL_CONNECTED) { // Aguarda conexão
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi conectado com sucesso!");
}
// =======================
// FUNÇÃO: CONECTAR AO MQTT
// =======================
void reconnectMQTT() {
while (!client.connected()) { // Enquanto não conectar
Serial.print("Conectando ao MQTT...");
if (client.connect("ESP32-ESTUFA")) { // ID do cliente
Serial.println(" conectado!");
} else {
Serial.println(" falhou, tentando novamente...");
delay(2000);
}
}
}
// =======================
// FUNÇÃO: MOSTRAR DADOS NO SERIAL
// =======================
void mostrarDados() {
Serial.println();
Serial.println("╔══════════════════════════════════════════════╗");
Serial.println("║ 🌱 ESTUFA IoT – MONITORAMENTO ║");
Serial.println("╠══════════════════════════════════════════════╣");
Serial.printf("║ 🌡 Temperatura do ar : %6.2f °C ║\n", temperatura);
Serial.printf("║ 💧 Umidade do ar : %6.2f %% ║\n", umidade_ar);
Serial.printf("║ 🌱 Umidade do solo : %6.2f %% ║\n", umidade_solo);
Serial.println("╠══════════════════════════════════════════════╣");
Serial.printf("║ 🚿 Irrigação : %-20s ║\n",
bombaLigada ? "LIGADA" : "DESLIGADA");
Serial.printf("║ ⚙ Modo de controle : %-20s ║\n",
modoManual ? "MANUAL" : "AUTOMÁTICO");
Serial.println("╠══════════════════════════════════════════════╣");
Serial.printf("║ 📡 MQTT : %-20s ║\n",
client.connected() ? "CONECTADO" : "DESCONECTADO");
Serial.printf("║ 📶 Wi-Fi : %-20s ║\n",
WiFi.status() == WL_CONNECTED ? "CONECTADO" : "DESCONECTADO");
Serial.println("╚══════════════════════════════════════════════╝");
}
// =======================
// FUNÇÃO SETUP (EXECUTA 1 VEZ)
// =======================
void setup() {
Serial.begin(115200); // Inicia comunicação serial
pinMode(LED_IRRIGACAO, OUTPUT); // Define pino do LED como saída
conectarWiFi(); // Conecta ao Wi-Fi
client.setServer(mqtt_server, 1883); // Configura broker MQTT
}
// =======================
// FUNÇÃO LOOP (EXECUTA SEMPRE)
// =======================
void loop() {
// Garante conexão MQTT
if (!client.connected()) {
reconnectMQTT();
}
client.loop(); // Mantém comunicação MQTT ativa
// =======================
// SIMULA VARIAÇÃO DOS SENSORES
// =======================
temperatura += 0.1; // Temperatura sobe levemente
umidade_ar -= 0.2; // Umidade do ar diminui
umidade_solo -= 0.5; // Solo seca com o tempo
// =======================
// CONTROLE AUTOMÁTICO DA IRRIGAÇÃO
// =======================
if (!modoManual) { // Apenas no modo automático
if (umidade_solo < 50.0) { // Se solo < 50%
bombaLigada = true; // Liga irrigação
} else {
bombaLigada = false; // Desliga irrigação
}
}
digitalWrite(LED_IRRIGACAO, bombaLigada); // Aciona LED
// =======================
// PUBLICAÇÃO MQTT
// =======================
client.publish("estufa/temperatura", String(temperatura).c_str());
client.publish("estufa/umidade_ar", String(umidade_ar).c_str());
client.publish("estufa/umidade_solo", String(umidade_solo).c_str());
client.publish("estufa/irrigacao", bombaLigada ? "ON" : "OFF");
// =======================
// MOSTRA DADOS NO SERIAL
// =======================
mostrarDados();
delay(3000); // Aguarda 3 segundos
}