Ciao ragazzi, ho implementato il controllo PID per regolare la velocità di un paio di ventole tramite PWM.
Fino a qui tutto bene, il sistema funziona perfettamente da mesi, il problema sorge nel momento in cui voglio cambiare i parametri di regolazione tramite uno schermo, e quindi modificarli diciamo “al volo” senza dover riavviare l’arduino mega che utilizzo.
Il codice (semplificato) che utilizzo al momento e che funziona è questo:
#include <PID_v1.h>
double SPUmiditaFrigo;
double umiditaFrigo;
double SetpointPID, InputPID, OutputPID;
double Kp = 35;
double Ki = 0.5;
double Kd = 0.02;
PID myPID(&InputPID, &OutputPID, &SetpointPID, Kp, Ki, Kd, REVERSE);
void setup() {
myPID.SetMode(AUTOMATIC);
}
void loop() {
myPID.SetOutputLimits(0, 255);
SetpointPID = SPUmiditaFrigo;
InputPID = umiditaFrigo;
myPID.Compute();
}
Questo è invece il codice che sto tentando di implementare
#include <PID_v1.h>
double SPUmiditaFrigo;
double umiditaFrigo;
double umiditaEsterna;
double SetpointPID, InputPID, OutputPID;
double Kp;
double Ki;
double Kd = 0.02;
double Kp1, Ki1, Kp2, Ki2, Kp3, Ki3, Kp4, Ki4, Kp5, Ki5, Kp6, Ki6, Kp7, Ki7, Kp8, Ki8;
PID myPID(&InputPID, &OutputPID, &SetpointPID, Kp, Ki, Kd, REVERSE);
void setup() {
myPID.SetMode(AUTOMATIC);
}
void loop() {
myPID.SetOutputLimits(0, 255);
SetpointPID = SPUmiditaFrigo;
InputPID = umiditaFrigo;
if (umiditaEsterna <= 20) {
Kp = Kp1;
Ki = Ki1;
}
else if ((umiditaEsterna > 20) && (umiditaEsterna <= 30)) {
Kp = Kp2;
Ki = Ki2;
}
else if ((umiditaEsterna > 30) && (umiditaEsterna <= 40)) {
Kp = Kp3;
Ki = Ki3;
}
else if ((umiditaEsterna > 40) && (umiditaEsterna <= 50)) {
Kp = Kp4;
Ki = Ki4;
}
else if ((umiditaEsterna > 50) && (umiditaEsterna <= 60)) {
Kp = Kp5;
Ki = Ki5;
}
else if ((umiditaEsterna > 60) && (umiditaEsterna <= 70)) {
Kp = Kp6;
Ki = Ki6;
}
else if ((umiditaEsterna > 70) && (umiditaEsterna <= 80)) {
Kp = Kp7;
Ki = Ki7;
}
else if (umiditaEsterna > 80) {
Kp = Kp8;
Ki = Ki8;
}
myPID.Compute();
}
Ho provato a modificare l’ultima riga in questo modo, in maniera da aggiornare i nuovi valori ogni volta ma non cambia nulla, praticamente l’output calcolato è sempre zero:
PID myPID(&InputPID, &OutputPID, &SetpointPID, Kp, Ki, Kd, REVERSE);
myPID.Compute();
Qualche suggerimento?