// Librería para la conexión WiFi
#include <WiFi.h>
// Librerías de Adafruit para manejo de MQTT
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
// Credenciales para la conexión al servidor de Adafruit IO
#define AIO_SERVIDOR "io.adafruit.com" // Dirección del servidor MQTT de Adafruit IO
#define AIO_PUERTOSERVIDOR 1883 // Puerto estándar para conexión MQTT
#define AIO_USUARIO "guillermo_calderon" // Usuario de Adafruit IO
#define AIO_KEY "aio_MoGj76Gcia8XPFkPMaOQNFhBcc0R" // Llave API para autenticación
// Pines asignados para los LEDs
#define led_azul 23 // Pin del LED azul
#define led_blanco 22 // Pin del LED blanco
// Cliente WiFi para la conexión a internet
WiFiClient client;
// Cliente MQTT de Adafruit, configurado con los datos de conexión
Adafruit_MQTT_Client mqtt(&client, AIO_SERVIDOR, AIO_PUERTOSERVIDOR, AIO_USUARIO, AIO_KEY);
// Suscripciones a los feeds de Adafruit IO
Adafruit_MQTT_Subscribe luz = Adafruit_MQTT_Subscribe(&mqtt, AIO_USUARIO "/feeds/boton"); // Feed del botón LED azul
Adafruit_MQTT_Subscribe luz2 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USUARIO "/feeds/boton blanco"); // Feed del botón LED blanco
// Publicador para el feed "temperatura"
Adafruit_MQTT_Publish temperatura = Adafruit_MQTT_Publish(&mqtt, AIO_USUARIO "/feeds/temperatura");
void setup() {
Serial.begin(9600); // Inicializa la comunicación serial para depuración
Serial.print("conectando a wifi");
// Conexión a la red WiFi
WiFi.begin("Wokwi-GUEST", "", 6); // Nombre de la red WiFi, contraseña y canal (6)
while (WiFi.status() != WL_CONNECTED) { // Espera hasta que se conecte al WiFi
delay(100);
Serial.print(".");
}
Serial.print("Conectado!!! 🥳");
// Configuración de los pines de los LEDs como salida
pinMode(led_azul, OUTPUT);
pinMode(led_blanco, OUTPUT);
// Registro de las suscripciones MQTT
mqtt.subscribe(&luz); // Suscripción al feed del LED azul
mqtt.subscribe(&luz2); // Suscripción al feed del LED blanco
}
void loop() {
MQTT_connect(); // Asegura que la conexión MQTT esté activa
// Verifica si hay datos recibidos de las suscripciones
Adafruit_MQTT_Subscribe* subscription;
while (subscription = mqtt.readSubscription(2000)) { // Espera datos durante 2 segundos
if (subscription == &luz) { // Si los datos son del feed del LED azul
Serial.print(F("llega el dato del led azul"));
Serial.println((char*)luz.lastread); // Imprime el último valor leído
int luz_state = atoi((char*)luz.lastread); // Convierte el valor recibido a entero
digitalWrite(led_azul, luz_state); // Cambia el estado del LED azul
}
if (subscription == &luz2) { // Si los datos son del feed del LED blanco
Serial.print(F("llega el dato del led blanco"));
Serial.println((char*)luz2.lastread); // Imprime el último valor leído
int luz2_state = atoi((char*)luz2.lastread); // Convierte el valor recibido a entero
digitalWrite(led_blanco, luz2_state); // Cambia el estado del LED blanco
}
}
// Envía un valor aleatorio al feed "temperatura" cada 5 segundos
static unsigned long lastSend = 0; // Marca de tiempo de la última publicación
if (millis() - lastSend > 5000) { // Verifica si han pasado 5 segundos
lastSend = millis(); // Actualiza el tiempo de la última publicación
int randomTemperature = random(20, 31); // Genera un valor aleatorio entre 20 y 30
Serial.print(F("Enviando temperatura: "));
Serial.println(randomTemperature);
if (!temperatura.publish(String(randomTemperature).c_str())) { // Convierte a cadena y publica
Serial.println(F("Error al publicar temperatura"));
} else {
Serial.println(F("Temperatura enviada con éxito"));
}
}
}
void MQTT_connect() {
int8_t ret;
// Verifica si ya está conectado al servidor MQTT
if (mqtt.connected()) {
return; // Si está conectado, no hace nada
}
Serial.print("Connecting to MQTT...");
uint8_t retries = 3; // Número máximo de reintentos
// Intenta conectar al servidor MQTT
while (ret = mqtt.connect() != 0) {
Serial.println(mqtt.connectErrorString(ret)); // Imprime el error de conexión
Serial.println("reintentando conectar en 5 segundos...");
mqtt.disconnect(); // Desconecta el cliente MQTT
delay(5000); // Espera 5 segundos antes de reintentar
if (retries == 0) {
while (1); // Si falla, se queda en un bucle infinito
}
}
Serial.println("mqtt Conectado!!! 🥳");
}