from machine import Pin, ADC
from esp32_gpio_lcd import GpioLcd
from utime import sleep
import math
# 1. Inisialisasi LCD
lcd = GpioLcd(rs_pin=Pin(13),
enable_pin=Pin(12),
d4_pin=Pin(25),
d5_pin=Pin(26),
d6_pin=Pin(27),
d7_pin=Pin(14),
num_lines=2, num_columns=16)
# 2. Inisialisasi Sensor
ldr_pin = ADC(Pin(34))
temp_pin_setup = Pin(35, Pin.IN, Pin.PULL_UP)
temp_pin = ADC(temp_pin_setup)
ldr_pin.atten(ADC.ATTN_11DB)
temp_pin.atten(ADC.ATTN_11DB)
lcd.putstr("Sistem Fire IoT\nStarting...")
sleep(2)
lcd.clear()
while True:
# Membaca nilai analog
val_ldr = ldr_pin.read()
val_temp = temp_pin.read()
# --- Rumus Lux (Wokwi Compatible) ---
voltage_ldr = val_ldr / 4095 * 3.3
if 0 < voltage_ldr < 3.3:
# Gunakan rumus ini jika angka terbalik: 10000 * (3.3 - voltage_ldr) / voltage_ldr
resistance = 10000 * voltage_ldr / (3.3 - voltage_ldr)
lux = pow(50000 * pow(10, 0.7) / resistance, (1 / 0.7))
else:
lux = 0
if lux > 1000: lux = 1000
# --- Rumus Suhu (NTC Steinhart-Hart) ---
if val_temp > 0 and val_temp < 4095:
# 3950 adalah nilai Beta standar NTC Wokwi
celsius = 1 / (math.log(1 / (4095 / val_temp - 1)) / 3950 + 1 / 298.15) - 273.15
else:
celsius = 0
suhu = celsius
# --- Penentuan Status ---
if 1 <= lux <= 200 and 0 <= suhu <= 60:
status = "AMAN"
elif 200 < lux <= 600 and 61 <= suhu <= 100:
status = "WASPADA"
elif lux > 600 and suhu > 100:
status = "KEBAKARAN !!"
else:
status = "NORMAL"
# --- Update Tampilan LCD (BAGIAN PERBAIKAN) ---
lcd.move_to(0, 0)
lcd.putstr("L:{:.0f} S:{:.1f}C ".format(lux, suhu)) # Spasi di akhir untuk hapus sisa angka
lcd.move_to(0, 1)
lcd.putstr(status + " ") # Spasi panjang untuk hapus status sebelumnya
# Debugging
print("Lux: {:.1f}, Suhu: {:.1f} -> {}".format(lux, suhu, status))
sleep(1)