from machine import Pin, PWM, ADC
import utime
# Inisialisasi komponen
ldr_sensor = ADC(28) # Sensor LDR di pin GP28
led_merah = Pin(6, Pin.OUT) # LED di pin GP6
buzzer = PWM(Pin(15)) # Buzzer di pin GP15
# Set awal buzzer
buzzer.freq(1000)
buzzer.duty_u16(0) # Buzzer mati di awal
# Fungsi konversi ADC ke Lux
def konversi_ke_lux(nilai_adc):
return (nilai_adc / 65535) * 900 + 10
# Fungsi untuk ambil rata-rata lux normal
def ambil_lux_normal():
data_lux = []
waktu_awal = utime.ticks_ms()
while utime.ticks_diff(utime.ticks_ms(), waktu_awal) < 2000:
nilai = ldr_sensor.read_u16()
lux = konversi_ke_lux(nilai)
data_lux.append(lux)
utime.sleep_ms(50)
rata2 = sum(data_lux) / len(data_lux)
return rata2
# Program utama
print("Mengambil data lux normal...")
lux_normal = ambil_lux_normal()
print("Lux normal didapat:", lux_normal)
# Variabel kontrol
buzzer_duty = 0
sudah_blinking = False # Supaya LED hanya kedip sekali
while True:
nilai_adc = ldr_sensor.read_u16()
lux_sekarang = konversi_ke_lux(nilai_adc)
print("ADC:", nilai_adc, "| Lux:", lux_sekarang)
if (lux_sekarang - lux_normal) >= 300:
buzzer_duty = int(0.25 * 65535)
buzzer.duty_u16(buzzer_duty)
if not sudah_blinking:
# Mulai blinking 2 detik
waktu_mulai = utime.ticks_ms()
led_status = False
waktu_terakhir = waktu_mulai
while utime.ticks_diff(utime.ticks_ms(), waktu_mulai) < 2000:
sekarang = utime.ticks_ms()
if utime.ticks_diff(sekarang, waktu_terakhir) >= 300:
led_status = not led_status
led_merah.value(led_status)
waktu_terakhir = sekarang
utime.sleep_ms(50)
led_merah.off() # Pastikan LED mati setelah 2 detik
sudah_blinking = True # Jangan blinking lagi
else:
# Kalau lux <= 300, buzzer mati dan reset blinking
if buzzer_duty > 0:
buzzer_duty = 0
buzzer.duty_u16(0)
led_merah.off()
sudah_blinking = False # Reset supaya bisa blinking lagi kalau ada perubahan
utime.sleep_ms(100)