Laporan Akhir 1 M2
2. Buat program untuk mikrokontroler Raspbherry Pi Pico di Thonny IDE
Dalam sistem ini, Raspbherry Pi Pico sebagai pengatur dan pengelola data serta pemberi perintah. Prinsip kerja rangkaian ini diawali dengan inisialisasi semua pin—ADC untuk LDR, output digital untuk LED, dan channel PWM untuk buzzer—pada Raspberry Pi Pico. Setelah sistem dinyalakan, mikrokontroler melakukan pembacaan nilai ADC dari LDR untuk mendapatkan nilai lux awal sebagai “lux normal.” Selanjutnya, setiap siklus loop utama Pico membaca kembali nilai LDR dan mengonversinya menjadi lux; jika nilai lux aktu al melebihi ambang lux_normal + 50, maka dianggap terjadi peningkatan cahaya signifikan. Dalam kondisi itu LED akan berfungsi sebagai penanda visual berkedip setiap satu detik, sedangkan buzzer diaktifkan dengan duty cycle tetap dan frekuensi diubah-ubah secara berurutan (500 Hz, 600 Hz, …, hingga 900 Hz) untuk menghasilkan nada peringatan. Jika nilai lux tidak melewati ambang, LED dan buzzer dimatikan agar konsumsi daya minimal. Setiap perubahan LED dikendalikan oleh pengecekan waktu menggunakan fungsi utime.ticks_ms() untuk memastikan interval kedip tetap satu detik, sedangkan PWM buzzer secara langsung diatur lewat PWM.freq() dan PWM.duty_u16()—sehingga seluruh proses berjalan otomatis
from machine import Pin, PWM, ADC import utime # Pin Setup ldr = ADC(28) # Pin AO dari LDR ke GP28 ldr_digital = Pin(0, Pin.IN) # Pin DO dari LDR ke GP0 led = Pin(6, Pin.OUT) # LED di GP6 buzzer = PWM(Pin(15)) # 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 kondisi 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 + 50: led_should_blink = True # nyalakan mode kedip buzzer.duty_u16(30000) # nyalakan buzzer for i in range(500, 1000, 100): # variasi frekuensi buzzer buzzer.freq(i) utime.sleep(0.1) else: led_should_blink = False led.off() buzzer.duty_u16(0) # Kedip LED jika perlu if led_should_blink: current_time = utime.ticks_ms() if utime.ticks_diff(current_time, last_blink_time) >= 1000: led_state = not led_state led.value(led_state) last_blink_time = current_time utime.sleep(0.1) # sedikit delay supaya tidak terlalu cepat baca LDR
read_u16()
dalam Micropython, yang mengkonversi hasil ADC 12-bit menjadi nilai 16-bit untuk kemudahan. Walau mudah digunakan, kecepatan pembacaan ADC pada Pico lebih rendah dibanding STM32 dan bergantung pada beban prosesor, sehingga kurang cocok untuk aplikasi sensor analog yang memerlukan kecepatan sampling tinggi.irq()
pada objek pin dalam Micropython. Interrupt ini cukup mudah digunakan namun bekerja di level perangkat lunak, sehingga memiliki latensi yang lebih tinggi dan kurang cocok untuk aplikasi yang memerlukan respons instan.utime.ticks_ms()
pada Raspberry Pi Pico digunakan untuk menghitung waktu dalam milidetik sejak sistem dinyalakan. Fungsi ini bekerja dengan membaca nilai dari timer internal yang terus bertambah sejak sistem boot. Dengan memanfaatkan ticks_ms()
dan ticks_diff()
, pengguna dapat mengukur durasi waktu antar peristiwa tanpa khawatir terhadap overflow, karena sistem ini menangani wrap-around secara otomatis. Fungsi ini sangat berguna dalam membuat delay non-blocking, mengatur waktu polling sensor, atau memicu event berdasarkan waktu secara efisien dalam program Micropython.
Komentar
Posting Komentar