Controlador PI - código alternativo

🧩 Syntax:
#define Vin 5.0
#define T0 298.15
#define Rt 10000
#define R0 10000
#define T1 273.15
#define T2 373.15
#define RT1 35563
#define RT2 549
float beta = 0.0;
float Rinf = 0.0;
float TempKelvin = 0.0;
float TempCelsius = 0.0;
float Vout = 0.0;
float Rout = 0.0;

int valorPWM = 0;

float erroIntegral = 0.0;
const float Kp = 20; // Ajuste conforme necessário
const float Ki = 10; // Ajuste conforme necessário

int setpoint = 50; // Temperatura desejada
const int tempmax = 63; // Valor máximo de temperatura para cálculo
unsigned long anteriorPrint = 0, anteriorCalculo = 0;

void setup() {
  Serial.begin(9600);
  beta = (log(RT1/RT2)) / ((1 / T1) - (1 / T2));
  Rinf = R0 * exp(-beta / T0);
  anteriorPrint = millis();
  anteriorCalculo = millis();
  delay(100);

}

void loop() {


  float erro = TempCelsius - setpoint;
  erroIntegral += erro;

  // Limitar o wind-up do integrador
  erroIntegral = constrain(erroIntegral, -50.0, 50.0);

  int sinalControle = Kp * erro + Ki * erroIntegral;

  sinalControle = constrain(sinalControle, 55, 255); // Limita a saída para o intervalo PWM
  analogWrite(3, sinalControle);

  if(millis() >= anteriorPrint + 1000){

    anteriorPrint = millis();
    Vout = Vin * ((float)(analogRead(0)) / 1024.0);
    Rout = (Rt * Vout / (Vin - Vout));
    TempKelvin = (beta / log(Rout / Rinf)); 
    TempCelsius = TempKelvin - 273.15;
    Serial.print("Temperatura em Celsius: ");
    Serial.print(TempCelsius);
    Serial.print(" Erro:");
    Serial.print(erro);
    Serial.print(" Erro Integral:");
    Serial.print(erroIntegral);
    Serial.print(" SinalControle:");
    Serial.println(sinalControle);

  }



  
}