Laporan Akhir 1

[menuju akhir]

1. Prosedur [kembali]

  1. Siapkan alat dan bahan sesuai daftar (STM32, LED RGB, buzzer, sensor kelembaban, tombol, resistor, potensiometer, dll).

  2. Rakit rangkaian di breadboard sesuai skema (pin LED ke PB12–PB14, buzzer ke PA2, sensor ke PA0, tombol ke PB0).

  3. Upload program ke STM32 untuk membaca sensor dan mengontrol LED, buzzer, serta tombol.

  4. Tekan tombol PB0 untuk memulai pembacaan atau mengubah status.

  5. Amati LED RGB berubah warna sesuai kelembaban tanah.

  6. Pastikan buzzer menyala saat tanah terlalu kering.

  7. Putar potensiometer (RV2) untuk mensimulasikan perubahan kelembaban.

2. Hardware dan Diagram Blok [kembali]

Hardware :

  • Raspberry pi pico
  • Buzzer
  • LED
  • Resistor

  • LDR dan Photodioda

Diagram Blok

3. Rangkaian Simulasi dan Prinsip Kerja [kembali]

Rangkaian Simulasi

Prinsip Kerja

        Sistem ini bekerja dengan memantau kelembaban tanah menggunakan sensor yang terhubung ke pin analog mikrokontroler STM32F103C8. Sensor ini mendeteksi kelembaban berdasarkan resistansi antara dua elektroda: tanah basah menghasilkan resistansi rendah (nilai ADC tinggi), sedangkan tanah kering menghasilkan resistansi tinggi (nilai ADC rendah). Data analog dari sensor dibaca melalui pin A0 dan diubah menjadi nilai digital menggunakan fitur ADC internal STM32. Nilai ini digunakan sebagai acuan untuk menentukan kondisi tanah dan memicu respons sistem sesuai logika yang ditulis dalam kode program.

        Dalam kode, sistem membaca nilai kelembaban secara berkala menggunakan fungsi ADC, kemudian dibandingkan dengan ambang batas yang telah ditentukan. Jika nilai kelembaban berada di bawah batas minimum (artinya tanah kering), maka LED RGB akan menyala merah sebagai tanda peringatan. Jika kelembaban tinggi (tanah basah), LED akan menyala hijau. Jika berada dalam kisaran normal, LED menyala biru. Pemilihan warna ini dikendalikan melalui pin digital yang mengatur masing-masing kanal warna LED RGB, dengan resistor pembatas arus untuk melindungi komponen.

        Selain itu, dalam kode juga terdapat logika untuk mengaktifkan buzzer jika kelembaban melebihi batas maksimum, menandakan tanah terlalu basah. Buzzer diaktifkan dengan memberikan sinyal PWM atau output digital dari pin mikrokontroler. Sistem juga memanfaatkan push button yang terhubung ke pin PB0 untuk memberikan kontrol manual. Saat tombol ditekan, interrupt akan memicu fungsi tertentu di dalam program, misalnya untuk mereset status sistem atau mematikan buzzer. Dengan pengaturan ini, sistem dapat beroperasi otomatis sekaligus responsif terhadap input manual, sesuai dengan kondisi lingkungan dan interaksi pengguna.

4. Flowchart dan Listing Program [kembali]

Flowchart

Listing Program

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(27, 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 mendeteksi perubahan cahaya


# 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:
        led_should_blink = True         # Nyalakan mode kedip
        buzzer.duty_u16(int(65535 * 0.45))  # Duty Cycle 45%


        start_time = utime.ticks_ms()


        # LED berkedip selama 4 detik
        while utime.ticks_diff(utime.ticks_ms(), start_time) <= 4000:     # Kedip selama 4 detik
           
            for i in range(500, 1000, 100):  # Variasi frekuensi buzzer agar suara tidak monoton
                buzzer.freq(i)
                utime.sleep(0.1)  # Memberi waktu untuk setiap frekuensi, sementara LED tetap berkedip


        #Kedip LED setiap 0.5 detik        
            current_time = utime.ticks_ms()
            if utime.ticks_diff(current_time, last_blink_time) >= 500:  # 0.5 detik kedip
                led_state = not led_state
                led.value(led_state)    #Membuat LED menyala dan mati selang 0,5 detik (kedip)
                last_blink_time = current_time
            utime.sleep(0.05)  # Delay kecil supaya tidak terlalu berat CPU


    # Setelah 4 detik, matikan LED dan buzzer
        led.off()
        buzzer.duty_u16(0)


    else:
        led_should_blink = False
        led.off()
        buzzer.duty_u16(0)


    utime.sleep(0.1)  # Delay antar pembacaan sensor

5. Video Demo [kembali]

6. Kondisi [kembali]

    Percobaan 1.  Led, Buzzer, & LDR

7. Analisa [kembali]

8. Download File [kembali]

Video Simulasi [klik disini]
Listing Program [klik disini]
Datasheet STM32F103C8 [klik disini]
Datasheet LED [klik disini]
Datasheet Resistor [klik disini]

Komentar

Postingan populer dari blog ini

Modul 1 General Input dan Output

Modul 1 Gerbang Logika Dasar & Monostable Multivibrator