#include <DHTesp.h>
#include <Wire.h>
#include <LiquidCrystal.h>
// Definición de los pines del sensor DHT22
#define DHT_PIN 21
// Definición de los pines de salida para los relés
#define RELAY_PIN_1 23
#define RELAY_PIN_2 15
// Definición de los pines de salida para los LEDs
#define LED_PIN_RED 12
#define LED_PIN_GREEN 13
#define LED_PIN_BLUE 14
// Parámetros del control PID
double setpoint = 25.0; // Temperatura objetivo
double Kp = 2.0; // Coeficiente proporcional
double Ki = 0.5; // Coeficiente integral
double Kd = 1.0; // Coeficiente derivativo
// Variables para el control PID
double input, output;
double error, lastError, sumError;
// Definición del objeto DHTesp
DHTesp dht;
// Definición del objeto LiquidCrystal
LiquidCrystal lcd(27, 22, 32, 33, 25, 26);
// Función de inicialización
void setup() {
Serial.begin(115200);
dht.setup(DHT_PIN, DHTesp::DHT22);
lcd.begin(16, 2);
// Configurar los pines de salida de los relés
pinMode(RELAY_PIN_1, OUTPUT);
pinMode(RELAY_PIN_2, OUTPUT);
// Configurar los pines de salida de los LEDs
pinMode(LED_PIN_RED, OUTPUT);
pinMode(LED_PIN_GREEN, OUTPUT);
pinMode(LED_PIN_BLUE, OUTPUT);
// Mostrar el mensaje de inicio en la pantalla LCD
lcd.setCursor(0, 0);
lcd.print("Control PID Temp.");
}
// Función para calcular la salida del control PID
double computePID() {
error = setpoint - input;
double P = Kp * error;
sumError += error;
double I = Ki * sumError;
double D = Kd * (error - lastError);
lastError = error;
double output = P + I + D;
return output;
}
// Función para obtener el estado de la temperatura
String getTemperatureStatus(double temperature) {
if (temperature < setpoint - 2) {
return "Baja";
} else if (temperature > setpoint + 2) {
return "Alta";
} else {
return "Correcta";
}
}
// Función principal
void loop() {
// Lectura de la temperatura desde el sensor DHT22
float humidity = dht.getHumidity();
float temperature = dht.getTemperature();
// Actualizar la temperatura y el estado en la pantalla LCD
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C ");
lcd.setCursor(0, 1);
lcd.print(getTemperatureStatus(temperature));
// Control de temperatura
if (temperature < setpoint - 2) {
digitalWrite(RELAY_PIN_1, HIGH);
digitalWrite(RELAY_PIN_2, LOW);
digitalWrite(LED_PIN_RED, LOW);
digitalWrite(LED_PIN_GREEN, LOW);
digitalWrite(LED_PIN_BLUE, HIGH);
} else if (temperature > setpoint + 2) {
digitalWrite(RELAY_PIN_1, LOW);
digitalWrite(RELAY_PIN_2, HIGH);
digitalWrite(LED_PIN_RED, HIGH);
digitalWrite(LED_PIN_GREEN, LOW);
digitalWrite(LED_PIN_BLUE, LOW);
} else {
digitalWrite(RELAY_PIN_1, LOW);
digitalWrite(RELAY_PIN_2, LOW);
digitalWrite(LED_PIN_RED, LOW);
digitalWrite(LED_PIN_GREEN, HIGH);
digitalWrite(LED_PIN_BLUE, LOW);
}
delay(1000); // Esperar 1 segundo antes de la siguiente lectura
}