from machine import Pin, PWM, ADC
import utime
# Pin Setup
ldr = ADC(26)               # Pin AO dari LDR ke GP28
ldr_digital = Pin(0, Pin.IN) # Pin DO dari LDR ke GP0
led = Pin(0, Pin.OUT)        # LED di GP6
buzzer = PWM(Pin(2))         # Buzzer di GP15 dengan PWM
# Konfigurasi PWM Buzzer
buzzer.freq(1000)            # Frekuensi awal buzzer (1kHz)
buzzer.duty_u16(0)           # Mulai dengan buzzer mati
# Fungsi untuk mengonversi nilai ADC ke lux
def adc_to_lux(adc_value):
    return (adc_value / 65535) * 900 + 10  # Rentang 10 - 1000 lux
# Variabel untuk menyimpan kondisi normal awal
lux_normal = 0
# Variabel untuk kedip LED
last_blink_time = utime.ticks_ms()
led_state = False
led_should_blink = False  # Hanya True saat mendeteksi perubahan cahaya signifikan
# Loop utama
while True:
    analog_value = ldr.read_u16()
    lux = adc_to_lux(analog_value)
    if lux_normal == 0:
        lux_normal = lux
        print(f"Lux Normal: {lux_normal}")
    print(f"LDR Value: {analog_value} | Lux: {lux}")
    if lux > lux_normal + 200:
        print("Cahaya lebih terang 200 lux! Aktifkan LED dan Buzzer selama 4 detik.")
        led_should_blink = True  # Nyalakan mode kedip
        buzzer.duty_u16(int(0.45 * 65535))    # Duty Cycle 45%
        blink_start_time = utime.ticks_ms()  # Waktu mulai kedip
        # Kedip LED selama 4 detik
        while utime.ticks_diff(utime.ticks_ms(), blink_start_time) <= 4000:  # Kedip selama 4 detik
            # Ubah frekuensi buzzer secara berkala selama 4 detik
            for i in range(500, 1000, 100):  # Variasi frekuensi buzzer
                buzzer.freq(i)
                utime.sleep(0.1)  # Memberi waktu untuk setiap frekuensi, sementara LED tetap berkedip
            # Kedip LED setiap 500ms
            current_time = utime.ticks_ms()
            if utime.ticks_diff(current_time, last_blink_time) >= 500:  # Kedip setiap 500ms
                led_state = not led_state
                led.value(led_state)
                last_blink_time = current_time
        # Setelah 4 detik, matikan LED dan buzzer
        led_should_blink = False
        led.off()
        buzzer.duty_u16(0)
    else:
        led_should_blink = False
        led.off()
        buzzer.duty_u16(0)
    utime.sleep(0.1)  # Sedikit delay supaya tidak terlalu cepat baca LDR