#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHTesp.h>
#include <WiFi.h>
#include <time.h> // Agregamos esta librería para trabajar con el tiempo
// Definir los pines y constantes
#define DHTPIN 15
#define LED_PIN 2
#define NTP_SERVER "cl.pool.ntp.org"
#define UTC_OFFSET -4
#define UTC_OFFSET_DST -4
// Inicializar los objetos
DHTesp dht;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Inicializar las variables
unsigned long lastTime = 0;
const unsigned long delayTime = 1000;
// Configurar la conexión a WiFi y NTP
void setupWiFiAndNTP() {
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
}
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
}
void setup() {
// Inicializar los objetos
dht.setup(DHTPIN, DHTesp::DHT22);
lcd.init();
lcd.backlight();
// Configurar la pantalla LCD
lcd.setCursor(0, 2);
lcd.print("Hora: ");
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.setCursor(0, 1);
lcd.print("Hume:");
// Configurar el LED incorporado
pinMode(LED_PIN, OUTPUT);
// Configurar la conexión a WiFi y NTP
setupWiFiAndNTP();
}
void loop() {
// Leer la hora
struct tm timeinfo;
if (getLocalTime(&timeinfo)) { // Obtenemos la hora actual del sistema
lcd.setCursor(6, 2);
lcd.printf("%02d:%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); // Imprimimos la hora en la LCD
// Leer la temperatura y la humedad
float temperature = dht.getTemperature();
float humidity = dht.getHumidity();
if (!isnan(temperature) && !isnan(humidity)) { // Comprobamos que los valores de temperatura y humedad sean válidos
lcd.setCursor(6, 0);
lcd.printf("%2.1f C ", temperature);
lcd.setCursor(6, 1);
lcd.printf("%2.1f %%", humidity);
// Encender el LED incorporado para indicar que se ha realizado una medición
digitalWrite(LED_PIN, HIGH);
// Esperar un periodo de tiempo adecuado
delay(500);
// Apagar el LED incorporado
digitalWrite(LED_PIN, LOW);
// Calcular cuánto tiempo ha pasado desde la última medición de tiempo
unsigned long elapsedTime = millis() - lastTime;
// Calcular cuánto tiempo debe esperar para completar el segundo actual
unsigned long waitTime = delayTime - (elapsedTime % delayTime);
// Esperar hasta que se complete el segundo actual
delay(waitTime);
// Guardar el tiempo actual
lastTime = millis();
}
}
}