#include <PID_v1.h>
#define temp A0 // Pin simulado para la lectura de temperatura
// Pin para el relé que controla la electroválvula
const int pinRele = 6;
// Configuración del PID
double kp = 20, ki = 3, kd = 1;
double temp_actual, salida_pid, setpoint;
int winsize = 10000; // Tamaño de la ventana para control de potencia
unsigned long winstart;
// Histéresis
double hysteresis = 5.0; // Histéresis de ±5°C
// Inicializar el PID
PID pid(&temp_actual, &salida_pid, &setpoint, kp, ki, kd, DIRECT);
void setup() {
pinMode(pinRele, OUTPUT);
digitalWrite(pinRele, LOW); // Asegura que la electroválvula esté cerrada al inicio
Serial.begin(9600);
// Configuración del PID
setpoint = 300.0; // Punto de consigna en grados Celsius
pid.SetOutputLimits(0, winsize); // Límite de salida para control de potencia
pid.SetMode(AUTOMATIC); // Activa el modo automático del PID
}
void loop() {
// Leer la temperatura actual desde el pin simulado
temp_actual = map(analogRead(temp), 0, 1023, 100, 400);
Serial.print("Setpoint: "); Serial.print(setpoint);
Serial.print("\tTemperatura: "); Serial.println(temp_actual);
// Calcular la salida del PID
pid.Compute();
// Control con histéresis
if (temp_actual >= (setpoint + hysteresis)) {
digitalWrite(pinRele, LOW); // Cierra la válvula si la temperatura supera el setpoint + histéresis
} else if (temp_actual <= (setpoint - hysteresis)) {
digitalWrite(pinRele, HIGH); // Abre la válvula si la temperatura cae por debajo del setpoint - histéresis
}
delay(100); // Pequeño retardo para evitar lecturas excesivas
}