from machine import Pin, I2C
import dht
import time
# I2C Setup
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
# Alamat LCD biasanya 0x27 di Wokwi
LCD_ADDR = 0x27
# Fungsi kirim data ke LCD
def lcd_send(addr, data, mode):
# Mode: 0 untuk command, 1 untuk data
# 0x08 digunakan untuk menjaga Backlight tetap menyala
buf = [(data & 0xF0) | mode | 0x08, (data & 0xF0) | mode | 0x0C, (data & 0xF0) | mode | 0x08]
i2c.writeto(addr, bytes(buf))
buf = [((data << 4) & 0xF0) | mode | 0x08, ((data << 4) & 0xF0) | mode | 0x0C, ((data << 4) & 0xF0) | mode | 0x08]
i2c.writeto(addr, bytes(buf))
def lcd_init(addr):
# Inisialisasi LCD mode 4-bit
for cmd in [0x33, 0x32, 0x28, 0x0C, 0x06, 0x01]:
lcd_send(addr, cmd, 0)
time.sleep_ms(5)
# Inisialisasi
lcd_init(LCD_ADDR)
sensor = dht.DHT22(Pin(14)) # Sesuai Pin di gambar kamu
while True:
try:
sensor.measure()
t = sensor.temperature()
h = sensor.humidity()
# Cetak ke Serial untuk memastikan data terbaca
print("Suhu: {:.1f} C, Hum: {:.1f} %".format(t, h))
# --- Tampilkan Baris 1 ---
lcd_send(LCD_ADDR, 0x80, 0) # Alamat awal Baris 1
for char in "Suhu: {:.1f} C ".format(t):
lcd_send(LCD_ADDR, ord(char), 1)
# --- Tampilkan Baris 2 ---
lcd_send(LCD_ADDR, 0xC0, 0) # Alamat awal Baris 2
for char in "Hum : {:.1f} % ".format(h):
lcd_send(LCD_ADDR, ord(char), 1)
except Exception as e:
print("Error baca sensor:", e)
# Tampilkan error di LCD jika gagal
lcd_send(LCD_ADDR, 0x01, 0) # Clear Screen
lcd_send(LCD_ADDR, 0x80, 0)
for char in "Sensor Error":
lcd_send(LCD_ADDR, ord(char), 1)
# Jeda 2 detik (DHT22 tidak bisa dipaksa baca terlalu cepat)
time.sleep(2)