[RISOLTO] Libreria PID e cambio valori Kp Ki e Kd

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?

Ho risolto semplicemente così, mi era sfuggita questa funzione:

myPID.SetTunings(Kp, Ki, Kd);