//chatGPT 3.5 / Francisco Rodriguez
#include <Wire.h>
#include <DHTesp.h>
#include <LiquidCrystal_I2C.h>

// Definición de los pines y los tipos de sensores utilizados
#define DHTPIN 15
#define DHTTYPE DHT22
DHTesp dht;
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int backlightPin = 2;

// Variables para almacenar los valores de temperatura y humedad
float temp = 0, hum = 0;
bool tempChanged = true, humChanged = true;

// Rangos para la temperatura y la humedad
const int tempMin = 18, tempMax = 25, humMin = 40, humMax = 60;

// Configuración inicial del hardware
void setup() {
  dht.setup(DHTPIN, DHTesp::DHT22);
  lcd.init();
  lcd.backlight();
  pinMode(backlightPin, OUTPUT);
}

// Bucle principal del programa
void loop() {
  // Leer los valores de temperatura y humedad del sensor DHT22
  float newTemp = dht.getTemperature(), newHum = dht.getHumidity();

  // Comprobar si los valores son válidos
  if (isnan(newTemp) || isnan(newHum)) return;

  // Comprobar si los valores han cambiado desde la última lectura
  if (newTemp != temp) tempChanged = true, temp = newTemp;
  if (newHum != hum) humChanged = true, hum = newHum;

  // Actualizar la pantalla y la retroiluminación si los valores han cambiado
  if (tempChanged || humChanged) updateDisplay(), updateBacklight(), tempChanged = humChanged = false;
  
  // Esperar 2 segundos antes de leer los valores nuevamente
  delay(2000);
}

// Función para actualizar la pantalla LCD con los valores de temperatura y humedad
void updateDisplay() {
  lcd.setCursor(0, 0);
  lcd.print(F("TEMP: "));
  lcd.print(temp);
  lcd.write((byte)0xDF);
  lcd.print(F("C  "));
  lcd.print(temp >= tempMin && temp <= tempMax ? F("OK  ") : F("F/R"));

  lcd.setCursor(0, 1);
  lcd.print(F("HUME: "));
  lcd.print(hum);
  lcd.print(F(" %  "));
  lcd.print(hum >= humMin && hum <= humMax ? F("OK  ") : F("F/R"));
}

// Función para actualizar la retroiluminación de la pantalla LCD en función de los rangos de temperatura y humedad
void updateBacklight() {
  bool tempInRange = (temp >= tempMin && temp <= tempMax), humInRange = (hum >= humMin && hum <= humMax);
  digitalWrite(backlightPin, tempInRange && humInRange ? LOW : HIGH);
  lcd.setBacklight(tempInRange && humInRange ? LOW : HIGH);
}