from machine import ADC, Pin, PWM, I2C
from lcd_i2c import I2cLcd
from control_temperature import control_temperature
from Initialisierung import adc_ntc, adc_poti, lcd
from read_temperature import read_temperature
import time
import math
# Funktion zur Regelung der Temperatur
def control_temperature(setpoint, current_temperature, previous_error, integral, previous_time):
# PID-Parameter
kp = 1 # Proportionaler Anteil
ki = 0.5 # Integraler Anteil
kd = 0.3 # Differenzieller Anteil
# Fehler berechnen
error = setpoint - current_temperature
# Zeit seit der letzten Iteration berechnen
current_time = time.ticks_ms()
delta_time = current_time - previous_time
# Integral berechnen (Summe der vergangenen Fehler)
integral = integral + error * delta_time / 1000 # Delta-Zeit in Sekunden umrechnen
# Differenzial berechnen (Änderung des Fehlers)
derivative = (error - previous_error) / delta_time if delta_time > 0 else 0
# PID-Regelung berechnen
pid_output = kp * error + ki * integral + kd * derivative
# Begrenze den PWM-Wert auf den zulässigen Bereich (0 bis 65535)
pwm_value = max(0, min(int(pid_output), 5000))
# Setze den PWM-Wert
pwm.duty_u16(pwm_value)
# PWM-Wert in Prozent ausgeben
pwm_percentage = pwm_value / 5000 * 100.0
# Aktualisiere vorherigen Fehler und Zeit für die nächste Iteration
previous_error = error
previous_time = current_time
print("PID-Regler Ausgabe (PWM): {:.2f}%".format(pwm_percentage))
print("PID-Regler Ausgabe (PWM):", pid_output)
return previous_error, integral, previous_time
# Funktion zur Anzeige der Temperatur auf dem LCD1602-Display
def display_temperature(temperature, setpoint, heating_active):
lcd.clear()
lcd.putstr("Temp: {:.2f} C\nSoll: {:.2f} C".format(temperature, setpoint))
# Anzeige des Heizungszustands
if heating_active:
lcd.putstr("+")
else:
lcd.putstr("-")
time.sleep(2)
# Endlosschleife zur kontinuierlichen Regelung der Temperatur und Anzeige auf dem LCD1602-Display
setpoint_temperature = 26.0 # Beispiel-Sollwert, passe dies entsprechend an
previous_error = 0
integral = 0
previous_time = time.ticks_ms() # Initialisierung der Zeitvariable
while True:
current_temperature = read_temperature()
# Lies den Wert des Potentiometers
adc_poti_value = adc_poti.read_u16()
setpoint_temperature = adc_poti_value * 100 / 65535.0 # Wert des Potis als Solltemperatur
# Beispiel: Heizung aktivieren, wenn Ist-Temperatur unter Soll-Temperatur liegt
heating_active = current_temperature < setpoint_temperature
previous_error, integral, previous_time = control_temperature(setpoint_temperature, current_temperature, previous_error, integral, previous_time, PWM)
display_temperature(current_temperature, setpoint_temperature, heating_active)
time.sleep(1) # Warte 1 Sekunde zwischen den Messungen und Regelungen
print("Aktuelle Temperatur:", current_temperature, "°C")
print("Solltemperatur:", setpoint_temperature, "°C")
print("Heizung aktiv:", heating_active)