// Incluimos las librerías necesarias
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
// Definimos el pin del DHT, el pin del relé, y los pines de los botones
int pinDHT = 15;
int relayPin = 2; // Pin donde conectamos el relé
int buttonIncreasePin = 5; // Pin D5 para aumentar el set point
int buttonDecreasePin = 18; // Pin D6 para disminuir el set point
DHTesp dht;
// Variables para controlar el set point y el tiempo
float setPoint = 150; // Set point inicial
float temperatureThreshold = 50.0; // Umbral de temperatura para el relé
bool isHeating = false; // Indica si el sistema está en proceso de calentamiento
bool isDehumidifying = true; // Inicia el proceso de deshumidificación
unsigned long startTime = 0; // Almacena el tiempo en que comenzó a calentar
// Variables para controlar los pulsos de deshumidificación
const int relayOnTime = 2000; // 2 segundos encendido
const int relayOffTime = 3000; // 3 segundos apagado
bool relayState = LOW; // Estado del relé durante el proceso de deshumidificación
unsigned long lastPulseTime = 0; // Tiempo de la última acción del relé
// Tiempo total de deshumidificación (15 segundos = 15,000 ms)
const unsigned long dehumidificationDuration = 15000;
// Inicializamos el LCD (I2C 0x27, con 16 columnas y 2 filas)
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
void setup() {
Serial.begin(115200);
// Inicializamos el sensor DHT
dht.setup(pinDHT, DHTesp::DHT22);
// Inicializamos el pin del relé como salida
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW); // Inicialmente apagamos el relé
// Configuramos los pines de los botones como entrada con resistencia pull-up
pinMode(buttonIncreasePin, INPUT_PULLUP);
pinMode(buttonDecreasePin, INPUT_PULLUP);
// Inicializamos el LCD
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Inicializando...");
delay(2000); // Esperamos 2 segundos para iniciar
LCD.clear();
}
void loop() {
unsigned long currentTime = millis();
// Proceso de deshumidificación (durante 15 segundos)
if (isDehumidifying) {
// Verificar si han pasado los 15 segundos
if (currentTime - startTime < dehumidificationDuration) {
// Ciclo de encendido y apagado del relé
if (relayState == LOW && currentTime - lastPulseTime >= relayOffTime) {
relayState = HIGH;
lastPulseTime = currentTime;
digitalWrite(relayPin, HIGH); // Encender el relé
} else if (relayState == HIGH && currentTime - lastPulseTime >= relayOnTime) {
relayState = LOW;
lastPulseTime = currentTime;
digitalWrite(relayPin, LOW); // Apagar el relé
}
// Mostrar el estado en el LCD
LCD.setCursor(0, 0);
LCD.print("Iniciando calen");
LCD.setCursor(0, 1);
LCD.print("SP: ");
LCD.print(String(setPoint, 1)); // Mostrar el set point con 1 decimal
LCD.print((char)223); // Símbolo de grado (°)
LCD.print("C "); // Espacio para borrar el resto de la línea
} else {
// Finaliza la deshumidificación después de 15 segundos
isDehumidifying = false;
digitalWrite(relayPin, LOW); // Asegurarse de que el relé esté apagado al finalizar
}
} else {
// Una vez finalizada la deshumidificación, inicia el calentamiento
TempAndHumidity data = dht.getTempAndHumidity();
// Mostramos los datos en el monitor serie
Serial.println("Temperatura: " + String(data.temperature, 2) + "°C");
Serial.println("Set Point: " + String(setPoint, 1) + "°C");
Serial.println("---");
// Mostramos los datos en el LCD
LCD.setCursor(0, 0); // Fila 0, columna 0
LCD.print("Temp: ");
LCD.print(String(data.temperature, 2)); // Mostrar la temperatura con 2 decimales
LCD.print((char)223); // Símbolo de grado (°)
LCD.print("C");
LCD.setCursor(0, 1); // Fila 1, columna 0
LCD.print("SP: ");
LCD.print(String(setPoint, 1)); // Mostrar el set point con 1 decimal
LCD.print((char)223); // Símbolo de grado (°)
LCD.print("C ");
// Comprobamos si la temperatura está por debajo del umbral
if (data.temperature < temperatureThreshold) {
digitalWrite(relayPin, HIGH); // Encender el relé si está por debajo del set point
if (!isHeating) {
startTime = millis(); // Reiniciar el tiempo si el calentamiento empieza de nuevo
isHeating = true;
}
} else {
digitalWrite(relayPin, LOW); // Apagar el relé cuando alcanza el set point
isHeating = false; // Indicar que el sistema ya no está calentando
}
// Calcular y mostrar el tiempo transcurrido desde que comenzó el calentamiento
if (isHeating) {
unsigned long elapsedTime = (millis() - startTime) / 1000; // Tiempo en segundos
LCD.setCursor(8, 1); // Colocar el cursor para mostrar el tiempo
LCD.print("T: ");
LCD.print(elapsedTime);
LCD.print("s "); // Espacio para borrar el resto de la línea
}
}
// Esperamos 250 ms antes de la siguiente lectura
delay(250);
}