#include <WiFi.h>
#include <PubSubClient.h>
#include <LiquidCrystal.h>
// ─── CONFIGURACIÓN ────────────────────────────────────────────
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
const char* MQTT_BROKER = "test.mosquitto.org";
const int MQTT_PORT = 1883;
const char* MQTT_TOPIC = "luces/test";
// ─── PINES ────────────────────────────────────────────────────
#define PIN_LED_VERDE 12
#define PIN_LED_AMARILLO 27
#define PIN_LED_ROJO 26
// LCD en modo 4 bits
LiquidCrystal lcd(15, 2, 4, 16, 17, 5);
// ─── OBJETOS ──────────────────────────────────────────────────
WiFiClient wifiClient;
PubSubClient mqtt(wifiClient);
// ─── FUNCIONES DE LED ─────────────────────────────────────────
void apagarTodosLEDs() {
digitalWrite(PIN_LED_VERDE, LOW);
digitalWrite(PIN_LED_AMARILLO, LOW);
digitalWrite(PIN_LED_ROJO, LOW);
}
void encenderLuz(const char* color) {
apagarTodosLEDs();
lcd.clear();
if (strcmp(color, "verde") == 0) {
digitalWrite(PIN_LED_VERDE, HIGH);
lcd.setCursor(0, 0);
lcd.print("Luz VERDE");
lcd.setCursor(0, 1);
lcd.print("encendida");
Serial.println("[LED] Verde encendido");
} else if (strcmp(color, "amarillo") == 0) {
digitalWrite(PIN_LED_AMARILLO, HIGH);
lcd.setCursor(0, 0);
lcd.print("Luz AMARILLA");
lcd.setCursor(0, 1);
lcd.print("encendida");
Serial.println("[LED] Amarillo encendido");
} else if (strcmp(color, "rojo") == 0) {
digitalWrite(PIN_LED_ROJO, HIGH);
lcd.setCursor(0, 0);
lcd.print("Luz ROJA");
lcd.setCursor(0, 1);
lcd.print("encendida");
Serial.println("[LED] Rojo encendido");
} else {
// Mensaje desconocido
lcd.setCursor(0, 0);
lcd.print("Msg desconocido:");
lcd.setCursor(0, 1);
lcd.print(color);
Serial.print("[WARN] Mensaje no reconocido: ");
Serial.println(color);
}
}
// ─── CALLBACK MQTT ────────────────────────────────────────────
void callbackMQTT(char* topic, byte* payload, unsigned int length) {
String mensaje = "";
for (unsigned int i = 0; i < length; i++) {
mensaje += (char)payload[i];
}
mensaje.trim();
Serial.print("[MQTT] Mensaje recibido: ");
Serial.println(mensaje);
if (mensaje == "encender_verde") {
encenderLuz("verde");
} else if (mensaje == "encender_rojo") {
encenderLuz("rojo");
} else if (mensaje == "encender_amarillo") {
encenderLuz("amarillo");
} else if (mensaje == "apagar") {
apagarTodosLEDs();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Luces apagadas");
Serial.println("[LED] Todas las luces apagadas");
} else {
encenderLuz(mensaje.c_str());
}
}
// ─── CONEXIÓN WIFI ────────────────────────────────────────────
void conectarWiFi() {
Serial.print("[WiFi] Conectando a ");
Serial.print(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Conectando WiFi");
int intentos = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
intentos++;
if (intentos > 40) {
Serial.println("\n[WiFi] ERROR: No se pudo conectar. Reiniciando...");
ESP.restart();
}
}
Serial.println("\n[WiFi] Conectado!");
Serial.print("[WiFi] IP: ");
Serial.println(WiFi.localIP());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi OK!");
lcd.setCursor(0, 1);
lcd.print(WiFi.localIP());
delay(2000);
}
// ─── CONEXIÓN MQTT ────────────────────────────────────────────
void conectarMQTT() {
String clientId = "ESP32_Tarea7_" + String(random(1000, 9999));
Serial.print("[MQTT] Conectando al broker... ");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Conectando MQTT");
while (!mqtt.connected()) {
if (mqtt.connect(clientId.c_str())) {
Serial.println("OK");
Serial.print("[MQTT] Suscrito a: ");
Serial.println(MQTT_TOPIC);
mqtt.subscribe(MQTT_TOPIC);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MQTT OK!");
lcd.setCursor(0, 1);
lcd.print("Esperando...");
delay(1000);
} else {
Serial.print("[MQTT] Error rc=");
Serial.print(mqtt.state());
Serial.println(" - Reintentando en 3s...");
delay(3000);
}
}
}
// ─── SETUP ────────────────────────────────────────────────────
void setup() {
Serial.begin(115200);
Serial.println("\n=== Tarea 7: Control LEDs via MQTT ===");
// Inicializar pines LEDs
pinMode(PIN_LED_VERDE, OUTPUT);
pinMode(PIN_LED_AMARILLO, OUTPUT);
pinMode(PIN_LED_ROJO, OUTPUT);
apagarTodosLEDs();
// Inicializar LCD (16 columnas, 2 filas)
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Iniciando...");
// Conectar WiFi
conectarWiFi();
// Configurar broker MQTT
mqtt.setServer(MQTT_BROKER, MQTT_PORT);
mqtt.setCallback(callbackMQTT);
// Conectar MQTT
conectarMQTT();
Serial.println("[OK] Sistema listo. Esperando mensajes MQTT...");
}
// ─── LOOP ─────────────────────────────────────────────────────
void loop() {
// Reconectar si se pierde la conexión MQTT
if (!mqtt.connected()) {
Serial.println("[MQTT] Conexión perdida. Reconectando...");
conectarMQTT();
}
// Procesar mensajes MQTT entrantes (imprescindible en el loop)
mqtt.loop();
}Loading
esp32-devkit-c-v4
esp32-devkit-c-v4