#include <WiFi.h>
#include <PubSubClient.h>
// --- CONFIGURACIÓN DE RED SIMULADA DE WOKWI ---
// Nota: Deja estos valores fijos, Wokwi usará el internet de tu cable Ethernet automáticamente.
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// --- BROKER PÚBLICO HIVEMQ ---
const char* mqtt_server = "broker.hivemq.com";
// --- TÓPICO EXCLUSIVO CON TU NOMBRE ---
const char* topic_led = "JoelTqz/ejercicio1/led";
WiFiClient espClient;
PubSubClient client(espClient);
// Especificación exacta: Pin 26 para el LED
const int pinLed = 26;
void setup_wifi() {
delay(10);
Serial.begin(115200);
Serial.println();
Serial.print("Conectando la simulación al internet de la PC...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n¡Simulador Conectado!");
}
// --- ESCUCHA DE COMANDOS DESDE EL TELÉFONO ---
void callback(char* topic, byte* payload, unsigned int length) {
String mensaje = "";
for (int i = 0; i < length; i++) {
mensaje += (char)payload[i];
}
Serial.print("Mensaje recibido de Node-RED [");
Serial.print(topic);
Serial.print("]: ");
Serial.println(mensaje);
if (String(topic) == topic_led) {
if (mensaje == "ON") {
digitalWrite(pinLed, HIGH);
Serial.println("-> LED ENCENDIDO");
}
else if (mensaje == "OFF") {
digitalWrite(pinLed, LOW);
Serial.println("-> LED APAGADO");
}
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Buscando conexión con HiveMQ...");
// Generamos un ID único para evitar interferencias
String clientId = "ESP32-JoelTqz-E1-";
clientId += String(random(0, 0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println(" ¡Conectado al Broker!");
client.subscribe(topic_led);
} else {
Serial.print("Falló el estado: ");
Serial.print(client.state());
Serial.println(". Reintentando en 2 segundos...");
delay(2000);
}
}
}
void setup() {
pinMode(pinLed, OUTPUT);
digitalWrite(pinLed, LOW); // Inicia apagado
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}