Modul 4

"Sistem Peringatan Dini Flash Flood Menggunakan Multi Sensor Berbasis STM32 pada Daerah Batu Busuak"

1. Pendahuluan [Kembali]

Banjir bandang merupakan salah satu bencana alam yang sering terjadi secara mendadak dengan daya rusak yang tinggi, terutama di daerah aliran sungai. Keterlambatan dalam penyampaian informasi mengenai kenaikan debit air dan curah hujan sering kali menjadi penyebab utama besarnya kerugian materiil maupun korban jiwa. Oleh karena itu, diperlukan sebuah sistem mitigasi bencana yang mampu bekerja secara real-time, otomatis, dan akurat untuk memberikan peringatan dini kepada masyarakat sekitar.

Proyek ini merancang sebuah Early Warning System (EWS) Banjir Bandang cerdas memanfaatkan mikrokontroler STM32F103C8T6 (Blue Pill) berbasis ARM Cortex-M3. Sistem ini mengintegrasikan tiga parameter sensor utama: sensor hujan untuk mendeteksi intensitas presipitasi, sensor ultrasonic untuk memantau ketinggian/luapan permukaan air sungai, dan sensor water flow FS300A untuk mengukur kecepatan debit arus air.

Data dari ketiga sensor tersebut diolah menggunakan metode evaluasi matriks risiko akumulatif secara non-blocking di dalam program. Hasil analisis risiko dikategorikan menjadi tiga tingkatan status aktual (AMAN, SIAGA, BAHAYA) yang langsung dieksekusi menjadi indikator output berupa fluktuasi warna LED, bunyi intermiten/konstan pada buzzer, serta visualisasi data sensor yang informatif pada layar LCD 16x2 via komunikasi I2C. Sistem ini diharapkan dapat mengoptimalkan waktu evakuasi mandiri warga sebelum luapan banjir bandang mencapai pemukiman.

2. Tujuan Rancangan [Kembali]

1. Merancang dan mengimplementasikan Sistem Peringatan Dini (Early Warning System) Flash Flood berbasis mikrokontroler STM32F103C8T6 BluePill untuk memonitoring potensi banjir bandang di kawasan rawan  seperti daerah Batu Busuak secara real-time.

2. Mengintegrasikan multi-sensor yang terdiri dari Rain Sensor YL-83 (deteksi intensitas curah hujan lokal), Ultrasonic Sensor HC-SR04 (pembacaan level kenaikan permukaan tinggi air), dan Water Flow Sensor YF-S201 (pemantauan laju debit arus air sungai) ke dalam satu kesatuan sistem pembuat keputusan matriks risiko.

3. Menerapkan sistem kendali berbasis non-blocking memanfaatkan penanda waktu internal dan interupsi eksternal (EXTI) pada STM32 untuk memproses sinyal frekuensi pulsa dari sensor aliran air tanpa mengganggu kontinuitas pembacaan sensor lainnya.

4. Memberikan indikasi keluaran (output) yang informatif dan responsif berupa visualisasi data pada LCD I2C, penanda level bahaya berkala via LED Indicator (Hijau, Kuning, Merah), serta peringatan suara darurat melalui Buzzer sebagai mekanisme instruksi evakuasi mandiri bagi warga sekitar.   

3. Alat & Komponen [Kembali]

PERANGKAT KERAS PENDUKUNG

1. Voltmeter

DC Voltmeter merupakan alat yang digunakan untuk mengukur besar tengangan pada suatu komponen. Cara pemakaiannya adalah dengan memparalelkan kaki2 Voltmeter dengan komponen yang akan diuji tegangannya.
 
Karakteristik, Prinsip Kerja, Dan Bagian Voltmeter 


Berikut adalah Spesifikasi dan keterangan Probe DC Volemeter





2.ST-LINK





3. Lem Tembak

4.Kabel Jumper




KOMPONEN UTAMA:

1.STM32F103C8T6


Model : STM32F103C8T6

Core : ARM32 Cortex-M3 CPU

Clock : 72 MHz

Memory : 64K Flash + 20K SRAM

GPIO : 32 pin

ADC : 10 channel dengan resolusi 12-bit

PWM : 15 pin

Koneksi : USART, USB, SPI, I2C, CAN BUS

EEPROM –  SRAM 20KB 

Jumlah Pin I/O Digital 22 (6 PWM)

Jumlah Pin I/O Analog 8

    

    STM32 Blue Pill merupakan salah satu board mikrokontroller buatan STMicroelectronics yang cukup populer pemakaiannya saat ini. Mikrokontroler yang digunakan adalah STM32F103C8 yang berbasis ARM Cortex M3. 

 

    Berdasarkan spesifikasi diatas, terlihat bahwa dari segi kapasitas memori baik RAM maupun Flash, STM32 Blue Pill memiliki keunggulan dibanding dengan Arduino, meskipun pada STM32 Blue Pill tidak memiliki EEPROM. Dengan kapasitas memori yang cukup besar tersebut maka implementasi FreeRTOS sangat mungkin dilakukan dengan menggunnakan board mikrokontroller ini. Selain itu dari segi clock speed dan jumlah pin I/O, Blue Pill juga lebih unggul dibanding Arduino. Meskipun begitu, yang menjadi kelemahan utama SM32 Blue Pill ini adalah diperlukannya modul antarmuka tambahan untuk melakukan komunikasi serial dengan PC. Atau dengan kata lain untuk melakukan upload program masih harus dibutuhkan modul tambahan yang dinamakan bootloader. Tambahan modul interfacing ini cukup menyulitkan penulis saat praktikum karena pada beberapa kasus tidak bekerja. Selain itu dari sisi pemrograman, SM32 Blue Pill ini juga cukup lebih sulit dibanding dengan pemrograman pada Arduino karena meskipun dapat menggunakan bahasa pemrograman yang sama, sejumlah library juga harus dicari dan pencariannya tidak terlalu mudah karena komunitas online board mikrokontroller ini belum terlalu berkembang seperti Arduino. 


2.Rain Sensor YL-83




Komponen ini terutama terdiri dari dua bagian:
  • Pelat konduktif yang mendeteksi air melalui kemampuannya menghantarkan listrik.
  • Modul komparator yang mengubah sinyal papan menjadi nilai analog atau digital.

Ketika tetesan air hujan jatuh ke pelat sensor, tetesan tersebut menghubungkan kontak logam di permukaan, menyebabkan perubahan resistansi. Perubahan ini diproses oleh modul komparator, yang menghasilkan nilai analog antara 0 dan 1023 atau output digital (0 atau 1) tergantung bagaimana Anda ingin menggunakannya.

Sensor ini adalah sangat serbaguna dan dapat disesuaikan dengan proyek yang berbeda. Fitur utamanya meliputi:

  • Daya dari 3.3 hingga 5V, cocok dengan sebagian besar papan Arduino.
  • Dua output: digital (DO) dan analog (AO).
  • Sensitivitas yang dapat disesuaikan menggunakan potensiometer bawaan.
  • Desain ringkas dengan ketahanan terhadap oksidasi berkat permukaan berlapis nikel.


3.Ultrasonic Sensor HC-SR04


    merupakan sensor yang menggunakan gelombang ultrasonik. Gelombang ultrasonik yaitu gelombang yang umum digunakan untuk mendeteksi keberadaan suatu benda dengan memperkirakan jarak antara sensor dan benda tersebut. Sensor ini berfungsi untuk mengubah besaran fisis (bunyi) menjadi besaran listrik begitu pula sebaliknya. Gelombang ultrasonik memiliki frekuensi sebesar 40.000 Hz. Bunyi tersebut tidak dapat didengar oleh telinga manusia. Bunyi tersebut dapat didengar oleh hewan tertentu seperti anjing, kelelawar dan kucing. Bunyi gelombang ultrasonik dapat merambat melalui zat cair, padat dan gas. Benda cair merupakan media merambat yang paling baik untuk sensor ultrasonik jika dibandingkan dengan benda padat dan gas. Oleh karena itu, sensor ultrasonik banyak digunakan pada kapal selam dan alat khusus untuk mengukur kedalaman air laut. 


Berikut ini cara kerja sensor ultrasonik secara detail :

  Sinyal dipancarkan oleh pemancar ultrasonik dengan frekuensi dan durasi waktu tertentu. Sinyal tersebut memiliki frekuensi di atas 20 kHz. Frekuensi yang umum digunakan untuk mengukur jarak benda yaitu 40 kHz.

  Sinyal yang dipancarkan akan merambat sebagai gelombang bunyi dengan kecepatan sekitar 340 m/s. Ketika membentur suatu benda, maka sinyal tersebut akan dipantulkan oleh benda tersebut.

  Sinyal akan diproses untuk menghitung jarak benda tersebut setelah gelombang pantulan sampai di alat penerima.


    Sensor ultrasonik memiliki 4 pin, pin Vcc, Gnd, Trigger, dan Echo. Pin Vcc digunakan sebagai listrik positif dan Gnd sebagai ground. Pin Trigger digunakan untuk trigger keluarnya sinyal dari sensor dan pin Echo untuk menangkap sinyal pantul dari benda. Cara menggunakan sensor ini yaitu ketika diberikan tegangan positif pada pin Trigger selama 10uS, maka sensor akan mengirimkan 8 step sinyal ultrasonik dengan frekuensi 40 kHz. Selanjutnya, sinyal akan diterima pada pin Echo. Untuk mengukur jarak benda yang memantulkan sinyal tersebut, maka selisih waktu ketika mengirim dan menerima sinyal digunakan untuk menentukan jarak benda tersebut.

4.Water Flow Sensor FS300A




    Water flow sensor FS300A menggunakan teknologi Hall-effect untuk mendeteksi kecepatan aliran air. Ketika air melewati rotor, rotor berputar, yang mengaktifkan core magnetik untuk mengaktifkan tindakan switch. Sensor Hall-effect menghasilkan sinyal pulsa yang sesuai dengan kecepatan aliran, sehingga pengguna dapat mendeteksi kecepatan aliran dengan mengamati pulsa tersebut.

5.LCD 16x2 dengan Modul I2C

LCD 16x2 dengan modul I2C sebenarnya adalah LCD 16x2 biasa yang telah dipasangi sebuah "backpack" atau modul adaptor I2C di bagian belakangnya. Modul ini berisi chip (umumnya PCF8574 atau PCF8574A) yang bertindak sebagai port expander.

  • Jumlah Pin yang Dibutuhkan:

    • Dengan modul I2C, Anda hanya memerlukan 4 pin untuk menghubungkan LCD ke Arduino:

      • VCC: Ke 5V Arduino.

      • GND: Ke GND Arduino.

      • SDA (Serial Data Line): Ke pin SDA Arduino (A4 pada Uno, Leonardo, dll.).

      • SCL (Serial Clock Line): Ke pin SCL Arduino (A5 pada Uno, Leonardo, dll.).

    • Modul I2C itu sendiri memiliki potensiometer kecil untuk mengatur kontras, jadi Anda tidak perlu potensiometer eksternal lagi. Beberapa modul juga memiliki jumper untuk mengendalikan backlight.

  • Prinsip Kerja:

    • Modul I2C mengubah komunikasi paralel LCD menjadi komunikasi serial I2C.

    • Arduino mengirimkan data dan perintah ke modul I2C hanya melalui dua kabel (SDA dan SCL) menggunakan protokol I2C.

    • Chip PCF8574 pada modul I2C kemudian akan "menerjemahkan" data serial ini menjadi sinyal paralel yang dibutuhkan oleh LCD dan mengirimkannya ke pin-pin LCD yang relevan.

  • Keuntungan:

    • Menghemat pin digital Arduino secara drastis! Dari 6-11 pin menjadi hanya 2 pin data (SDA dan SCL). Ini sangat berharga untuk proyek kompleks.

    • Pengkabelan jauh lebih sederhana dan rapi, mengurangi risiko kesalahan koneksi.

    • Membuat kode lebih ringkas dan mudah dipahami karena library I2C mengurus detail komunikasi paralel di baliknya.

    • Satu bus I2C dapat menampung banyak perangkat I2C lainnya (misalnya, sensor suhu, RTC, dll.) secara bersamaan, selama setiap perangkat memiliki alamat I2C yang unik.

  • Kekurangan:

    • Sedikit lebih mahal karena ada modul I2C tambahan.

    • Sedikit lebih lambat dalam kecepatan komunikasi dibandingkan koneksi paralel langsung (meskipun perbedaannya tidak signifikan untuk aplikasi tampilan karakter sederhana).

    • Anda perlu mengetahui alamat I2C modul Anda (umumnya 0x27 atau 0x3F), dan menginstal library LCD I2C yang benar.


6.LED Indicator




7.Buzzer 5V



    adalah sebuah komponen elektronika yang dapat menghasilkan getaran suara berupa gelombang bunyi. Buzzer elektronika akan menghasilkan getaran suara ketika diberikan sejumlah tegangan listrik dengan taraf tertentu sesuai dengan spesifikasi bentuk dan ukuran buzzer elektronika itu sendiri. Pada umumnya, buzzer elektronika ini sering digunakan sebagai alarm karena penggunaannya yang cukup mudah yaitu dengan memberikan tegangan input maka buzzer elektronika akan menghasilkan getaran suara berupa gelombang bunyi yang dapat didengar manusia.

8. Resistor

Resistor adalah komponen Elektronika Pasif yang memiliki nilai resistansi atau hambatan tertentu yang berfungsi untuk membatasi dan mengatur arus listrik dalam suatu rangkaian Elektronika (V=I R). 
Jenis Resistor yang digunakan disini adalah Fixed Resistor, dimana merupakan resistor dengan nilai tetap terdiri dari film tipis karbon yang diendapkan subtrat isolator kemudian dipotong berbentuk spiral. Keuntungan jenis fixed resistor ini dapat menghasilkan resistor dengan toleransi yang lebih rendah.
Cara menghitung nilai resistor:
Tabel warna

Contoh :
Gelang ke 1 : Coklat = 1
Gelang ke 2 : Hitam = 0
Gelang ke 3 : Hijau   = 5 nol dibelakang angka gelang ke-2; atau kalikan 105
Gelang ke 4 : Perak  = Toleransi 10%
Maka nilai resistor tersebut adalah 10 * 105 = 1.000.000 Ohm atau 1 MOhm dengan toleransi 10%.

Spesifikasi


 
9. Power Adepter





Spesifikasi :


Tegangan keluaran (Output Voltage): 5 Volt DC

Arus keluaran (Output Current): 1 A – 2 A (umumnya 1000 mA – 2000 mA)

Tegangan masukan (Input Voltage): 100 – 240 Volt AC, 50/60 Hz

Daya keluaran (Output Power): ±5 – 10 Watt

Jenis konektor: Port USB tipe A atau kabel tetap (micro USB / USB Type-C)

Polaritas output: Positif di bagian dalam konektor, negatif di bagian luar (standar DC)

Efisiensi: ≥ 80%

Perlindungan: Overload, overvoltage, dan short circuit protection


10. Bread Board 




Berdasarkan gambar di atas, fungsi dari masing-masing jalur koneksi pada breadboard dengan keterangan warnanya yaitu sebagai berikut :

 1. Jalur warna merah digunakan untuk menempatkan pin 5V atau kutub positif  untuk dihubungkan ke kutub positif komponen lain. 

2. Jalur warna biru digunakan untuk menempatkan pin GND atau kutub negatifuntuk dihubungkan ke kutub negatif komponen lain.

 3. Jalur warna hijau digunakan untuk menempatkan pin digital  untuk dihubungkan ke komponen lain. Selain itu, di bagian tengah papan breadboard terdapat ruang kosong yang masing-masing pinggirannya terdapat ujung jalur vertikal. Fungsi dari ruang kosong ini adalah untuk menancapkan langsung ic component.

                                            

 
                                                                                     
PERANGKAT LUNAK
1.Software Pendukung(STM32CubeIDE)


2.Proteus 8 Profesional 

4. Landasan Teori  [Kembali]

4.1  Mikrokontroler STM32F103C8T6 (Blue Pill)  

STM32F103C8T6 adalah mikrokontroler 32-bit berbasis prosesor ARM Cortex-M3 yang diproduksi oleh STMicroelectronics. Mikrokontroler ini bekerja dengan frekuensi clock hingga 72 MHz, menggunakan arsitektur RISC (Reduced Instruction Set Computer) yang memiliki kecepatan eksekusi instruksi jauh lebih tinggi dibandingkan dengan mikrokontroler 8-bit konvensional (seperti AVR atau Arduino Uno).

 Mikrokontroler ini memiliki memori Flash sebesar 64 KB untuk penyimpanan program dan SRAM sebesar 20 KB. Fitur-fitur periferal yang terintegrasi di dalamnya meliputi:
  • Nested Vectored Interrupt Controller (NVIC): Mengelola interupsi eksternal dengan latensi rendah secara real-time.

  • General Purpose Timers (TIMx): Timer 16-bit yang dapat digunakan untuk pencacah pulsa, PWM, maupun generator delay mikrodetik.

  • Protokol Komunikasi: Mendukung antarmuka I2C, SPI, dan USART untuk komunikasi data dengan perangkat periferal eksternal.



Dalam sistem EWS ini, STM32F103C8T6 berperan sebagai unit pemroses sentral yang mengintegrasikan pembacaan sensor melalui interupsi eksternal (EXTI) dan komunikasi serial I2C.






Fitur-fitur lain dari papan tersebut adalah sebagai berikut:


  • Paket ini berisi MCU utama – STM32F103C8T6 dalam kemasan Quad Flat Package.
  • Tombol Reset – untuk mereset Mikrokontroler.
  • Port microUSB – untuk komunikasi serial dan daya.
  • Jumper Pemilih BOOT – Jumper BOOT0 dan BOOT1 untuk memilih memori booting.
  • Dua LED – LED Pengguna dan LED Daya.
  • Kristal 8 MHz – Jam Utama untuk MCU.
  • Osilator 32,768KHz – Jam RTC.
  • Antarmuka SWD – untuk pemrograman dan debugging menggunakan ST-Link.
  • Regulator 3.3V (di bagian bawah) – mengubah 5V menjadi 3.3V untuk memberi daya pada MCU.
Di setiap sisi panjang papan, terdapat pin untuk menghubungkan berbagai input/output analog dan digital serta hal-hal yang berkaitan dengan daya. Gambar berikut menunjukkan konfigurasi pin papan beserta berbagai fungsi yang didukung oleh setiap pin.


Setelah sedikit membahas tentang Blue Pill Board, mari kita pahami beberapa fitur penting dari inti board ini, yaitu Mikrokontroler STM32F103C8T6. Seperti yang disebutkan sebelumnya, MCU ini berisi inti CPU ARM 32-bit Cortex-M3 dengan frekuensi maksimum 72 MHz.

Sekarang mari kita lihat beberapa spesifikasi MCU yang diterapkan pada papan Blue Pill.

  • Memori: berisi 64 Kbyte Flash dan 20 Kbyte SRAM.
  • Pin GPIO – 32 dengan kemampuan interupsi eksternal
  • Timer – 3 Timer 16-bit, 1 Timer PWM 16-bit
  • Pin PWM – 15
  • Analog – 10 Saluran ADC 12-bit
  • I2C – 2 Perangkat Periferal I2C
  • USART – 3 Perangkat Periferal USART dengan kontrol perangkat keras
  • SPI – 2 Perangkat Periferal SPI
  • Perangkat Tambahan Lainnya – USB 2.0 Full Speed, CAN 2.0B


Mengupload: 80466 dari 80466 byte diupload.


4.2
Sensor Jarak Ultrasonic HC-SR04
Sensor HC-SR04 adalah perangkat yang digunakan untuk mengukur jarak objek dengan memanfaatkan perambatan gelombang ultrasonik. Pada sistem Early Warning System (EWS) banjir, sensor ini dipasang menghadap ke permukaan air sungai untuk mendeteksi perubahan ketinggian muka air secara berkala.
Pengukuran jarak dengan HC-SR04 didasarkan pada metode waktu tempuh gelombang (Time of Flight). Sensor memerlukan pulsa trigger dengan logika HIGH selama 10 mikrodetik  melalui pin Trigger. Setelah menerima trigger, transducer pemancar akan memancarkan 8 siklus gelombang ultrasonik dengan frekuensi 40 kHz.
Gelombang tersebut akan merambat melalui udara, mengenai permukaan air, dan memantul kembali menuju transducer penerima (Receiver). Saat gelombang mulai dipancarkan, pin Echo akan berubah ke logika HIGH dan kembali ke logika LOW tepat saat pantulan gelombang diterima.
Jarak objek  dihitung berdasarkan durasi waktu logika HIGH pada pin Echo  dengan menggunakan konstanta kecepatan rambat bunyi di udara (340 m/s) melalui persamaan berikut:
Pembagian dengan angka 2 dilakukan karena durasi waktu yang terukur merupakan waktu tempuh bolak-balik gelombang dari sensor ke objek dan kembali ke sensor.






Sensor Ultrasonic HC-SR04 dilengkapi dengan empat pin utama yang masing-masing memiliki fungsi spesifik untuk mendukung pengoperasian sensor ini. Berikut adalah penjelasan rinci mengenai fungsi setiap pin pada sensor HC-SR04:

1. VCC (5V Power Supply)

Pin VCC adalah pin yang digunakan untuk memberikan sumber daya positif kepada sensor. Pin ini harus dihubungkan dengan sumber tegangan 5V untuk mengaktifkan sensor HC-SR04. Tegangan yang diberikan pada pin ini memungkinkan seluruh sistem sensor bekerja dengan baik, baik pada modul pengirim maupun penerima sinyal ultrasonik. Tanpa pemberian tegangan yang cukup, sensor tidak akan berfungsi.

2. Trig (Trigger/Penyulut)

Pin Trig berfungsi sebagai pemicu atau penyulut yang digunakan untuk memulai proses pengiriman sinyal ultrasonik. Ketika pin ini diberi sinyal logika tinggi (HIGH) selama sekitar 10 mikrodetik, sensor akan mengirimkan gelombang ultrasonik dari modul pengirim. Sinyal ini kemudian akan dipantulkan oleh objek yang ada di depan sensor dan kembali ke penerima. Pin Trig ini sangat penting dalam mengontrol kapan sensor mengirimkan sinyal untuk pengukuran jarak.

3. Echo (Receive/Indikator)

Pin Echo adalah pin yang digunakan untuk menerima sinyal pantulan dari objek yang diukur. Setelah sinyal ultrasonik dipancarkan oleh pin Trig, pin Echo akan mendeteksi pantulan gelombang yang kembali ke sensor. Waktu yang dibutuhkan untuk gelombang tersebut kembali dihitung oleh sensor untuk menentukan jarak antara sensor dan objek. Pin Echo ini memberikan sinyal logika tinggi (HIGH) selama durasi waktu perjalanan gelombang ultrasonik, yang nantinya bisa dihitung untuk memperoleh jarak yang tepat.

4. GND (Ground/0V Power Supply)

Pin GND adalah pin ground atau sumber tegangan negatif untuk sensor. Pin ini harus dihubungkan dengan ground pada sistem kelistrikan untuk menyeimbangkan sirkuit dan menyediakan jalur kembali bagi aliran arus listrik. Tanpa koneksi ground yang benar, sensor tidak akan berfungsi dengan semestinya.

Keempat pin tersebut bekerja bersama-sama untuk memastikan sensor HC-SR04 dapat mengukur jarak dengan akurat. Penggunaan yang tepat dari masing-masing pin sangat penting untuk memperoleh hasil pengukuran yang optimal.

Cara Kerja Sensor Ultrasonik



Cara kerja sensor ultrasonik didasarkan pada prinsip pantulan gelombang suara untuk mengukur jarak suatu objek dengan menggunakan frekuensi tertentu. Gelombang ultrasonik ini dihasilkan oleh komponen yang disebut piezoelektrik, yang berfungsi untuk mengubah energi listrik menjadi gelombang suara dengan frekuensi spesifik.

Piezoelektrik akan menghasilkan gelombang ultrasonik dengan frekuensi 40 kHz ketika diberikan osilasi listrik. Secara umum, sensor ini akan memancarkan gelombang ultrasonik ke area atau objek yang menjadi target. Ketika gelombang tersebut mengenai permukaan target, sebagian gelombang akan dipantulkan kembali. Sensor kemudian menangkap gelombang pantulan ini. Selanjutnya, sensor menghitung waktu yang dibutuhkan gelombang untuk kembali setelah dipantulkan, dan berdasarkan selisih waktu antara pengiriman dan penerimaan gelombang, sensor dapat menentukan jarak objek yang diukur.

Berikut ini adalah penjelasan lebih detail mengenai cara kerja sensor ultrasonik:



1. Pemancaran Sinyal

Sensor ultrasonik dimulai dengan pemancaran sinyal oleh pemancar ultrasonik yang menggunakan frekuensi dan durasi waktu tertentu. Frekuensi yang umum digunakan untuk mengukur jarak objek adalah sekitar 40 kHz, yang lebih tinggi dari batas pendengaran manusia (20 kHz). Sinyal ini berupa gelombang suara yang dikendalikan oleh osilator, dan dipancarkan dalam bentuk pulsa yang teratur menuju objek yang ingin diukur jaraknya.

2. Perambatan Gelombang Suara

Setelah sinyal dipancarkan, gelombang bunyi ultrasonik tersebut akan merambat melalui udara dengan kecepatan sekitar 340 meter per detik, tergantung pada suhu udara dan faktor lainnya. Ketika gelombang suara ini mengenai suatu objek atau permukaan, gelombang akan dipantulkan kembali oleh objek tersebut. Proses ini terjadi dengan sangat cepat, dan kecepatan serta arah pantulan sangat dipengaruhi oleh jarak dan bentuk objek yang dikenai gelombang.

3. Penerimaan dan Pengolahan Sinyal Pantulan

Setelah gelombang pantulan diterima oleh alat penerima, sensor akan menghitung waktu yang dibutuhkan gelombang suara untuk kembali. Waktu perjalanan gelombang ini sangat singkat, namun cukup untuk diukur oleh sensor. Dengan mengetahui waktu tempuh gelombang dan kecepatan suara di udara, sensor dapat menghitung jarak antara sensor dan objek. Perhitungan ini dilakukan dengan rumus dasar:

Penggunaan faktor 2 diperlukan karena waktu yang diukur adalah waktu tempuh bolak-balik (dari sensor ke objek dan kembali lagi). Hasil penghitungan ini kemudian dapat digunakan dalam berbagai aplikasi, seperti pengukuran jarak, deteksi rintangan, atau pengaturan posisi otomatis dalam robotika.

Dengan cara kerja ini, sensor ultrasonik mampu memberikan pengukuran jarak dengan akurasi yang tinggi dan kecepatan respon yang sangat cepat, sehingga sangat berguna dalam berbagai proyek dan aplikasi teknik serta otomasi.

4.3 Sensor Aliran Air (Water Flow Sensor) FS300A
Sensor Water Flow FS300A adalah perangkat mekanoelektronik yang berfungsi untuk mengukur laju debit aliran zat cair di dalam pipa atau saluran tertutup berdiameter 3/4 inci. Sensor ini terdiri dari katup plastik, rotor air (kincir), dan sebuah sensor efek Hall (Hall Effect Sensor).




Gambar ini menampilkan grafik karakteristik fisis dari sensor water flow FS300A yang menunjukkan hubungan linier antara laju aliran debit zat cair pada sumbu X (satuan Liter/menit) dengan frekuensi pulsa listrik yang dihasilkan pada sumbu Y (satuan Hertz). Karakteristik linier ini dibuktikan secara empiris melalui data pada tabel, di mana saat debit aliran air bernilai 2 L/MIN kincir magnetik di dalam sensor akan berputar dan menghasilkan frekuensi pulsa sebesar 11 Hz. Seiring meningkatnya kecepatan aliran secara konstan, frekuensi pulsa ikut naik secara linier hingga mencapai angka 33 Hz saat debit berada di 6 L/MIN, dan puncaknya berada di kisaran 55 Hz ketika laju aliran menyentuh batas 10 L/MIN.

Sifat kelinieran grafik tersebut menjadi landasan matematis dalam menentukan konstanta kalibrasi pada kode program STM32. Jika diambil rasio perbandingan antara nilai frekuensi terhadap laju aliran dari titik mana saja pada tabel,sebagai contoh pada kondisi aliran 10 L/MIN dengan frekuensi 55 Hz,maka diperoleh nilai konstanta pembagi yang stabil sebesar 5.5. Perbandingan fisis ini menghasilkan rumusan dasar

4.4 Sensor Rain YL-83




Sensor hujan  adalah perangkat elektronika yang berfungsi untuk mendeteksi keberadaan serta intensitas cairan atau air hujan di lingkungan sekitar. Secara fisik, perangkat ini terdiri dari dua bagian utama, yaitu papan sensor (sensing pad) yang memiliki jalur tembaga terbuka berbentuk zigzag sebagai area tangkapan air, dan modul komparator elektronik yang berfungsi mengondisikan sinyal analog menjadi sinyal digital.

Prinsip kerja dari sensor ini didasarkan pada hukum resistansi listrik dan konduktivitas air. Ketika kondisi cuaca kering atau tidak ada air yang menempel pada papan sensor, hambatan listrik antar jalur tembaga bernilai sangat besar (mendekati tak terhingga), sehingga tidak ada arus listrik yang mengalir. Namun, saat rintik air hujan mulai jatuh dan membasahi papan sensor, air tersebut akan bertindak sebagai konduktor yang menghubungkan jalur-jalur tembaga yang terpisah. Hal ini menyebabkan nilai resistansi pada papan sensor menurun secara drastis sebanding dengan banyaknya volume air yang menempel.










Perubahan resistansi tersebut kemudian dibaca oleh IC komparator (biasanya menggunakan LM393) pada modul sensor. Modul ini menyediakan keluaran digital (Digital Output / DO) yang dikonfigurasikan dengan sistem logika Active LOW. Artinya, ketika sensor mendeteksi adanya air hujan, pin output digital akan mengeluarkan sinyal berlogika LOW (0 Volt atau GPIO_PIN_RESET), dan sebaliknya akan mengeluarkan sinyal HIGH (3.3 Volt atau GPIO_PIN_SET) saat kondisi papan sensor kering.



Dalam implementasi proyek Early Warning System (EWS) ini, pin digital output dari sensor hujan dihubungkan langsung ke pin PA0 pada mikrokontroler STM32F103C8T6. Logika Active LOW ini dimanfaatkan di dalam program untuk memicu perubahan bobot skor matriks risiko secara non-blocking. Ketika pin PA0 membaca logika LOW, sistem akan langsung mengenali bahwa kondisi cuaca sedang hujan dan memberikan bobot nilai risiko sebesar 1, yang kemudian diakumulasikan dengan sensor lainnya untuk menentukan status akhir kebencanaan.

4.5 Protokol Antarmuka Inter-Integrated Circuit (I2C)

I2C adalah protokol komuni kasi serial dua arah sinkron yang dikembangkan oleh Philips Semiconductors (sekarang NXP Semiconductors). Protokol ini dirancang untuk menghubungkan mikrokontroler dengan perangkat periferal jarak pendek menggunakan hanya dua jalur kabel:

  • SDA (Serial Data Line): Jalur untuk transfer data bit demi bit.

  • SCL (Serial Clock Line): Jalur untuk sinkronisasi clock yang dikendalikan oleh perangkat Master.

Layar LCD karakter 16x2 konvensional umumnya memerlukan 8 atau 4 jalur data paralel ditambah dengan jalur kontrol (RS, EN, RW) untuk dapat beroperasi. Hal ini memakan banyak pin I/O pada mikrokontroler. Untuk mengefisiensikan penggunaan pin, digunakan chip ekspander I/O PCF8574.

Chip PCF8574 bertindak sebagai perangkat Slave I2C yang menerima data serial 8-bit dari master (STM32) dan mengonversinya menjadi keluaran paralel 8-bit untuk mengendalikan pin data dan kontrol LCD. Komunikasi I2C memerlukan pengalamatan (addressing) unik agar master dapat mengenali slave. Berdasarkan konfigurasi pin alamat fisik (A0, A1, A2) pada modul chip PCF8574, alamat default yang digunakan adalah 0x27 (atau 0x3F untuk varian PCF8574AT). Di dalam kode program STM32 HAL, alamat 7-bit tersebut digeser ke kiri sebanyak 1 bit agar sesuai dengan format operasi write 8-bit:

Proses Komunikasi I2C Inisiasi dan Start Condition Proses komunikasi I2C dimulai dengan kondisi start, yang ditandai oleh perubahan keadaan SDA dari tinggi ke rendah saat SCL masih tinggi. Setelah terjadi kondisi start, maka master mengirimkan alamat slave yang akan dikontak. Pengalamatan Perangkat Setiap perangkat pada bus I2C memiliki alamat unik. Setelah kondisi start terjadi, master mengirimkan 7 bit pertama yang merupakan alamat slave, diikuti oleh bit kedelapan yang menunjukkan apakah operasi yang diinginkan adalah pembacaan atau penulisan. Pengiriman dan Penerimaan Data Setelah pengalamatan berhasil, proses pengiriman atau penerimaan data akan dimulai. Data dikirim dalam bentuk byte dengan setiap byte diikuti oleh bit ACK (Acknowledge) dari penerima. Proses pengiriman atau penerimaan dapat dilakukan dalam satu atau lebih transaksi tergantung pada kebutuhan aplikasi. Kondisi Stop Proses komunikasi diakhiri dengan kondisi stop, dimana SDA naik ke tinggi saat SCL tetap tinggi. Kondisi stop menunjukkan bahwa transmisi telah selesai dan bus I2C kembali siap untuk digunakan.


LCD 16x2 dengan modul I2C sebenarnya adalah LCD 16x2 biasa yang telah dipasangi sebuah "backpack" atau modul adaptor I2C di bagian belakangnya. Modul ini berisi chip (umumnya PCF8574 atau PCF8574A) yang bertindak sebagai port expander.

  • Keuntungan:

    • Menghemat pin digital Arduino secara drastis! Dari 6-11 pin menjadi hanya 2 pin data (SDA dan SCL). Ini sangat berharga untuk proyek kompleks.

    • Pengkabelan jauh lebih sederhana dan rapi, mengurangi risiko kesalahan koneksi.

    • Membuat kode lebih ringkas dan mudah dipahami karena library I2C mengurus detail komunikasi paralel di baliknya.

    • Satu bus I2C dapat menampung banyak perangkat I2C lainnya (misalnya, sensor suhu, RTC, dll.) secara bersamaan, selama setiap perangkat memiliki alamat I2C yang unik.

  • Kekurangan:

    • Sedikit lebih mahal karena ada modul I2C tambahan.

    • Sedikit lebih lambat dalam kecepatan komunikasi dibandingkan koneksi paralel langsung (meskipun perbedaannya tidak signifikan untuk aplikasi tampilan karakter sederhana).

    • Anda perlu mengetahui alamat I2C modul Anda (umumnya 0x27 atau 0x3F), dan menginstal library LCD I2C yang benar.

Slave Address = 0x27* 2 = 0x4E

4.6 Resistor
Resistor adalah komponen Elektronika Pasif yang memiliki nilai resistansi atau hambatan tertentu yang berfungsi untuk membatasi dan mengatur arus listrik dalam suatu rangkaian Elektronika (V=I R). 
Jenis Resistor yang digunakan disini adalah Fixed Resistor, dimana merupakan resistor dengan nilai tetap terdiri dari film tipis karbon yang diendapkan subtrat isolator kemudian dipotong berbentuk spiral. Keuntungan jenis fixed resistor ini dapat menghasilkan resistor dengan toleransi yang lebih rendah.
Cara menghitung nilai resistor:
Tabel warna

Contoh :
Gelang ke 1 : Coklat = 1
Gelang ke 2 : Hitam = 0
Gelang ke 3 : Hijau   = 5 nol dibelakang angka gelang ke-2; atau kalikan 105
Gelang ke 4 : Perak  = Toleransi 10%
Maka nilai resistor tersebut adalah 10 * 105 = 1.000.000 Ohm atau 1 MOhm dengan toleransi 10%.

5. Flowchart Sistem [Kembali]

6. Listing Program [Kembali]

1. main.c

/* USER CODE BEGIN Header */

/**

******************************************************************************

* @file : main.c

* @brief : Main program body - EWS Banjir Bandang (I2C Migrated)

******************************************************************************

*/

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include "main.h"


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include <stdio.h> // Diperlukan untuk fungsi sprintf (formatting teks LCD)

#include "i2c-lcd.h" // Driver LCD I2C berbasis HAL

/* USER CODE END Includes */zyt


/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */

/* USER CODE END PTD */


/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

/* USER CODE END PD */


/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */

/* USER CODE END PM */


/* Private variables ---------------------------------------------------------*/

I2C_HandleTypeDef hi2c1;

TIM_HandleTypeDef htim2;


/* USER CODE BEGIN PV */

// Variabel Evaluasi Matriks Risiko

uint8_t risk_rain = 0;

uint8_t risk_distance = 0;

uint8_t risk_flow = 0;

uint8_t total_risk = 0;

uint8_t last_total_risk = 99; // Flag untuk deteksi perubahan status (anti-flicker LCD)


// Variabel Pengukuran Sensor

float distance = 0;

volatile uint32_t pulse_count = 0;

float water_flow_rate = 0.0; // Hasil kalkulasi debit dalam Liter/menit (L/min)


// Variabel Manajemen Waktu Non-Blocking (Menggantikan HAL_Delay agar tidak hang)

uint32_t last_sensor_time = 0;

uint32_t last_flow_time = 0;


// Buffer penampung teks LCD

char lcd_buffer[16];


// Fungsi delay mikrodetik manual menggunakan Timer 2 untuk Trigger Ultrasonic

void delay_us(uint32_t us) {

__HAL_TIM_SET_COUNTER(&htim2, 0);

while (__HAL_TIM_GET_COUNTER(&htim2) < us);

}

/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_TIM2_Init(void);

static void MX_I2C1_Init(void);

/* USER CODE BEGIN PFP */

/* USER CODE END PFP */


/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */


/**

* @brief The application entry point.

* @retval int

*/

int main(void)

{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */


/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();


/* USER CODE BEGIN Init */

/* USER CODE END Init */


/* Configure the system clock */

SystemClock_Config();


/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */


/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_TIM2_Init();

MX_I2C1_Init();


/* USER CODE BEGIN 2 */

HAL_TIM_Base_Start(&htim2); // Menghidupkan Timer2 pembaca jarak

LCD_Init(); // Inisialisasi awal layar LCD via I2C

LCD_SendString("EWS SYSTEM READY");

HAL_Delay(1500);

LCD_Cmd(0x01); // Bersihkan Layar awal

/* USER CODE END 2 */


/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

uint32_t current_time = HAL_GetTick();


// =========================================================================

// 1. KALKULASI DEBIT WATER FLOW DARI PULSA CLOCK PROTEUS (TIAP 1 DETIK)

// =========================================================================

if (current_time - last_flow_time >= 1000) {

uint32_t frequency = pulse_count; // Frekuensi = Jumlah pulsa dalam 1 detik (Hz)

pulse_count = 0; // Reset counter untuk detik berikutnya

last_flow_time = current_time;


/* Menggunakan Rumus Sensor Aliran Air Populer (YF-S201): F = 7.5 * Q

* Di mana F adalah Frekuensi (Hz) dan Q adalah Debit Air (L/min)

* Maka: Q = F / 5.5

*/

if (frequency > 0) {

water_flow_rate = (float)frequency / 5.5;

} else {

water_flow_rate = 0.0;

}

}


// =========================================================================

// 2. AMBIL DATA SENSOR & UPDATE OUTPUT SECARA BERKALA (TIAP 200 ms)

// =========================================================================

if (current_time - last_sensor_time >= 200) {

last_sensor_time = current_time;


// A. BACA SENSOR HUJAN DIGITAL (PA0)

if (HAL_GPIO_ReadPin(RAIN_SENSOR_GPIO_Port, RAIN_SENSOR_Pin) == GPIO_PIN_RESET) {

risk_rain = 1; // Terdeteksi Hujan

} else {

risk_rain = 0; // Kondisi Kering

}


// B. BACA SENSOR JARAK ULTRASONIC DENGAN TIMEOUT (PA1 & PA2)

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // Trigger HIGH

delay_us(10);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // Trigger LOW


uint32_t timeout1 = 0;

while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_RESET) {

timeout1++;

if(timeout1 > 5000) break;

}


__HAL_TIM_SET_COUNTER(&htim2, 0); // Mulai hitung durasi


uint32_t timeout2 = 0;

while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_SET) {

timeout2++;

if(timeout2 > 5000) break;

}


uint32_t duration = __HAL_TIM_GET_COUNTER(&htim2);

distance = duration * 0.034 / 2; // Konversi waktu ke jarak (cm)


// C. EVALUASI MATRIKS RISIKO INDIVIDU SENSOR

// 1. Batas Jarak Luapan Air Sungai

if (distance > 25.0 || distance <= 2.0) {

risk_distance = 0;

}

else if (distance >= 12.0) {

risk_distance = 1; // Ketinggian Sedang (Siaga)

}

else {

risk_distance = 2; // Kritis meluap (Bahaya)

}


// 2. Batas Kecepatan Debit Air (Water Flow)

if (water_flow_rate < 5.0) {

risk_flow = 0;

}

else if (water_flow_rate <= 30.0) {

risk_flow = 1; // Arus Sedang (Siaga)

}

else {

risk_flow = 2; // Arus Sangat Deras (Bahaya)

}


// Akumulasi Total Skor Risiko

total_risk = risk_rain + risk_distance + risk_flow;


// D. MANAJEMEN RESET LAYAR LCD (Anti-Flicker I2C)

if (total_risk != last_total_risk) {

LCD_Cmd(0x01);

last_total_risk = total_risk;

}


// Tampilkan Data Sensor di Baris 2 LCD

LCD_SetCursor(2, 1);

sprintf(lcd_buffer, "J:%2d Q:%2d R:%1d", (int)distance, (int)water_flow_rate, total_risk);

LCD_SendString(lcd_buffer);


// E. EKSEKUSI INDIKATOR OUTPUT (LED, BUZZER, & STATUS BARIS 1 LCD)

LCD_SetCursor(1, 1);

if (total_risk <= 1) {

/* ------ KONDISI 1: AMAN ------ */

HAL_GPIO_WritePin(GPIOB, LED_HIJAU_Pin, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB, LED_KUNING_Pin, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, LED_MERAH_Pin, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, BUZZER_Pin, GPIO_PIN_RESET);


LCD_SendString("STATUS: AMAN ");

}

else if (total_risk == 2 || total_risk == 3) {

/* ------ KONDISI 2: SIAGA ------ */

HAL_GPIO_WritePin(GPIOB, LED_HIJAU_Pin, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, LED_KUNING_Pin, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB, LED_MERAH_Pin, GPIO_PIN_RESET);


// Membuat Buzzer berbunyi intermiten pelan (Toggle tiap loop 200ms)

HAL_GPIO_TogglePin(GPIOB, BUZZER_Pin);


LCD_SendString("STATUS: SIAGA ");

}

else if (total_risk >= 4) {

/* ------ KONDISI 3: BAHAYA ------ */

HAL_GPIO_WritePin(GPIOB, LED_HIJAU_Pin, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, LED_KUNING_Pin, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, LED_MERAH_Pin, GPIO_PIN_SET);


// Buzzer berbunyi konstan tanpa putus

HAL_GPIO_WritePin(GPIOB, BUZZER_Pin, GPIO_PIN_SET);


LCD_SendString("FLASH FLOOD!! ");

}

}

/* USER CODE END WHILE */


/* USER CODE BEGIN 3 */

}

/* USER CODE END 3 */

}


/**

* @brief System Clock Configuration

* @retval None

*/

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};


RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

RCC_OscInitStruct.HSEState = RCC_HSE_ON;

RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Error_Handler();

}


RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;


if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

{

Error_Handler();

}

}


/**

* @brief I2C1 Initialization Function

* @param None

* @retval None

*/

static void MX_I2C1_Init(void)

{

hi2c1.Instance = I2C1;

hi2c1.Init.ClockSpeed = 100000;

hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;

hi2c1.Init.OwnAddress1 = 0;

hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;

hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

hi2c1.Init.OwnAddress2 = 0;

hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

if (HAL_I2C_Init(&hi2c1) != HAL_OK)

{

Error_Handler();

}

}


/**

* @brief TIM2 Initialization Function

* @param None

* @retval None

*/

static void MX_TIM2_Init(void)

{

TIM_ClockConfigTypeDef sClockSourceConfig = {0};

TIM_MasterConfigTypeDef sMasterConfig = {0};


htim2.Instance = TIM2;

// FIXED: Menggunakan Prescaler 72-1 karena clock sistem berjalan di 72MHz (HSE PLL)

htim2.Init.Prescaler = 72-1;

htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

htim2.Init.Period = 65535;

htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

if (HAL_TIM_Base_Init(&htim2) != HAL_OK)

{

Error_Handler();

}

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)

{

Error_Handler();

}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)

{

Error_Handler();

}

}


/**

* @brief GPIO Initialization Function

* @param None

* @retval None

*/

static void MX_GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};


/* GPIO Ports Clock Enable */

__HAL_RCC_GPIOD_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();


/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);


/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(GPIOB, LED_HIJAU_Pin|LED_KUNING_Pin|LED_MERAH_Pin|BUZZER_Pin, GPIO_PIN_RESET);


/*Configure GPIO pin : RAIN_SENSOR_Pin */

GPIO_InitStruct.Pin = RAIN_SENSOR_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_PULLDOWN;

HAL_GPIO_Init(RAIN_SENSOR_GPIO_Port, &GPIO_InitStruct);


/*Configure GPIO pin : PA1 */

GPIO_InitStruct.Pin = GPIO_PIN_1;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


/*Configure GPIO pin : PA2 */

GPIO_InitStruct.Pin = GPIO_PIN_2;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


/*Configure GPIO pin : FLOW_PIN_Pin */

GPIO_InitStruct.Pin = FLOW_PIN_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

GPIO_InitStruct.Pull = GPIO_PULLDOWN;

HAL_GPIO_Init(FLOW_PIN_GPIO_Port, &GPIO_InitStruct);


/*Configure GPIO pins : LED_HIJAU_Pin LED_KUNING_Pin LED_MERAH_Pin BUZZER_Pin */

GPIO_InitStruct.Pin = LED_HIJAU_Pin|LED_KUNING_Pin|LED_MERAH_Pin|BUZZER_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


/* EXTI interrupt init*/

HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(EXTI0_IRQn);

}


/* USER CODE BEGIN 4 */

// Callback EXTI0: Menangkap pulsa dari CLOCK Generator Proteus secara real-time

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {

if (GPIO_Pin == FLOW_PIN_Pin) { // Menggunakan alias Pin Name yang sesuai dengan .ioc kamu

pulse_count++;

}

}

/* USER CODE END 4 */


void Error_Handler(void)

{

/* USER CODE BEGIN Error_Handler_Debug */

while(1)

{

}

/* USER CODE END Error_Handler_Debug */

}


Library

2.l2c_lcd.c

#include "main.h"

#include "i2c-lcd.h"

extern I2C_HandleTypeDef hi2c1; // Mengambil handle I2C dari main.c

#define SLAVE_ADDRESS_LCD 0x4E // Alamat I2C default PCF8574 (0x27 << 1)


void LCD_Cmd(char cmd) {

char data_u, data_l;

uint8_t data_t[4];

data_u = (cmd & 0xf0);

data_l = ((cmd << 4) & 0xf0);

data_t[0] = data_u | 0x0C; // en=1, rs=0

data_t[1] = data_u | 0x08; // en=0, rs=0

data_t[2] = data_l | 0x0C; // en=1, rs=0

data_t[3] = data_l | 0x08; // en=0, rs=0

HAL_I2C_Master_Transmit(&hi2c1, SLAVE_ADDRESS_LCD, (uint8_t *)data_t, 4, 100);

}


void LCD_Data(char data) {

char data_u, data_l;

uint8_t data_t[4];

data_u = (data & 0xf0);

data_l = ((data << 4) & 0xf0);

data_t[0] = data_u | 0x0D; // en=1, rs=1

data_t[1] = data_u | 0x09; // en=0, rs=1

data_t[2] = data_l | 0x0D; // en=1, rs=1

data_t[3] = data_l | 0x09; // en=0, rs=1

HAL_I2C_Master_Transmit(&hi2c1, SLAVE_ADDRESS_LCD, (uint8_t *)data_t, 4, 100);

}


void LCD_Init(void) {

HAL_Delay(50);

LCD_Cmd(0x30);

HAL_Delay(5);

LCD_Cmd(0x30);

HAL_Delay(1);

LCD_Cmd(0x32);

HAL_Delay(10);

LCD_Cmd(0x28); // Mode 4-bit, 2 Baris

HAL_Delay(1);

LCD_Cmd(0x0C); // Display ON, Cursor OFF

HAL_Delay(1);

LCD_Cmd(0x06); // Auto-increment kursor

HAL_Delay(1);

LCD_Cmd(0x01); // Clear Screen

HAL_Delay(2);

}


void LCD_SendString(char *str) {

while (*str) LCD_Data(*str++);

}


void LCD_SetCursor(uint8_t row, uint8_t col) {

uint8_t address = (row == 1) ? (0x80 + col - 1) : (0xC0 + col - 1);

LCD_Cmd(address);

}



3.i2c_lcd.h

#ifndef INC_I2C_LCD_H_

#define INC_I2C_LCD_H_


#include "main.h"


void LCD_Init(void);

void LCD_Cmd(char cmd);

void LCD_Data(char data);

void LCD_SendString(char *str);

void LCD_SetCursor(uint8_t row, uint8_t col);


#endif /* INC_I2C_LCD_H_ */

7. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

 Rangkaian Simulasi Pada Proteus      






Konfigurasi  Pada  Pin STM32CUBEIde





Prinsip Kerja:


1. Konfigurasi Input / Output (I/O) Mikrokomputer

Sistem ini menggunakan mikrokontroler STM32F103C8T6 dengan pembagian pin periferal sebagai berikut:

Blok Input (Sensor)

  • PA0 (RAIN_SENSOR): Dionfigurasi sebagai Digital Input (Pull-Down) untuk mendeteksi sinyal dari sensor hujan.

  • PA2 (Echo): Dikonfigurasi sebagai Digital Input (No-Pull) untuk menangkap pulsa balik pantulan gelombang ultrasonik.

  • PB0 (FLOW_PIN): Dikonfigurasi sebagai External Interrupt (EXTI0 - Rising Edge) untuk mencacah pulsa kotak generator air secara real-time.

Blok Output (Aktuator & Display)

  • PA1 (Trigger): Digital Output untuk menembakkan pulsa pemicu ke sensor ultrasonik.

  • PA4, PA5, PA6, PA7, PB1, PB10: Dikonfigurasi sebagai Digital Output untuk mengendalikan LCD 16x2 standar (Mode Paralel 4-Bit: RS, E, D4, D5, D6, D7).

  • PB12 (LED_HIJAU), PB13 (LED_KUNING), PB14 (LED_MERAH): Digital Output sebagai indikator visual status ancaman.

  • PB15 (BUZZER): Digital Output sebagai indikator peringatan suara.

1. Prinsip Kerja Sensor Aliran Air (Water Flow Sensor FS300A)

Sensor aliran air (water flow sensor) bekerja dengan memanfaatkan prinsip fisika efek Hall (Hall Effect) untuk mengukur volume cairan yang melewatinya. Komponen internal sensor ini terdiri dari sebuah katup plastik dengan kincir atau baling-baling magnet di dalamnya yang akan berputar ketika terkena dorongan arus aliran air. Di dekat baling-baling tersebut terdapat sebuah sensor magnetik (sensor efek Hall) yang akan mendeteksi setiap kutub magnet kincir saat berputar dan mengonversinya menjadi deretan pulsa gelombang kotak (square wave pulse). Sinyal pulsa kotak ini dikirimkan langsung ke pin PB0 pada STM32 yang telah dikonfigurasi sebagai jalur interupsi eksternal (EXTI0). Setiap terjadi transisi sinyal dari rendah ke tinggi (Rising Edge), fungsi interupsi dalam kode program akan menangkap dan menaikkan nilai pencacah pulsa (pulse_count++) secara real-time. Selanjutnya, setiap rentang waktu 1 detik (1000 ms), akumulasi jumlah pulsa (frekuensi dalam Hz) tersebut dikalkulasi oleh mikrokontroler menggunakan rumus konversi spesifik :



2. Prinsip Kerja Sensor Jarak Ultrasonik (HC-SR04)


Sensor ultrasonik HC-SR04 bekerja dengan memanfaatkan prinsip propagasi pantulan gelombang akustik atau gelombang suara berfrekuensi tinggi untuk mengukur jarak permukaan air sungai. Proses pengukuran ini diinisiasi oleh mikrokontroler dengan cara menembakkan sinyal pemicu berlogika HIGH selama 10 mikrodetik melalui pin PA1 (Trigger). Menerima sinyal pemicu tersebut, transduser pemancar (transmitter) pada sensor ultrasonik otomatis memancarkan 8 siklus gelombang akustik berfrekuensi 40 kHz ke arah permukaan air sungai. Pada saat yang bersamaan, pin PA2 (Echo) akan berubah menjadi berlogika HIGH dan Timer 2 (TIM2) pada STM32 mulai menghitung waktu. Gelombang suara tersebut merambat di udara, mengenai permukaan air, dan memantul kembali ke arah sensor sebagai gema (echo). Begitu gelombang pantulan tersebut ditangkap oleh transduser penerima (receiver), pin Echo akan kembali berubah menjadi berlogika LOW. Selisih waktu antara pulsa dipancarkan dan pulsa diterima kembali dicatat sebagai variabel durasi mikrodetik. Menggunakan konstanta kecepatan suara di udara bebas yaitu 340 m/s, jarak aktual luapan air dapat dihitung dengan rumus distance

 


, di mana hasil perkalian harus dibagi 2 karena durasi mencakup waktu perjalanan bolak-balik gelombang.

3. Prinsip Kerja Sensor Hujan Digital (Rain Sensor Module)

Sensor hujan bekerja berdasarkan prinsip perubahan resistansi atau hambatan listrik pada papan sensor (rain board) yang dilapisi oleh jalur-jalur nikel konduktif. Ketika kondisi lingkungan sekitar sistem berada dalam keadaan kering atau tidak terjadi hujan, jalur-jalur nikel konduktif pada papan sensor terpisah oleh udara sehingga memiliki nilai resistansi yang sangat tinggi. Hambatan yang tinggi ini membuat rangkaian modul komparator elektronik mengeluarkan output tegangan maksimal atau berlogika HIGH (5V/3.3V). Sebaliknya, ketika butiran air hujan mulai jatuh dan membasahi permukaan papan sensor, air hujan yang bersifat konduktif akan bertindak sebagai jembatan yang menghubungkan jalur-jalur nikel tersebut. Hal ini menyebabkan nilai resistansi papan sensor langsung merosot drastis (drop). Penurunan resistansi ini dideteksi oleh IC komparator pada modul, yang kemudian mengubah output tegangan pada pin digitalnya menjadi berlogika LOW atau mendekati 0V (GPIO_PIN_RESET). Sinyal digital inilah yang dibaca secara berkala setiap 200 ms oleh mikrokontroler melalui pin PA0, sehingga status cuaca hujan atau kering dapat langsung divalidasi ke dalam sistem evaluasi risiko kebencanaan.


    Secara garis besar, alur kerja sistem Early Warning System (EWS) Banjir Bandang ini terbagi menjadi tiga tahapan utama yang beroperasi secara sekuensial dan berulang di dalam kalang tak berujung while(1). Tahapan tersebut bergerak runtut mulai dari Tahap

 1: Akuisisi Data Sensor (Input), berlanjut ke Tahap 2: Evaluasi Matriks Risiko (Proses), dan diakhiri pada Tahap 3: Seleksi Kondisi dan Penentuan Keputusan (Output).

Tahap 1: Akuisisi Data Sensor (Input)

Prinsip kerja sistem dimulai sesaat setelah mikrokontroler STM32 dinyalakan, di mana sistem langsung melakukan inisialisasi terhadap seluruh pin GPIO yang terhubung, mengaktifkan komponen Timer 2, serta memunculkan pesan awalan berupa teks "EWS SYSTEM READY" pada layar LCD selama 1.5 detik. Setelah fase inisialisasi tersebut selesai, program utama akan langsung memasuki kalang looping transisi non-blocking. Di dalam kalang ini, data frekuensi pulsa aliran air akan diambil secara berkala setiap rentang waktu 1 detik, sedangkan pengambilan data fisis untuk sensor jarak ultrasonik serta pembacaan status dari sensor hujan akan ditarik secara serentak setiap 200 ms.

Tahap 2: Evaluasi Matriks Risiko (Proses) Setelah seluruh nilai fisis dari lapangan berhasil didapatkan, nilai-nilai tersebut tidak langsung dieksekusi menjadi output, melainkan dikonversi terlebih dahulu ke dalam poin skor risiko individu yang direpresentasikan oleh variabel risk_distance, risk_flow, dan risk_rain. Pada parameter Skor Jarak Luapan Sungai (risk_distance), jika variabel Jarak lebih dari 25 cm maka poin akan bernilai 0 (Kondisi air jauh atau Aman); jika 12 cm hingga 25 cm (12 cm <= Jarak <= 25 cm) maka poin akan bernilai 1 (Kondisi air mulai naik atau Siaga); dan jika Jarak kurang dari 12 cm maka poin otomatis bernilai 2 (Kondisi air kritis meluap atau Bahaya). Selanjutnya pada Skor Arus Debit Air (risk_flow), jika nilai Debit kurang dari 5 L/min maka poin bernilai 0 (Aliran tenang atau Aman); jika 5 L/min hingga 30 L/min (5 L/min <= Debit <= 30 L/min) maka poin bernilai 1 (Arus sedang atau Siaga); serta jika Debit lebih dari 30 L/min maka poin bernilai 2 (Arus sangat deras atau Bahaya). Sementara untuk Skor Cuaca (risk_rain), sistem akan memberikan poin 0 jika kondisi lingkungan Kering, dan memberikan poin 1 jika kondisi terdeteksi Hujan. Seluruh kalkulasi skor individu ini kemudian diakumulasikan ke dalam satu variabel penentu keputusan akhir menggunakan rumus:

total_risk = risk_rain + risk_distance + risk_flow

Tahap 3: Seleksi Kondisi dan Penentuan Keputusan (Output) Berdasarkan bobot dari nilai akhir variabel total_risk tersebut, sistem akan langsung mengelompokkan respon aktuator ke dalam tiga kondisi spesifik.

  • Kondisi 1 (Status Aman): Terjadi apabila nilai total_risk <= 1, yang mengindikasikan bahwa cuaca sedang kering, air sungai surut, dan aliran arus tenang. Pada kondisi ini, pin PB12 (LED Hijau) diatur ON, sedangkan pin PB13 (LED Kuning), pin PB14 (LED Merah), serta pin PB15 (Buzzer) diatur dalam posisi OFF atau hening, diikuti dengan tampilan LCD baris pertama yang memuat teks "STATUS: AMAN ".

  • Kondisi 2 (Status Siaga): Terjadi jika nilai total_risk bernilai 2 atau 3, yang dipicu oleh adanya fluktuasi kenaikan salah satu parameter atau kombinasi dari dua parameter fisis (seperti cuaca hujan lebat yang disertai naiknya permukaan air ke batas menengah). Respon dari kondisi ini adalah mengaktifkan pin PB13 (LED Kuning) menjadi ON, menonaktifkan pin PB12 (LED Hijau) dan pin PB14 (LED Merah) menjadi OFF, serta mengeksekusi pin PB15 (Buzzer) dengan metode Toggle intermiten. Hal ini membuat buzzer berbunyi putus-putus pendek (seperti suara bip... bip... bip...) pada setiap siklus 200 ms sebagai sinyal peringatan awal bagi warga di bantaran sungai, sementara LCD baris pertama akan menampilkan teks "STATUS: SIAGA ".

  • Kondisi 3 (Status Bahaya / Flash Flood): Diaktifkan apabila nilai total_risk >= 4, di mana mayoritas atau seluruh parameter telah mencapai titik kritis tertinggi seperti kombinasi hujan deras, luapan air di bawah 12 cm, dan laju arus di atas 30 L/min. Menanggapi situasi darurat ini, pin PB14 (LED Merah) akan langsung diaktifkan ON, pin PB12 (LED Hijau) beserta pin PB13 (LED Kuning) dimatikan OFF, dan pin PB15 (Buzzer) dikunci total pada posisi ON konstan sehingga mengeluarkan suara melengking tanpa putus sebagai sirine evakuasi dini. Layar LCD pada baris pertama pun akan langsung memunculkan teks peringatan kebencanaan berupa "FLASH FLOOD!! ".

Sebagai langkah akhir dari seluruh rangkaian proses, fungsi logika pembatas menggunakan variabel last_total_risk akan dijalankan untuk memeriksa tingkat kestabilan data. Jika hasil evaluasi risiko pada siklus saat ini masih sama dengan siklus sebelumnya, maka sistem LCD tidak akan melakukan perintah clear screen (LCD_Cmd(0x01)) secara keseluruhan, melainkan hanya memperbarui data string teks pada baris kedua saja untuk parameter J (Jarak), Q (Debit), dan R (Total Risiko). Penerapan algoritma penyaringan ini terbukti sangat efektif untuk menghilangkan masalah layar berkedip (flicker) yang kerap terjadi dan mengganggu keterbacaan display saat dijalankan pada simulasi Proteus.

8. Video Simulasi[Kembali]

9. Download File [Kembali]

File ZIP rangkaian [ klik disini ]

Video demo [ klik disini ]

Datasheeet  STM32F103C8T6 [ klik disini ]

Datasheeet  HC SR-04 [ klik disini ]

datasheet Rain Sensor [ klik disini ]

datasheet Waterflow sensor FS300A [ klik disini ]

Datasheet LED Merah [ klik disini ]

Datasheet LED Kuning [ klik disini ]

Datasheet LED Hijau  [ klik disini ]

Datasheet I2c [ klik disini ]

Datasheet  Potensiometer [ klik disini

Library Water flow Sensor [ klik disini

 Library Rain  Sensor [ klik disini

 Library Ultrasonic Sensor [ klik disini

Komentar

Postingan populer dari blog ini