#include <WiFi.h> // Libreria para conectar wifi
#include "DHTesp.h" // Libreria para conectar al DHT
#include "Adafruit_MQTT.h" // Libreria para conectar a Adafruit
#include "Adafruit_MQTT_Client.h" // Libreria para conectar a Adafruit
#include <NTPClient.h> //Libreria para conectarse con NTP server publico
// Credenciales para conectar a Adafruit
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883
// Adafruit IO USERNAME / KEY TOKEN
#define AIO_USERNAME "username"
#define AIO_KEY "aio_tY4MnECdqRDw54BHenBivDKPdTN"
WiFiClient client;
// Datos de conexion con el server Adafruit IO {AIO_SERVER / AIO_SERVERPORT / AIO_USERNAME / AIO_KEY }
Adafruit_MQTT_Client mqtt (&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Tomar nota que el Path MQTT en Adafruit IO usa la siguiente forma: <username>/feeds/<feedname>
Adafruit_MQTT_Publish tempe = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME"/feeds/temperature"); // Feed
Adafruit_MQTT_Publish humed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME"/feeds/humidity"); // Feed
Adafruit_MQTT_Publish datetm = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME"/feeds/datetm"); // Feed
//Para el caso de leer un Subscribe
//Adafruit_MQTT_Subscribe led = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME"/feeds/led"); // Feed
// Credenciales para conectar el wifi
#define wifi "Wokwi-GUEST" // Red
#define pass "" // Contraseña
#define canal 6 // Canal
const int DHT_PIN = 25; //Pin conectado con el sensor DHT22
DHTesp dhtSensor;
//Conexion con NTP Server
WiFiUDP ntpUDP;
//NTPClient timeClient(ntpUDP, "in.pool.ntp.org", -10800); // UTC offset for Argentina (3 hours later)
NTPClient timeClient(ntpUDP, "in.pool.ntp.org");
void MQTT_connect(){
Serial.println("Iniciando conexión MQTT");
int8_t ret;
if(mqtt.connected())
{ Serial.println("MQTT is True / mqtt.connected!!");
return;
}
uint8_t retries = 4; // ciclos que se demora en volverlo a intentar
while(ret = mqtt.connect()!=0){
Serial.println(mqtt.connectErrorString(ret));
Serial.println(" Reintentando conectar a MQTT en 5 segundos...");
mqtt.disconnect(); //metodo interno que tiene la libreria
delay (5000);
if(retries == 0){
while(1);
}
}
Serial.println("Conectado!!!");
}
void MQTT_publication()
{
// Obtengo TimeStamp
String time;
time = (timeClient.getFormattedTime());//Current time
String hour = time.substring(0, 2); //HH
String minute = time.substring(3, 5); //MM
String TimeStamp = hour + ":" + minute;
Serial.println("===========================");
Serial.println("Values - " + TimeStamp);
Serial.println("===========================");
// Lectura de la temperatura y humedad del sensor DHT22
float temperature = dhtSensor.getTemperature();
float humidity = dhtSensor.getHumidity();
// Verificación de lecturas válidas del sensor
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Error al leer el sensor DHT22!");
delay(3000);
return;
}
/*
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
*/
Serial.println("Temperature: "+ String(temperature));
Serial.println("Humidity: "+ String(humidity));
Serial.println("===========================");
// Publicar datos en los feeds correspondientes en Adafruit.io
if (mqtt.connected()) {
Serial.println("mqtt.connected()....se inicia la publicacion de datos en Adafruit IO");
// Publicar temperatura en el feed correspondiente
char temperatureStr[10];
dtostrf(temperature, 4, 2, temperatureStr); //convert. float to Char
/* Se comenta un metodo de Publish msg MQTT
//mqtt.publish(AIO_USERNAME "/feeds/temperature", temperatureStr);
*/
if(!tempe.publish(temperatureStr))
{
Serial.println(F("Falla Temp Publish MQTT!!!"));
}
// Publicar humedad en el feed correspondiente
char humidityStr[10];
dtostrf(humidity, 4, 2, humidityStr); //convert. float to Char
/* Se comenta un metodo de Publish msg MQTT
//mqtt.publish(AIO_USERNAME "/feeds/humidity", humidityStr);
*/
if(!humed.publish(humidityStr))
{
Serial.println(F("Falla Humidity Publish MQTT!!!"));
}
// Publicar Date-Time en el feed correspondiente
int LenArray = TimeStamp.length()+1; //Long. String
char datetimeStr[LenArray]; //defino Char Array
TimeStamp.toCharArray(datetimeStr,LenArray); //Convertir String to Char
/* Se comenta un metodo de Publish msg MQTT
//mqtt.publish(AIO_USERNAME "/feeds/datetm", datetimeStr);
*/
if(!datetm.publish(datetimeStr))
{
Serial.println(F("Falla Time Publish MQTT!!!"));
}
}
}
void setup() {
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
Serial.print("Wifi conexión ");
WiFi.begin(wifi, "", canal);
while(WiFi.status()!= WL_CONNECTED){
Serial.print(".");
delay(200);
}
Serial.println(" Conectado exitosamente al Wifi: "+String(wifi)+"!");
//En el caso de usar Suscripcion, uno por cada Feed
//mqtt.subscribe(&led);
timeClient.begin();//Inicializo NTP Client
timeClient.setTimeOffset(-10800); // Seteo GMT-3 al NTP Client
timeClient.update(); //Actualizo NTP Datetime
}
void loop()
{
timeClient.update(); //Actualizo NTP Datetime
// Inicializa la comunicacion MQTT
MQTT_connect();
MQTT_publication();
Serial.println("Fin publicacion....delay 60 seg para nuevo ciclo");
delay(60000); // Espera 60 segundos antes de publicar los siguientes datos
}