#include <DHT.h>
// Definición del tipo de sensor y pin de conexión
#define DHTPIN 2
#define DHTTYPE DHT22
// Pins de los relés
#define RELAY_PIN_1 3
#define RELAY_PIN_2 4
// Constantes de temperatura para operación
#define T_min 20 // Temperatura mínima
#define T_max 25 // Temperatura máxima
// Constantes de tendencia
#define Tendencia_min -2
#define Tendencia_max 2
// Intervalo de muestreo en milisegundos
#define t_muestreo 5000 // 120 segundos
// Variables para mantener el estado anterior de la temperatura y la tendencia
float temperatura_previa = 0;
int N_tendencia = 0;
int marcador = 0;
DHT dht(DHTPIN, DHTTYPE);
// Prototipos de funciones
void accion_min();
void accion_max();
void calcular_tendencia(float temperatura_actual, int *p_tendencia);
void imprimir_serial(float temperatura_actual, int tendencia_actual);
void ejecutar_accion(int tendencia_actual, float temperatura_actual);
void setup() {
// Inicializar el monitor serial
Serial.begin(9600);
// Comenzar el sensor DHT
dht.begin();
// Inicializar los relés como salidas
pinMode(RELAY_PIN_1, OUTPUT);
pinMode(RELAY_PIN_2, OUTPUT);
// Apagar inicialmente los relés
digitalWrite(RELAY_PIN_1, LOW);
digitalWrite(RELAY_PIN_2, LOW); // Relé 2 encendido inicialmente
}
void loop() {
// Realizar la lectura del sensor DHT
float temperatura_actual = dht.readTemperature();
// Imprimir los valores en el monitor serie
imprimir_serial(temperatura_actual, N_tendencia);
// Calcular la tendencia de la temperatura
calcular_tendencia(temperatura_actual, &N_tendencia);
// Ejecutar la acción correspondiente
ejecutar_accion(N_tendencia, temperatura_actual);
// Actualizar la temperatura previa
temperatura_previa = temperatura_actual;
// Esperar el tiempo de muestreo antes de realizar otra lectura
delay(t_muestreo);
}
// Función para calcular la tendencia de la temperatura
void calcular_tendencia(float temperatura_actual, int *p_tendencia) {
if (temperatura_actual == temperatura_previa) {
*p_tendencia = 0;
} else if (temperatura_actual < temperatura_previa && temperatura_actual < T_min) {
(*p_tendencia)--;
if (*p_tendencia < Tendencia_min){
*p_tendencia = Tendencia_min;
}
} else if (temperatura_actual > temperatura_previa && temperatura_actual > T_max) {
(*p_tendencia)++;
if (*p_tendencia > Tendencia_max){
*p_tendencia = Tendencia_max;
}
}
}
// Función para ejecutar la acción correspondiente
void ejecutar_accion(int tendencia_actual, float temperatura_actual) {
switch (tendencia_actual) {
case 0:
if (temperatura_actual > T_max) {
accion_max();
} else if (temperatura_actual < T_min) {
accion_min();
}
break;
case Tendencia_max:
accion_max(); // Ejecutar acción cuando la tendencia es al alza
break;
case Tendencia_min:
accion_min(); // Ejecutar acción cuando la tendencia es a la baja
break;
default:
// Verificar si la temperatura está dentro del rango
if (temperatura_actual >= T_min && temperatura_actual <= T_max) {
digitalWrite(RELAY_PIN_1, LOW);
digitalWrite(RELAY_PIN_2, LOW);
}
break;
}
}
// Función para ejecutar la acción cuando la temperatura cae por debajo de Tmin
void accion_min() {
digitalWrite(RELAY_PIN_1, HIGH); // Encender el relé 1
digitalWrite(RELAY_PIN_2, LOW); // Apagar el relé 2
}
// Función para ejecutar la acción cuando la temperatura supera Tmax
void accion_max() {
digitalWrite(RELAY_PIN_1, LOW); // Apagar el relé 1
digitalWrite(RELAY_PIN_2, HIGH); // Encender el relé 2
}
// Función para imprimir los valores en el monitor serie
void imprimir_serial(float temperatura_actual, int tendencia_actual) {
Serial.print("\nTemperatura: ");
Serial.print(temperatura_actual);
Serial.println(" °C");
Serial.print("\nTendencia: ");
Serial.print(tendencia_actual);
Serial.print("\nMarcador: ");
Serial.print(marcador);
}