#include <DHTesp.h>
#include <LiquidCrystal_I2C.h>
#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
const int DHT_PIN = 16;
float temperatura, humedad;
const char* WIFI_NAME="Wokwi-GUEST";
const char* WIFI_PASSWORD="";
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 susc_amarillo = Adafruit_MQTT_Subscribe(&mqtt, AIO_USUARIO "/feeds/estado_le
Adafruit_MQTT_Subscribe susc_azul = Adafruit_MQTT_Subscribe(&mqtt, AIO_USUARIO "/feeds/estado_led");
// Publicadores para los feeds
Adafruit_MQTT_Publish pub_temperatura = Adafruit_MQTT_Publish(&mqtt, AIO_USUARIO "/feeds/temperatura");
Adafruit_MQTT_Publish pub_humedad = Adafruit_MQTT_Publish(&mqtt, AIO_USUARIO "/feeds/humedad");
DHTesp dhtSensor;
LiquidCrystal_I2C lcd(0x27,16,2);
const int LED_AMARILLO=13;
const int LED_AZUL=12;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
pinMode(LED_AMARILLO, OUTPUT);
pinMode(LED_AZUL, OUTPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.init();
lcd.backlight();
WiFi.begin(WIFI_NAME,WIFI_PASSWORD);
while(WiFi.status()!=WL_CONNECTED){
delay(1000);
Serial.println("WiFi no conectado");
}
Serial.println("Wifi conectado");
//Registro de las suscripciones MQTT
mqtt.subscribe(&susc_amarillo);
mqtt.subscribe(&susc_azul);
}
void loop() {
MQTT_connect(); //Asegura que la conexion MQTT esté activa
Adafruit_MQTT_Subscribe* suscription;
while(suscription=mqtt.readSubscription(2000)){ // Espera datos durante 2 segundos
if(suscription==&susc_amarillo){
Serial.println("Se ha presionado el boton");
int estado_led=atoi((char*)susc_amarillo.lastread);
digitalWrite(LED_AMARILLO,estado_led);
}
if(suscription==&susc_azul){
Serial.println("Se ha presionado el boton");
int estado_led=atoi((char*)susc_azul.lastread);
digitalWrite(LED_AZUL,estado_led);
}
}
static unsigned long lastSend = 0; // Marca de tiempo de la última publicación
if (millis() - lastSend > 5000) { // Verifica si han pasado 5 segundos
TempAndHumidity lectura= dhtSensor.getTempAndHumidity();
temperatura=lectura.temperature;
humedad=lectura.humidity;
lcd.setCursor(0,0);
lcd.print("Temp:" + String(temperatura,2) + " c");
lcd.setCursor(0,1);
lcd.print("Humedad:" + String(humedad,2) + " %");
lastSend = millis(); // Actualiza el tiempo de la última publicación
if (!pub_temperatura.publish(String(temperatura).c_str())) { // Convierte a cadena y publica
Serial.println(F("Error al publicar temperatura"));
} else {
Serial.println(F("Temperatura enviada con éxito"));
}
if (!pub_humedad.publish(String(humedad).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!!!");
}