#include <Wire.h>
#include <DHTesp.h>
#include <LiquidCrystal_I2C.h>

#define DHTPIN 15
#define DHTTYPE DHT22

DHTesp dht;

LiquidCrystal_I2C lcd(0x27, 20, 4);

const int MIN_TEMP = 18;
const int MAX_TEMP = 25;
const int MIN_HUMIDITY = 40;
const int MAX_HUMIDITY = 60;
const int BACKLIGHT_PIN = 2;

void setup() {
  dht.setup(DHTPIN, DHTesp::DHT22);
  lcd.init();
  lcd.backlight();
  pinMode(BACKLIGHT_PIN, OUTPUT);
}

void loop() {
  float temp, humidity;
  bool success = readDHT(&temp, &humidity);

  if (!success) {
    displayError("Error al leer el sensor DHT!");
    return;
  }

  bool tempInRange = isInRange(temp, MIN_TEMP, MAX_TEMP);
  bool humidityInRange = isInRange(humidity, MIN_HUMIDITY, MAX_HUMIDITY);

  updateDisplay(temp, humidity, tempInRange, humidityInRange);
  updateBacklight(tempInRange, humidityInRange);

  delay(2000);
}

bool readDHT(float* temp, float* humidity) {
  float newTemp = dht.getTemperature();
  float newHumidity = dht.getHumidity();

  if (isnan(newTemp) || isnan(newHumidity)) {
    return false;
  }

  *temp = newTemp;
  *humidity = newHumidity;
  return true;
}

void updateDisplay(float temp, float humidity, bool tempInRange, bool humidityInRange) {
  lcd.setCursor(0, 0);
  lcd.print("TEMP: ");
  lcd.print(temp);
  lcd.print((char)223);
  lcd.print("C  ");
  lcd.print(tempInRange ? "OK  " : "F/R");

  lcd.setCursor(0, 1);
  lcd.print("HUME: ");
  lcd.print(humidity);
  lcd.print(" %  ");
  lcd.print(humidityInRange ? "OK  " : "F/R");
}

void updateBacklight(bool tempInRange, bool humidityInRange) {
  bool backlightOn = tempInRange && humidityInRange;
  digitalWrite(BACKLIGHT_PIN, backlightOn ? LOW : HIGH);
  lcd.setBacklight(backlightOn ? LOW : HIGH);
}

void displayError(const char* message) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(message);
}

bool isInRange(float value, float minValue, float maxValue) {
  return (value >= minValue && value <= maxValue);
}
dht1:VCC
dht1:SDA
dht1:NC
dht1:GND
esp1:VIN
esp1:GND.2
esp1:D13
esp1:D12
esp1:D14
esp1:D27
esp1:D26
esp1:D25
esp1:D33
esp1:D32
esp1:D35
esp1:D34
esp1:VN
esp1:VP
esp1:EN
esp1:3V3
esp1:GND.1
esp1:D15
esp1:D2
esp1:D4
esp1:RX2
esp1:TX2
esp1:D5
esp1:D18
esp1:D19
esp1:D21
esp1:RX0
esp1:TX0
esp1:D22
esp1:D23
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
led1:A
led1:C