#include <WiFi.h> // Biblioteca para conexão Wi-Fi
#include <PubSubClient.h> // Biblioteca para MQTT
// Configurações de Wi-Fi (no Wokwi, use "Wokwi-GUEST")
const char* ssid = "Wokwi-GUEST"; // Nome da rede (simulada no Wokwi)
const char* password = ""; // Senha (vazia no Wokwi)
// Broker MQTT público
const char* mqtt_server = "mqtt.eclipseprojects.io"; // Servidor MQTT
WiFiClient espClient; // Cliente Wi-Fi para conexão
PubSubClient client(espClient); // Cliente MQTT
const int buttonPin = 19; // Botão conectado ao GPIO0 (no Wokwi)
int lastButtonState = HIGH; // Estado anterior do botão (para debounce)
// ==================== SETUP ====================
void setup() {
Serial.begin(115200); // Inicia comunicação serial (para debug)
pinMode(buttonPin, INPUT_PULLUP); // Configura o pino do botão como INPUT_PULLUP (ativo em LOW)
// Conecta ao Wi-Fi
WiFi.begin(ssid, password);
Serial.print("Conectando ao Wi-Fi");
while (WiFi.status() != WL_CONNECTED) { // Aguarda conexão
delay(500);
Serial.print(".");
}
Serial.println("\nConectado ao Wi-Fi!");
client.setServer(mqtt_server, 1883); // Configura o servidor MQTT (porta 1883 padrão)
}
// ==================== RECONNECT ====================
// Reconecta ao broker MQTT se a conexão cair
void reconnect() {
while (!client.connected()) { // Enquanto não estiver conectado...
Serial.print("Tentando conexão MQTT...");
if (client.connect("ESP32Client")) { // Tenta conectar com um ID único
Serial.println("Conectado ao Broker MQTT!");
} else {
Serial.print("Falha, rc=");
Serial.print(client.state());
Serial.println(" Tentando novamente em 5s...");
delay(5000); // Espera 5 segundos antes de tentar novamente
}
}
}
// ==================== LOOP ====================
void loop() {
if (!client.connected()) { // Se desconectado, tenta reconectar
reconnect();
}
client.loop(); // Mantém a conexão MQTT ativa
// Lê o estado do botão (LOW quando pressionado)
int buttonState = digitalRead(buttonPin);
// Verifica se o botão foi pressionado (debounce)
if (buttonState != lastButtonState) {
if (buttonState == LOW) { // Botão pressionado
client.publish("casa/lampada", "ON"); // Publica "ON" no tópico
Serial.println("Botão pressionado → Enviado: ON");
} else { // Botão solto
client.publish("casa/lampada", "OFF"); // Publica "OFF" no tópico
Serial.println("Botão solto → Enviado: OFF");
}
delay(50); // Debounce para evitar leituras múltiplas
}
lastButtonState = buttonState; // Atualiza o estado anterior
}