#include <WiFi.h>
#include <PubSubClient.h>
#define PIN_LED 15 // LED no GPIO 15
#define TOPIC_LED "on_of_led_fiap_lana" // tópico único (cmd + state)
#define ID_MQTT "esp32_mqtt" // id do cliente (único no broker)
// Wi-Fi (Wokwi)
const char* SSID = "Wokwi-GUEST";
const char* PASSWORD = "";
// Broker
const char* BROKER_MQTT = "broker.hivemq.com";
const int BROKER_PORT = 1883;
WiFiClient espClient;
PubSubClient MQTT(espClient);
bool ledOn = false;
void publishLedState() {
MQTT.publish(TOPIC_LED, ledOn ? "ON" : "OFF", true); // retain para mostrar estado atual
}
void setLed(bool on) {
ledOn = on;
digitalWrite(PIN_LED, on ? HIGH : LOW);
publishLedState();
}
void reconnectWiFi() {
if (WiFi.status() == WL_CONNECTED) return;
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println();
Serial.print("WiFi OK | IP: ");
Serial.println(WiFi.localIP());
}
void callbackMQTT(char* topic, byte* payload, unsigned int length) {
String msg;
for (unsigned int i = 0; i < length; i++) msg += (char)payload[i];
Serial.printf("MQTT RX [%s]: %s\n", topic, msg.c_str());
if (String(topic) == TOPIC_LED) {
if (msg == "1") setLed(true);
else if (msg == "0") setLed(false);
}
}
void reconnectMQTT() {
while (!MQTT.connected()) {
Serial.print("* Conectando ao Broker: ");
Serial.println(BROKER_MQTT);
if (MQTT.connect(ID_MQTT)) {
Serial.println("MQTT conectado!");
MQTT.subscribe(TOPIC_LED);
publishLedState(); // publica estado inicial
} else {
Serial.println("Falha ao conectar. Tentando em 2s...");
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(PIN_LED, OUTPUT);
digitalWrite(PIN_LED, LOW);
WiFi.mode(WIFI_STA);
reconnectWiFi();
MQTT.setServer(BROKER_MQTT, BROKER_PORT);
MQTT.setCallback(callbackMQTT);
setLed(false);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) reconnectWiFi();
if (!MQTT.connected()) reconnectMQTT();
MQTT.loop();
}
Loading
franzininho-wifi
franzininho-wifi