#include <DHTesp.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include <WiFiConnectionManager.h>
#include <ArduinoCloudThing.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);
// Variables para Arduino Cloud
WiFiConnectionManager wifi;
ArduinoCloudThing cloudThing;
// Variables para control manual de los relés
bool manualControlRelay1 = false;
bool manualControlRelay2 = false;
// 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);
// Inicializar la conexión WiFi
wifi.connect("nombre_red_wifi", "contraseña_wifi");
// Inicializar Arduino Cloud
cloudThing.begin(&wifi);
cloudThing.addProperty("temperature", input);
cloudThing.addProperty("setpoint", setpoint);
cloudThing.addProperty("relay1", false);
cloudThing.addProperty("relay2", false);
cloudThing.addProperty("ledRed", false);
cloudThing.addProperty("ledGreen", false);
cloudThing.addProperty("ledBlue", false);
cloudThing.addGaugeProperty("temperatureGauge", "Temperature", input, 0, 50);
// Mostrar el mensaje de inicio en la pantalla LCD
lcd.setCursor(0, 0);
lcd.print("Control PID Temp.");
// Suscribirse a los cambios de propiedad en Arduino Cloud
cloudThing.attachPropertyChange("relay1", onRelay1Change);
cloudThing.attachPropertyChange("relay2", onRelay2Change);
cloudThing.attachPropertyChange("ledRed", onLEDRedChange);
cloudThing.attachPropertyChange("ledGreen", onLEDGreenChange);
cloudThing.attachPropertyChange("ledBlue", onLEDBlueChange);
}
// 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 para controlar el relé 1
void controlRelay1(bool state) {
digitalWrite(RELAY_PIN_1, state ? HIGH : LOW);
}
// Función para controlar el relé 2
void controlRelay2(bool state) {
digitalWrite(RELAY_PIN_2, state ? HIGH : LOW);
}
// Función para controlar el LED Rojo
void controlLEDRed(bool state) {
digitalWrite(LED_PIN_RED, state ? HIGH : LOW);
}
// Función para controlar el LED Verde
void controlLEDGreen(bool state) {
digitalWrite(LED_PIN_GREEN, state ? HIGH : LOW);
}
// Función para controlar el LED Azul
void controlLEDBlue(bool state) {
digitalWrite(LED_PIN_BLUE, state ? HIGH : LOW);
}
// Función para manejar los cambios en la propiedad "relay1" de Arduino Cloud
void onRelay1Change() {
bool relay1State = cloudThing.getProperty("relay1");
if (!manualControlRelay1) {
controlRelay1(relay1State);
}
}
// Función para manejar los cambios en la propiedad "relay2" de Arduino Cloud
void onRelay2Change() {
bool relay2State = cloudThing.getProperty("relay2");
if (!manualControlRelay2) {
controlRelay2(relay2State);
}
}
// Función para manejar los cambios en la propiedad "ledRed" de Arduino Cloud
void onLEDRedChange() {
bool ledRedState = cloudThing.getProperty("ledRed");
controlLEDRed(ledRedState);
}
// Función para manejar los cambios en la propiedad "ledGreen" de Arduino Cloud
void onLEDGreenChange() {
bool ledGreenState = cloudThing.getProperty("ledGreen");
controlLEDGreen(ledGreenState);
}
// Función para manejar los cambios en la propiedad "ledBlue" de Arduino Cloud
void onLEDBlueChange() {
bool ledBlueState = cloudThing.getProperty("ledBlue");
controlLEDBlue(ledBlueState);
}
// Función principal
void loop() {
// Lectura de la temperatura desde el sensor DHT22
float humidity = dht.getHumidity();
float temperature = dht.getTemperature();
input = temperature; // Actualizar la entrada del control PID
// 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));
// Actualizar las propiedades en Arduino Cloud
cloudThing.updateProperty("temperature", input);
cloudThing.updateGaugeProperty("temperatureGauge", input);
// Control de temperatura
output = computePID(); // Calcular la salida del control PID
if (temperature < setpoint - 2) {
controlRelay1(true);
controlRelay2(false);
} else if (temperature > setpoint + 2) {
controlRelay1(false);
controlRelay2(true);
} else {
controlRelay1(false);
controlRelay2(false);
}
// Esperar 1 segundo antes de la siguiente lectura
delay(1000);
}