class PIDController {
public:
PIDController(float kp, float ki, float kd, float setpoint) {
this->kp = kp;
this->ki = ki;
this->kd = kd;
this->setpoint = setpoint;
this->prevError = 0;
this->integral = 0;
}
float calculate(float processVariable) {
float error = setpoint - processVariable;
integral += error;
float derivative = error - prevError;
float output = kp * error + ki * integral + kd * derivative;
prevError = error;
return output;
}
private:
float kp, ki, kd, setpoint;
float prevError, integral;
};
// Parametry PID regulátoru
float kp = 2.0;
float ki = 0.5;
float kd = 1.0;
float setpoint = 50.0; // Požadovaná teplota
PIDController pidController(kp, ki, kd, setpoint);
void setup() {
Serial.begin(9600);
// Nastavení výstupního pinu pro topné těleso
pinMode(9, OUTPUT);
}
void loop() {
float currentTemperature = readTemperature(); // Čtení aktuální teploty ze senzoru
float pidOutput = pidController.calculate(currentTemperature);
// PID výstup může být mimo rozsah PWM (0-255), proto je potřeba jej omezit
int outputValue = constrain(pidOutput, 0, 255);
// Nastavení výkonu topného tělesa pomocí PWM
analogWrite(9, outputValue);
// Výpis hodnot pro ladění
Serial.print("Teplota: ");
Serial.print(currentTemperature);
Serial.print(" °C, PID výstup: ");
Serial.println(outputValue);
delay(1000); // Zpoždění 1 sekundu
}
// Funkce pro čtení teploty (simulace, zde použijte váš senzor)
float readTemperature() {
// Tento příklad používá pevnou hodnotu, v praxi zde načtěte hodnotu ze senzoru
return analogRead(D2) * (5.0 / 1023.0) * 100.0; // Převod na teplotu
}