#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
// Definición de Pines
#define POT_PIN 34
#define LED1 23
#define LED2 22
#define LED3 21
#define LED4 19 // Cuarto LED independiente
long lastMsg = 0;
// Función para recibir mensajes de Node-RED
void callback(char* topic, byte* payload, unsigned int length) {
char status = (char)payload[0];
// Control exclusivo del LED 4 desde los botones
if (status == '1') {
digitalWrite(LED4, HIGH);
Serial.println("LED 4: ENCENDIDO");
} else if (status == '0') {
digitalWrite(LED4, LOW);
Serial.println("LED 4: APAGADO");
}
}
void setup_wifi() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado");
}
void reconnect() {
while (!client.connected()) {
if (client.connect("esp32_user_unique")) { // ID único para evitar desconexiones
Serial.println("Conectado a MQTT");
client.subscribe("casa/led_control"); // Suscripción al tópico de los botones
} else {
delay(2000);
}
}
}
void setup() {
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
long now = millis();
if (now - lastMsg > 1000) {
lastMsg = now;
int potValue = analogRead(POT_PIN);
int porcentaje = map(potValue, 0, 4095, 0, 100);
// Enviar valor a Node-RED
char msg[10];
sprintf(msg, "%d", porcentaje);
client.publish("casa/potenciometro", msg);
// Lógica automática para LEDs 1, 2 y 3
digitalWrite(LED1, porcentaje < 33);
digitalWrite(LED2, porcentaje >= 33 && porcentaje < 66);
digitalWrite(LED3, porcentaje >= 66);
}
}