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

// Configuración del sensor DHT
#define DHTPIN 2      // Pin donde está conectado el sensor
#define DHTTYPE DHT22 // DHT 22 (AM2301)

// Inicializar el objeto DHT
DHT dht(DHTPIN, DHTTYPE);

// Inicializar el LCD con la dirección I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);  // Dirección 0x27, display 20x4

int pinled1 = 12;   // red pinled 1 is connect to pin 12 in arduino
int pinled2 = 11;   // yellow pinled 2 is connect to pin 11 in arduino
int pinled3 = 10;   // green pinled 3 is connect to pin 10 in arduino

int sw1 = 6;        // Pin para la llave 1
int sw2 = 7;        // Pin para la llave 2

int estado, estadoAnt = 0;
int estadoLlave1, estadoLlave2;
unsigned long timeDHT, timeDelay;

void setup() {
  // Iniciar el display LCD con 20 columnas, 4 filas
  lcd.begin(20, 4);
  lcd.backlight();

  // Iniciar el sensor DHT
  dht.begin();
  Serial.begin(9600);
  // Configurar los pines de las llaves como entrada
  pinMode(sw1, INPUT_PULLUP);  // Usar resistencia pull-up interna
  pinMode(sw2, INPUT_PULLUP);  // Usar resistencia pull-up interna

  // Mensaje inicial
  lcd.setCursor(0, 0);
  lcd.print("Temp y Humedad:");
  estado = 255;
  estadoAnt = estado;
}

void loop() {
  char buffer[20], str[6];  
  
  // Esperar 2 segundos antes de la siguiente lectura
  if (millis() - timeDHT > 2000UL) {
    // Leer la humedad y la temperatura
    float humedad = dht.readHumidity();
    float temperatura = dht.readTemperature();

    // Revisar si la lectura es correcta
    if (isnan(humedad) || isnan(temperatura)) {
      lcd.setCursor(0, 1);
      lcd.print("Error al leer DHT!");
      return;
    }
    lcd.setCursor(0, 1);
    dtostrf(temperatura, 4,1, str);
    sprintf(buffer, "Temp: %s", str);
    lcd.print(buffer);
    Serial.println(buffer);

    lcd.setCursor(0, 2);    
    dtostrf(humedad, 4, 1, str);
    sprintf(buffer, "Hum : %s", str);
    lcd.print(buffer);
    Serial.println(buffer);

    timeDHT = millis();
  }

  // Leer el estado de las llaves
  estadoLlave1 = digitalRead(sw1); // switch 1 read the digital logic 1 or 0
  estadoLlave2 = digitalRead(sw2); // switch 2 read the digital logic 1 or 0
  // Mostrar el estado de las llaves en la última línea
  estado = estadoLlave2 << 1 | estadoLlave1;
  if (estado != estadoAnt) {
    Serial.println("Estado1: " + String(estadoLlave1));
    Serial.println("Estado2: " + String(estadoLlave2));
    Serial.println("Estado : " + String(estado));
  }
  estadoAnt = estado;
  lcd.setCursor(0, 3);
  switch (estado) {
    case 0:
      lcd.print("MODO: APAGADO   ");
      break;
    case 1:
      lcd.print("MODO: VEGETACION");
      break;
    case 2:
      lcd.print("MODO: FLORACION ");
      break;
  } 
}