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);
}
}