/*
#include <Ticker.h>
// Simulación de función de lectura de temperatura
float readTemp() {
return random(20, 30);
}
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((int)abs(mn), 255)); // Convierte a int y limita a 255
} else {
digitalWrite(MODE_PIN, LOW); // Modo frío
ledcWrite(PWMChannel, min((int)abs(mn), 255)); // Convierte a int y limita a 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 (simulada)
void readTemperature() {
tempAct = readTemp(); // Simulación de lectura de temperatura
}
// 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
}
*/
#include <Ticker.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
volatile 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
// Tiempos para el control de rebotes
volatile unsigned long lastDebounceTimeUp = 0;
volatile unsigned long lastDebounceTimeDown = 0;
const unsigned long debounceDelay = 200; // Tiempo de debounce en ms
// Simulación de función de lectura de temperatura
float readTemp() {
return random(20, 30);
}
void actuadorBomba() {
if (mn >= 0) {
digitalWrite(MODE_PIN, HIGH); // Modo calor
ledcWrite(PWMChannel, min((int)abs(mn), 255)); // Convierte a int y limita a 255
} else {
digitalWrite(MODE_PIN, LOW); // Modo frío
ledcWrite(PWMChannel, min((int)abs(mn), 255)); // Convierte a int y limita a 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() {
en = tempRef - readTemp(); // Calcula el error
PIDControl();
actuadorBomba();
}
// ISR para ajustar la temperatura de referencia
void IRAM_ATTR ISR_UP() {
unsigned long currentTime = millis();
if (currentTime - lastDebounceTimeUp > debounceDelay) {
tempRef += 0.5; // Incrementa la referencia en 0.5 °C
lastDebounceTimeUp = currentTime;
}
}
void IRAM_ATTR ISR_DOWN() {
unsigned long currentTime = millis();
if (currentTime - lastDebounceTimeDown > debounceDelay) {
tempRef -= 0.5; // Decrementa la referencia en 0.5 °C
lastDebounceTimeDown = currentTime;
}
}
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);
// Configuración de interrupciones
attachInterrupt(digitalPinToInterrupt(BUTTON_UP), ISR_UP, FALLING);
attachInterrupt(digitalPinToInterrupt(BUTTON_DOWN), ISR_DOWN, FALLING);
// Inicialización del Ticker para control PID cada 100 ms
blinker.attach(0.1, onTimerISR);
Serial.println("Sistema de climatización iniciado");
}
void loop() {
// Mostrar información en el monitor serie
Serial.print("Temp Ref: ");
Serial.print(tempRef);
Serial.print(" °C, Temp Actual: ");
Serial.print(readTemp());
Serial.print(" °C, Error: ");
Serial.print(en);
Serial.print(", Actuación (mn): ");
Serial.println(mn);
delay(100); // Retardo para evitar sobrecargar el monitor serie
}