from machine import Pin, I2C
import dht
import time
# ===============================
# I2C SETUP
# ===============================
# SDA ke GPIO 21, SCL ke GPIO 22
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
# Alamat I2C masing-masing LCD (sesuai attrs di diagram.json)
ADDR_SUHU = 0x27 # LCD 1
ADDR_HUM = 0x3F # LCD 2
# ===============================
# DRIVER LCD MINIMALIS
# ===============================
def lcd_send(addr, data, mode):
# mode 0: command, mode 1: data
# 0x08 menjaga lampu latar (backlight) tetap nyala
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):
# Prosedur inisialisasi standar LCD 16x2 I2C
for cmd in [0x33, 0x32, 0x28, 0x0C, 0x06, 0x01]:
lcd_send(addr, cmd, 0)
time.sleep_ms(5)
def lcd_write(addr, line, text):
# Pindah kursor: 0x80 baris 1, 0xC0 baris 2
cmd = 0x80 if line == 1 else 0xC0
lcd_send(addr, cmd, 0)
# Kirim teks per karakter
for char in text:
lcd_send(addr, ord(char), 1)
# ===============================
# INISIALISASI PERANGKAT
# ===============================
print("Memulai sistem...")
lcd_init(ADDR_SUHU)
lcd_init(ADDR_HUM)
sensor = dht.DHT22(Pin(14)) # Pin DATA DHT22 ke GPIO 14
# Tampilan Awal
lcd_write(ADDR_SUHU, 1, " SENSOR SUHU ")
lcd_write(ADDR_HUM, 1, " SENSOR LEMBAB ")
time.sleep(2)
# ===============================
# LOOP UTAMA
# ===============================
while True:
try:
# Ambil data dari sensor
sensor.measure()
t = sensor.temperature()
h = sensor.humidity()
# Update LCD 1 (Suhu)
lcd_write(ADDR_SUHU, 2, " Temp: {:.1f} C ".format(t))
# Update LCD 2 (Kelembapan)
lcd_write(ADDR_HUM, 2, " Hum : {:.1f} % ".format(h))
# Monitor di Serial
print("Suhu: {:.1f} C | Hum: {:.1f} %".format(t, h))
except Exception as e:
print("Gagal membaca sensor:", e)
lcd_write(ADDR_SUHU, 2, " Error Sensor ")
lcd_write(ADDR_HUM, 2, " Error Sensor ")
# Jeda pembacaan (DHT22 butuh min 2 detik)
time.sleep(2)