#include <Arduino.h>
#include <Ticker.h>
#include "sensortemperatura.h"
Ticker blinker;
// Pines de salida
#define PWM_PIN 5 // Salida PWM para ajustar frío/calor
#define MODE_PIN 4 // Salida para cambiar entre frío (0) y calor (1)
// Configuración del PWM
const int PWMChannel = 0;
const int frequency = 1000; // Frecuencia PWM
const int resolution = 8; // Resolución de 8 bits (0-255)
// Parámetros PID
const float Kp = 3.0;
const float Ki = 0.01;
const float Kd = 0.2;
// Variables del PID
float sn = 0; // Acumulador de error (integral)
float en = 0; // Error actual
float enOld = 0; // Error anterior
float mn = 0; // Salida del controlador
// Temperatura de referencia y medida
float tempRef = 26.0; // Temperatura de referencia inicial (°C)
float tempAct = 0.0; // Temperatura actual (°C)
// Pulsadores para ajustar la temperatura de referencia
#define BUTTON_UP 12
#define BUTTON_DOWN 14
void actuadorBomba() {
if (mn >= 0) {
digitalWrite(MODE_PIN, HIGH); // Modo calor
ledcWrite(PWMChannel, min(abs(mn), 255)); // PWM limitado a 255
} else {
digitalWrite(MODE_PIN, LOW); // Modo frío
ledcWrite(PWMChannel, min(abs(mn), 255));
}
}
// Rutina del controlador PID
void PIDControl() {
sn += en; // Acumulador integral
mn = Kp * en + Ki * sn + Kd * (en - enOld); // Control PID
enOld = en; // Actualiza el error anterior
}
void onTimerISR() {
readTemperature();
en = tempRef - tempAct; // Calcula el error
PIDControl();
actuadorBomba();
}
// Rutina para leer la temperatura actual
void readTemperature() {
tempAct = readTemp(); // Llama a la función de la librería sensortemperatura.h
}
// Rutina para ajustar la temperatura de referencia
void ajustarTempRef() {
if (digitalRead(BUTTON_UP) == LOW) {
tempRef += 0.5; // Incrementa la referencia en 0.5 °C
}
if (digitalRead(BUTTON_DOWN) == LOW) {
tempRef -= 0.5; // Decrementa la referencia en 0.5 °C
}
}
void setup() {
Serial.begin(115200);
// Configuración de pines
pinMode(PWM_PIN, OUTPUT);
pinMode(MODE_PIN, OUTPUT);
pinMode(BUTTON_UP, INPUT_PULLUP);
pinMode(BUTTON_DOWN, INPUT_PULLUP);
// Configuración del PWM
ledcSetup(PWMChannel, frequency, resolution);
ledcAttachPin(PWM_PIN, PWMChannel);
// Inicialización del Ticker para control PID cada 100 ms
blinker.attach(0.1, onTimerISR);
Serial.println("Sistema de climatización iniciado");
}
void loop() {
ajustarTempRef(); // Verifica pulsadores
// Mostrar información en el monitor serie
Serial.print("Temp Ref: ");
Serial.print(tempRef);
Serial.print(" °C, Temp Actual: ");
Serial.print(tempAct);
Serial.print(" °C, Error: ");
Serial.print(en);
Serial.print(", Actuación (mn): ");
Serial.println(mn);
delay(100); // Retardo para evitar sobrecargar el monitor serie
}