import time
import dht
from pid import PID
from machine import Pin, I2C, PWM
import ssd1306
sensor = dht.DHT22(Pin(14))
motor = PWM(Pin(12), freq=1000)
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
sensor.measure()
temp = sensor.temperature()
TMIN = 15.0
TMAX = 50.0
setpoint = 37.0
temp_norm = (temp - TMIN) / (TMAX - TMIN)
setpoint_norm = (setpoint - TMIN) / (TMAX - TMIN)
pid = PID(Kp=1023, Ki=0.05, Kd=1)
pid.output_limits = (0, 1023)
pid.setpoint = setpoint_norm
while True:
try:
sensor.measure()
temp = sensor.temperature()
TMIN = 15.0
TMAX = 50.0
setpoint = 37.0
temp_norm = (temp - TMIN) / (TMAX - TMIN)
setpoint_norm = (setpoint - TMIN) / (TMAX - TMIN)
pid = PID(Kp=1023, Ki=0.05, Kd=1)
pid.output_limits = (0, 1023)
pid.setpoint = setpoint_norm
output = pid(temp_norm)
motor.duty(int(output))
oled.fill(0)
oled.text("Temp: {:.1f} C".format(temp), 0, 0)
oled.text("Set: {:.1f} C".format(setpoint), 0, 10)
oled.text("PWM: {:4}".format(int(output)), 0, 20)
oled.show()
time.sleep(1)
except Exception as e:
oled.fill(0)
oled.text("Error:", 0, 0)
oled.text(str(e), 0, 10)
oled.show()
time.sleep(2)