from machine import Pin, I2C
import dht
import time
# I2C Setup
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
ADDR_SUHU = 0x27
ADDR_HUM = 0x3F
# Inisialisasi Button di GPIO 13
button = Pin(13, Pin.IN, Pin.PULL_UP)
# Variabel untuk Logika Toggle
system_on = True # Status sistem saat ini
last_button_state = 1 # Status tombol sebelumnya (1 = dilepas)
def lcd_send(addr, data, mode, backlight=True):
# 0x08 adalah bit untuk menyalakan lampu (Backlight)
bl_bit = 0x08 if backlight else 0x00
buf = [(data & 0xF0) | mode | bl_bit, (data & 0xF0) | mode | (bl_bit | 0x04), (data & 0xF0) | mode | bl_bit]
i2c.writeto(addr, bytes(buf))
buf = [((data << 4) & 0xF0) | mode | bl_bit, ((data << 4) & 0xF0) | mode | (bl_bit | 0x04), ((data << 4) & 0xF0) | mode | bl_bit]
i2c.writeto(addr, bytes(buf))
def lcd_init(addr):
for cmd in [0x33, 0x32, 0x28, 0x0C, 0x06, 0x01]:
lcd_send(addr, cmd, 0)
time.sleep_ms(5)
def lcd_write(addr, line, text, backlight=True):
cmd = 0x80 if line == 1 else 0xC0
lcd_send(addr, cmd, 0, backlight)
for char in text:
lcd_send(addr, ord(char), 1, backlight)
def lcd_clear(addr, backlight=True):
lcd_send(addr, 0x01, 0, backlight)
# Inisialisasi awal
lcd_init(ADDR_SUHU)
lcd_init(ADDR_HUM)
sensor = dht.DHT22(Pin(14))
print("Sistem Siap. Tekan tombol untuk ON/OFF.")
while True:
current_button_state = button.value()
# Logika Toggle: Deteksi saat tombol baru saja ditekan (dari 1 ke 0)
if last_button_state == 1 and current_button_state == 0:
system_on = not system_on # Balikkan status sistem
if not system_on:
# Jika sistem dimatikan: Bersihkan layar dan matikan lampu
lcd_clear(ADDR_SUHU, backlight=False)
lcd_clear(ADDR_HUM, backlight=False)
print("Sistem MATI")
else:
print("Sistem HIDUP")
time.sleep(0.2) # Debounce (mencegah pembacaan ganda)
last_button_state = current_button_state
# Jalankan sensor dan LCD hanya jika system_on == True
if system_on:
try:
sensor.measure()
t = sensor.temperature()
h = sensor.humidity()
lcd_write(ADDR_SUHU, 1, " MONITOR SUHU ")
lcd_write(ADDR_SUHU, 2, " Temp: {:.1f} C ".format(t))
lcd_write(ADDR_HUM, 1, " MONITOR HUMID ")
lcd_write(ADDR_HUM, 2, " Hum : {:.1f} % ".format(h))
except Exception as e:
print("Gagal baca sensor:", e)
time.sleep(0.1)