from machine import Pin, PWM, ADC
import utime
# ---------------------------------------
# PINOUT SESUAI PERINTAH:
# LDR: VCC -> 3V3 Pico
# LDR: GND -> GND.4 Pico
# LDR: A0 -> GP28
# LED: GP6 -> Resistor -> LED -> GND
# Buzzer: GP15 -> Positif, GND6 -> Negatif
# ---------------------------------------
# Inisialisasi sensor dan aktuator
ldr = ADC(28) # LDR analog di GP28
led = Pin(6, Pin.OUT) # LED di GP6
buzzer = PWM(Pin(15)) # Buzzer di GP15
buzzer.freq(1000)
buzzer.duty_u16(0) # Buzzer dimatikan di awal
# Fungsi konversi ADC ke lux
def adc_to_lux(adc_value):
return (adc_value / 65535) * 900 + 10 # estimasi dari 10-1000 lux
# Kalibrasi nilai lux normal selama 2 detik
print("Kalibrasi lux normal...")
samples = []
start_time = utime.ticks_ms()
while utime.ticks_diff(utime.ticks_ms(), start_time) < 2000:
samples.append(adc_to_lux(ldr.read_u16()))
utime.sleep(0.05)
lux_normal = sum(samples) / len(samples)
print(f"Lux Normal: {lux_normal:.2f} Lux")
# Variabel status alarm
alarm_active = False
led_state = False
blink_start_time = 0
last_blink_toggle = 0
# Loop utama
while True:
analog_value = ldr.read_u16()
lux = adc_to_lux(analog_value)
print(f"Lux Sekarang: {lux:.2f} Lux")
if not alarm_active and lux > lux_normal + 250:
print(">>> Cahaya terlalu terang - Alarm Aktif <<<")
alarm_active = True
blink_start_time = utime.ticks_ms()
last_blink_toggle = blink_start_time
buzzer.duty_u16(int(0.45 * 65535)) # Duty cycle 45%
if alarm_active:
now = utime.ticks_ms()
# Kedip LED setiap 300ms
if utime.ticks_diff(now, last_blink_toggle) >= 300:
led_state = not led_state
led.value(led_state)
last_blink_toggle = now
# Setelah 4 detik, matikan alarm
if utime.ticks_diff(now, blink_start_time) >= 4000:
alarm_active = False
led.value(0)
buzzer.duty_u16(0)
print(">>> Alarm Selesai <<<")
utime.sleep(0.1)