from machine import Pin, ADC, I2C
import time
from lcd_i2c import I2cLcd # Pastikan pustaka LCD sudah diunggah ke ESP32
# === Konfigurasi Pin ===
LDR_AO_PIN = 34 # AO dari LDR ke GPIO34 (Analog Input)
LDR_DO_PIN = 32 # DO dari LDR ke GPIO32 (Digital Input)
LED_PIN = 15 # LED dihubungkan ke GPIO15
I2C_SDA = 21 # SDA untuk LCD I2C
I2C_SCL = 22 # SCL untuk LCD I2C
# === Inisialisasi Perangkat ===
ldr_analog = ADC(Pin(LDR_AO_PIN))
ldr_analog.atten(ADC.ATTN_11DB) # Maksimum range 0-3.3V
ldr_digital = Pin(LDR_DO_PIN, Pin.IN) # Digital Input
led = Pin(LED_PIN, Pin.OUT) # Output untuk LED
i2c = I2C(0, scl=Pin(I2C_SCL), sda=Pin(I2C_SDA), freq=400000)
# Pastikan alamat I2C LCD benar (0x27 atau 0x3F)
lcd_address = 0x27 # Ubah ke 0x3F jika perlu
lcd = I2cLcd(i2c, lcd_address, 2, 16)
# === Ambang Batas Cahaya dalam Persentase ===
THRESHOLD = 30 # Jika cahaya di bawah 30%, LED menyala
def adc_to_percentage(adc_value):
"""Konversi nilai ADC (0-4095) menjadi persentase (%) dengan skala terbalik"""
return round(100 - ((adc_value / 4095) * 100), 2) # Terang = 100%, Gelap = 0%
# === Loop Utama ===
while True:
light_value = ldr_analog.read() # Baca nilai dari AO (Analog Output)
light_percentage = adc_to_percentage(light_value) # Konversi ke %
# Debugging (Cek nilai)
print(f"ADC: {light_value} | Cahaya: {light_percentage}% | Digital LDR: {ldr_digital.value()}")
# Bersihkan dan tampilkan di LCD
lcd.clear()
lcd.putstr(f"Cahaya: {light_percentage}%")
# Kontrol LED berdasarkan nilai persentase cahaya
if light_percentage < THRESHOLD: # Jika gelap (<30%)
led.value(1) # Nyalakan LED
lcd.putstr("\nLED: ON")
else:
led.value(0) # Matikan LED
lcd.putstr("\nLED: OFF")
time.sleep(1)