from machine import I2C, Pin
from time import sleep
from dht import DHT22
# -------- I2C LCD (PCF8574) DRIVER --------
class I2cLcd:
def __init__(self, i2c, addr):
self.i2c = i2c
self.addr = addr
self.backlight = 0x08
self.init_lcd()
def write(self, data):
self.i2c.writeto(self.addr, bytes([data | self.backlight]))
def pulse(self, data):
self.write(data | 0x04)
sleep(0.001)
self.write(data & ~0x04)
sleep(0.001)
def send(self, data, mode):
high = mode | (data & 0xF0)
low = mode | ((data << 4) & 0xF0)
self.write(high)
self.pulse(high)
self.write(low)
self.pulse(low)
def command(self, cmd):
self.send(cmd, 0)
def write_char(self, char):
self.send(char, 0x01)
def init_lcd(self):
sleep(0.02)
self.command(0x33)
self.command(0x32)
self.command(0x28)
self.command(0x0C)
self.command(0x06)
self.command(0x01)
sleep(0.01)
def clear(self):
self.command(0x01)
sleep(0.01)
def move_to(self, col, row):
row_offsets = [0x80, 0xC0]
self.command(row_offsets[row] + col)
def putstr(self, string):
for char in string:
self.write_char(ord(char))
# -------- SENSOR & I2C SETUP --------
dht = DHT22(Pin(15))
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=100000)
addr = i2c.scan()[0]
lcd = I2cLcd(i2c, addr)
# -------- MAIN LOOP --------
while True:
dht.measure()
temp = dht.temperature()
hum = dht.humidity()
print("Temperature: {:.1f} C Humidity: {:.0f}%".format(temp, hum))
lcd.clear()
lcd.putstr("Temp: {:.1f}C".format(temp))
lcd.move_to(0, 1)
lcd.putstr("Hum: {:.0f}%".format(hum))
sleep(2)