#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "mqtt-dashboard.com"; // Dirección del servidor MQTT
const int buttonPin = 27; // Pin del pulsador
const int ledPin = 26; // Pin del LED
WiFiClient espClient;
PubSubClient client(espClient);
volatile bool buttonPressed = false; // Bandera para indicar si se presionó el botón
void setup() {
pinMode(ledPin, OUTPUT);
// Inicializa la conexión Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Conectando a WiFi...");
}
Serial.println("Conectado a la red WiFi");
// Configura la conexión MQTT
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
// Conéctate al servidor MQTT
reconnect();
// Configura la interrupción para el pulsador
pinMode(buttonPin, INPUT_PULLUP); // Configura el pin del pulsador como entrada con pull-up
attachInterrupt(digitalPinToInterrupt(buttonPin), buttonISR, FALLING); // Configura la interrupción en flanco de bajada
}
void loop() {
// El loop está vacío porque las tareas principales se manejan mediante interrupciones
}
void buttonISR() {
// Esta función se llama cuando se detecta una interrupción en el botón
buttonPressed = true; // Establece la bandera para indicar que se presionó el botón
}
void callback(char* topic, byte* payload, unsigned int length) {
// Cuando se recibe un mensaje en el tópico "topic/led", enciende el LED
if (strcmp(topic, "topic/led") == 0) {
digitalWrite(ledPin, HIGH);
delay(1000); // Mantiene el LED encendido durante 1 segundo
digitalWrite(ledPin, LOW);
}
}
void reconnect() {
// Reconectar al servidor MQTT
while (!client.connected()) {
Serial.println("Conectando al servidor MQTT...");
if (client.connect("ESP32Client")) {
Serial.println("Conectado al servidor MQTT");
// Suscribirse al tópico "topic/led"
client.subscribe("topic/led");
} else {
Serial.print("Error de conexión al servidor MQTT, rc=");
Serial.println(client.state());
delay(2000);
}
}
}