//-------------------------------------------------------------------//
/*
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);
}