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