//-------------------------------------------------------------------//
/*
Nombre del programa: T02_dht22_termometer.ino
Descripción del programa: 
El siguiente programa muestre un termómetro con los 4 leds de la 
shield + el led bicolor. El funcionamiento será el siguiente:
- Si la temperatura es <= 16 no se encenderá ningún led
- Cada vez que la temperatura suba 2 grados se encerderá un led de 
los cuatro (max 24º todos encendidos).
- Si la temperatura es >24º debe parpadear el led bicolor rojo.
*/
#include <DHTesp.h>
DHTesp dht;
// Definición de pines para los elementos
#define dht_pin 26
#define led_rojo 18
#define d1 12
#define d2 13
#define d3 5
#define d4 23
// Definición de constantes de temperatura
float temp_min=16.0;
float temp_max=24.0;
float incr_temp=2.0;
//Constantes de tiempo para el parpadeo del LED rojo
int tiempo_parpadeo=250;
void setup() {
  // Inicialización de los pines
  pinMode(led_rojo, OUTPUT);
  pinMode(d1, OUTPUT);
  pinMode(d2, OUTPUT);
  pinMode(d3, OUTPUT);
  pinMode(d4, OUTPUT);
  // Inicialización del sensor DHT22
  dht.setup(dht_pin, DHTesp::DHT22);
  // Inicialización del puerto serie
  Serial.begin(9600);
}
void loop() {
  // Lectura de la temperatura
  float temp=dht.getTemperature();
  // Si la lectura de la temperatura es exitosa
  if (!isnan(temp)) {
    Serial.print("Temperatura: ");
    Serial.println(temp);
    // Si la temperatura es menor de 16 grados
    if (temp<=temp_min) {
      // Apagar todos los LEDs
      for (int i=d1; i<=d4; i++) {
        digitalWrite(i, LOW);
      }
    } 
    // Si la temperatura está entre 16 y 24 grados
    else if (temp<=temp_max) {
      // Calcular el número de LEDs a encender
      int num_leds_encendidos=(int)((temp-temp_min)/incr_temp+1.0);
      // Encender los LEDs correspondientes
      for (int i=d1; i<d1+num_leds_encendidos; i++) {
        digitalWrite(i, HIGH);
      }
      // Apagar los LEDs restantes
      for (int i=d1+num_leds_encendidos; i<=d4; i++) {
        digitalWrite(i, LOW);
      }
    } 
    // Si la temperatura es mayor que 24 grados
    else if (temp > temp_max) {
      // Encender todos los LEDs
      for (int i=d1; i<=d4; i++) {
        digitalWrite(i, HIGH);
      }
      // Parpadear el LED rojo
      unsigned long tiempo_actual = millis();
      static unsigned long tiempo_anterior = 0;
      static bool estado_led=LOW;
      if (tiempo_actual-tiempo_anterior>=tiempo_parpadeo) {
        estado_led=!estado_led;
        digitalWrite(led_rojo, estado_led);
        tiempo_anterior=tiempo_actual;
      }
    }
  }
  // Esperar unos 500 ms antes de la próxima lectura
  delay(500);
}