from machine import Pin, Timer, I2C
import dht
import time
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
# DHT22 setup
sensor = dht.DHT22(Pin(13))
# I2C LCD setup
I2C_ADDR = 0x27
I2C_ROWS = 2
I2C_COLS = 16
i2c = I2C(0, sda=Pin(22), scl=Pin(23), freq=400000)
lcd = I2cLcd(i2c, I2C_ADDR, I2C_ROWS, I2C_COLS)
# HC-SR04 setup
trigger = Pin(5, Pin.OUT)
echo = Pin(18, Pin.IN)
def measure_distance():
trigger.off()
time.sleep_us(2)
trigger.on()
time.sleep_us(10)
trigger.off()
while echo.value() == 0:
pass
start = time.ticks_us()
while echo.value() == 1:
pass
end = time.ticks_us()
duration = time.ticks_diff(end, start)
distance = (duration / 2) / 29.1 # Convert to cm
return distance
def readTemperature(timer):
try:
sensor.measure()
temperature = sensor.temperature()
humidity = sensor.humidity()
distance = measure_distance()
lcd.clear()
lcd.putstr(f"Temp: {temperature:.1f}C")
lcd.move_to(0, 1)
lcd.putstr(f"Dist: {distance:.1f}cm")
except OSError as e:
lcd.clear()
lcd.putstr("Sensor Error")
print("Fout bij het uitlezen van de sensor:", e)
led = Pin(2, Pin.OUT)
def blinkLed(timer):
led.value(not led.value())
temp_timer = Timer(0)
led_timer = Timer(1)
led_timer.init(period=1000, mode=Timer.PERIODIC, callback=blinkLed)
temp_timer.init(period=120000, mode=Timer.PERIODIC, callback=readTemperature)
while True:
time.sleep(1)