Jumat, 12 Juni 2026

MODUL 4 PROJECT




Smart Irrigation: Sistem Distribusi Air Irigasi Otomatis Pascabencana Berbasis STM32


1. Pendahuluan [Kembali]

Sektor pertanian, khususnya irigasi sawah, sering kali menjadi sektor yang paling rentan mengalami kelumpuhan pascabencana alam seperti banjir bandang atau galodo. Ketika infrastruktur atau saluran irigasi utama mengalami kerusakan parah, petani dihadapkan pada krisis ketersediaan air bersih untuk lahan pertanian mereka. Sebagai alternatif, air sungai di sekitar area terdampak kerap dimanfaatkan guna menjaga keberlangsungan siklus tanam. Kendati demikian, air sungai pascabencana umumnya memiliki kualitas yang buruk karena tercampur dengan material erosi seperti lumpur pekat, pasir, kerikil kecil, hingga sampah material bangunan. Jika air keruh dan kotor tersebut langsung dialirkan secara masif ke area persawahan tanpa melalui pengkondisian terlebih dahulu, hal tersebut tidak hanya dapat merusak kesuburan tanah dan mengganggu pertumbuhan optimal tanaman, tetapi juga berisiko tinggi menyumbat pipa serta mempercepat kerusakan mekanis pada komponen pompa air yang digunakan.

Pada penelitian ini dirancang sebuah Smart Irrigation: Sistem Distribusi Air Irigasi Otomatis Pascabencana Berbasis STM32 yang memanfaatkan air sungai sebagai sumber air alternatif. Sistem dilengkapi dengan dua tahap penyaringan untuk mengurangi kandungan sampah, lumpur, dan partikel padat sebelum air masuk ke tangki penampungan. Proses pengisian tangki dilakukan menggunakan pompa AC yang dikendalikan secara otomatis berdasarkan kondisi level air yang dideteksi oleh float switch. Selain itu, sensor turbidity digunakan untuk memantau tingkat kekeruhan air sehingga hanya air yang memenuhi batas kualitas tertentu yang dapat didistribusikan ke lahan pertanian melalui solenoid valve. Apabila tingkat kekeruhan melebihi nilai ambang yang telah ditentukan, sistem akan menghentikan aliran air dan memberikan peringatan melalui indikator LED serta buzzer untuk mencegah penyaluran air yang tidak layak ke area irigasi.

Untuk mendukung proses monitoring, sistem juga dilengkapi dengan flow sensor yang berfungsi mengukur debit dan volume air yang disalurkan ke lahan pertanian. Seluruh informasi penting seperti kondisi level air tangki, status pompa, tingkat kekeruhan air, debit aliran, dan status katup distribusi ditampilkan secara real-time pada LCD sehingga memudahkan pengguna dalam melakukan pengawasan sistem. Dengan penerapan teknologi sensor dan mikrokontroler STM32, sistem ini diharapkan mampu menjadi solusi alternatif dalam mendukung pemulihan jaringan irigasi pascabencana, meningkatkan efisiensi distribusi air, serta membantu menjaga keberlanjutan aktivitas pertanian di daerah terdampak bencana.

 

2. Tujuan [Kembali]

Sistem ini dirancang untuk:
  1. Memanfaatkan air sungai pascabencana sebagai sumber air alternatif untuk irigasi.
  2. Melakukan penyaringan dan pemantauan kualitas air sebelum didistribusikan ke sawah.
  3. Mengotomatisasi pengisian tangki berdasarkan level air menggunakan float switch.
  4. Mengendalikan distribusi air secara otomatis berdasarkan tingkat kekeruhan air.
  5. Menampilkan informasi kondisi sistem secara real-time sebagai media monitoring.


3. Alat dan Komponen [Kembali]

Komponen
1. STM32F103C8T6


2. Sensor Turbidity


3. Float Switch


4. Flow Sensor



5. Solenoid Valve

6. Pompa DC 5V


7. AC Dimmer Robodyn


8. LCD I2C 16x2



9. Buzzer



10. LED Merah dan Hijau

 



11. Resistor


12. Adaptor 5V

13. Relay 5V


14. Motor Servo

15. DC to DC Step Down


Alat
1. ST-Link


2. Breadboard


3. Jumper


Bahan
1. Tangki Penampungan


2. Penyaring (Kain Kasa)


3. Selang/Pipa



4. Kabel Tunggal



5. Akrilik


4. Landasan Teori [Kembali]

1. General Input Output 
      Input adalah semua data dan perintah yang dimasukkan ke dalam memori untuk diproses lebih lanjut oleh mikroprosesor. Sebuah perangkat input adalah komponen piranti keras yang memungkinkan user atau pengguna memasukkan data ke dalam mikroprosesor. Output adalah data hasil yang telah diproses. Perangkat output adalah semua komponen piranti keras yang menyampaikan informasi kepada orang-orang yang menggunakannya. 
      Pada STM32 pin input/output terdiri dari digital dan analog yang jumlah pin-nya tergantung jenis mikrokontroller yang digunakan. Input digital digunakan untuk mendeteksi perubahan logika biner pada pin tertentu. Adanya input digital memungkinkan mikrokontroler untuk dapat menerjemahkan 0V menjadi logika LOW dan 5V menjadi logika HIGH. Membaca sinyal digital pada mikrokontroller dapat menggunakan sintaks digitalRead(pin):
    Output digital terdiri dari dua buah logika, yaitu kondisi logika HIGH dan kondisi logika LOW. Untuk menghasilkan output kita dapat menggunakan sintaks digitalWrite(pin,nilai); yang sebelumnya pin sudah diset ke mode OUTPUT, lalu parameter kedua adalah set nilai HIGH atau LOW. Apabila pin diset dengan nilai HIGH, maka voltase pin tersebut akan diset ke 5V atau 3.3V dan bila pin diset ke LOW, maka voltase pin tersebut akan diset ke 0V.


2. PWM 
    PWM (Pulse Width Modulation) adalah salah satu teknik modulasi dengan mengubah lebar pulsa (duty cylce) dengan nilai amplitudo dan frekuensi yang tetap. Satu siklus pulsa merupakan kondisi high kemudian berada di zona transisi ke kondisi low. Lebar pulsa PWM berbanding lurus dengan amplitudo sinyal asli yang belum termodulasi. 
    Duty Cycle adalah perbandingan antara waktu ON (lebar pulsa High) dengan perioda. Duty Cycle biasanya dinyatakan dalam bentuk persen (%). 



Duty Cycle = tON / ttotal
Ton            =  Waktu ON atau Waktu dimana tegangan keluaran berada pada posisi tinggi (high atau 1) 
Toff           = Waktu OFF atau Waktu dimana tegangan keluaran berada pada posisi rendah (low atau 0) 
Ttotal      = Waktu satu siklus atau penjumlahan antara Ton dengan Toff atau disebut juga dengan “periode satu gelombang” 
  

3. ADC 
     Sistem mikrokontroler hanya dapat mengolah data dalam bentuk bine. Oleh sebab itu setiap data analog yang akan diproses oleh mikrokontroler harus diubah kedalam bentuk kode biner dimana Pengubahan data analog kedalam bentuk biner ditangani oleh piranti ADC. Tegangan masukan ADC didapatkan dari tranducer. Tranducer adalah pengubah besaran kontinu, dalam hal ini adalah tegangan DC 12 Volt. Tegangan listrik yang dihasilkan oleh tranducer yang berubah secara kontinu pada suatu kisaran tertentu disebut tegangan analog, dan tegangan analog ini diubah oleh ADC menjadi bentuk digital yang sebanding dengan tegangan analognya.

Ada 4 karakteristik yang perlu diperhatikan dalam pemilihan komponen ADC, antara lain :

1)     Resolusi

Merupakan spesifikasi terpenting untuk ADC, yaitu jumlah langkah dari sinyal skala penuh yang dapat dibagi dan juga ukuran dari langkah_langkah, dinyatakan dalam jumlah bit yang ada dalam satu kata (digital words), ukuran langkah terkecil sebagai persen dari skala penuh atau dapat juga langkah terkecil dalam miliVolt (untuk skala penuh yang dihasilkan).

2)     Akurasi

Adalah jumlah dari semua kesalahan, misalnya kesalahan non linieritas, skala penuh, skala nol, dan lain-lain. Dapat juga menyatakan perbedaan antara tegangan masukan analog secara teoritis yang dibutuhkan untuk menghasilkan suatu kode biner tertentu terhadap tegangan masukan nyata yang menghasilkan tegangan kode biner tersebut.

3)     Waktu Konversi

Adalah waktu yang dibutuhkan untuk mengubah setiap sampel ke bentuk digital, atau yang diperlukan untuk menyelesaikan suatu konversi.

4)     Fungsi Transfer Ideal ADC

Fungsi transfer ideal untuk konverter analog-ke-digital (ADC, analog-to-digital converter) berbentuk garis lurus. Bentuk ideal garis lurus hanya dapat dicapai dengan konverter data beresolusi tak-hingga. Karena tidak mungkin mendapatkan resolusi tak hingga, maka secara praktis fungsi tranfer ideal tersebut berbentuk gelombang tangga seragam seperti terlihat pada Gambar 1.5 Semakin tinggi resolusi ADC, semakin halus gelombang tangga tersebut. ADC ideal secara unik dapat merepresentasikan seluruh rentang masukan analog tertentu dengan sejumlah kode keluaran digital. Pada gambar 1 ditunjukkan bahwa setiap kode digital merepresentasikan sebagian dari rentang masukan analog total. Oleh karena skala analog bersifat kontinyu sedangkan kode digital bersifat diskrit, maka ada proses kuantisasi yang menimbulkan kekeliruan (galat). Apabila jumlah kode diskritnya (yang mewakili rentang masukan analog) ditambah, maka lebar undak (step width) akan semakin kecil dan fungsi transfer akan mendekati garis lurus ideal. Lebar satu undak (step) didefinisikan sebagai 1 LSB (least significant bit) dan unit ini digunakan sebagai unit rujukan untuk besaran-besaran lain dalam spesifikasi peranti konversi data. Unit 1 LSB itu juga digunakan untuk mengukur resolusi konverter karena ia juga menggambarkan jumlah bagian atau unit dalam rentang analog penuh.

Resolusi ADC selalu dinyatakan sebagai jumlah bit-bit dalam kode keluaran digitalnya. Misalnya, ADC dengan resolusi n-bit memiliki 2n kode digital yang mungkin dan berarti juga memiliki 2n tingkat undak (step level). Meskipun demikian, karena undak pertama dan undak terakhir hanya setengah dari lebar penuh, maka rentang skala-penuh (FSR, full-scale range) dibagi dalam (2n -1) lebar undak. 


4. Interrupt
    Interrupt adalah mekanisme yang memungkinkan suatu instruksi atau perangkat I/O untuk menghentikan sementara eksekusi normal prosesor agar dapat diproses lebih dulu seperti memiliki prioritas tertinggi. Misalnya, saat prosesor menjalankan tugas utama, ia juga dapat terus memantau apakah ada kejadian atau sinyal dari sensor yang memicu interrupt. Ketika terjadi interrupt eksternal, prosesor akan menghentikan sementara tugas utamanya untuk menangani interrupt terlebih dahulu, kemudian melanjutkan eksekusi normal setelah selesai menangani interrupt tersebut. Fungsi yang menangani interrupt disebut Interrupt Service Routine (ISR), yang dieksekusi secara otomatis setiap kali interrupt terjadi.
            

5. COMMUNICATION
5.1 UART (Universal Asynchronous Receiver Transmitter)
     UART (Universal Asynchronous Receiver-Transmitter) adalah bagian perangkat keras komputer yang menerjemahkan antara bit-bit paralel data dan bit-bit serial. UART biasanya berupa sirkuit terintegrasi yang digunakan untuk komunikasi serial pada komputer atau port serial perangkat periperal.

Gambar 12. Cara Kerja Komunikasi UART

        Data dikirimkan secara paralel dari data bus ke UART1. Pada UART1 ditambahkan start bit, parity bit, dan stop bit kemudian dimuat dalam satu paket data. Paket data ditransmisikan secara serial dari Tx UART1 ke Rx UART2. UART2 mengkonversikan data dan menghapus bit tambahan, kemudia di transfer secara parallel ke data bus penerima.

5.2 I2C (Inter-Integrated Circuit) 
         Inter Integrated Circuit atau sering disebut I2C adalah standar komunikasi serial dua arah menggunakan dua saluran yang didisain khusus untuk mengirim maupun menerima data. Sistem I2C terdiri dari saluran SCL (Serial Clock) dan SDA (Serial Data) yang membawa informasi data antara I2C dengan pengontrolnya.



        Pada I2C, data ditransfer dalam bentuk message yang terdiri dari kondisi start, Address Frame, R/W bit, ACK/NACK bit, Data Frame 1, Data Frame 2, dan kondisi Stop. Kondisi start dimana saat pada SDA beralih dari logika high ke low sebelum SCL. Kondisi stop dimana saat pada SDA beralih dari logika low ke high sebelum SCL. 
        R/W bit berfungsi untuk menentukan apakah master mengirim data ke slave atau meminta data dari slave. (logika 0 = mengirim data ke slave, logika 1 = meminta data dari slave) ACK/NACK bit berfungsi sebagai pemberi kabar jika data frame ataupun address frame telah diterima receiver.

5.3 SPI (Series Peripheral Interface) 
         Serial Peripheral Interface (SPI) merupakan salah satu mode komunikasi serial synchronous berkecepatan tinggi yang dimiliki oleh STM32F407VGT6 dan Raspberry Pi Pico. Komunikasi SPI membutuhkan 3 jalur utama yaitu MOSI, MISO, dan SCK, serta jalur tambahan SS/CS. Melalui komunikasi ini, data dapat saling dikirimkan baik antara mikrokontroler maupun antara mikrokontroler dengan perangkat periferal lainnya. 

MOSI (Master Output Slave Input)
    Jika dikonfigurasi sebagai master, maka pin MOSI berfungsi sebagai output. Sebaliknya, jika dikonfigurasi sebagai slave, maka pin MOSI berfungsi sebagai input. 
• MISO (Master Input Slave Output) 
    Jika dikonfigurasi sebagai master, maka pin MISO berfungsi sebagai input. Sebaliknya, jika dikonfigurasi sebagai slave, maka pin MISO berfungsi sebagai output. 
• SCLK (Serial Clock) 
    Jika dikonfigurasi sebagai master, maka pin SCLK bertindak sebagai output untuk memberikan sinyal clock ke slave. Sebaliknya, jika dikonfigurasi sebagai slave, maka pin SCLK berfungsi sebagai input untuk menerima sinyal clock dari master. 
• SS/CS (Slave Select/Chip Select) 
    Jalur ini digunakan oleh master untuk memilih slave yang akan dikomunikasikan. Pin SS/CS harus dalam keadaan aktif (umumnya logika rendah) agar komunikasi dengan slave dapat berlangsung.



        Sinyal clock dialirkan dari master ke slave yang berfungsi untuk sinkronisasi. Master dapat memilih slave mana yang akan dikirimkan data melalui slave select, kemudian data dikirimkan dari master ke slave melalui MOSI. Jika master butuh respon data maka slave akan mentransfer data ke master melalui MISO. 

 
6. STM32F103C8T6
STM32F103C8T6 adalah salah satu mikrokontroler dari keluarga STM32 yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini berbasis arsitektur ARM Cortex-M3 32-bit yang dirancang untuk memenuhi kebutuhan sistem tertanam dengan performa tinggi dan konsumsi daya rendah (STMicroelectronics, 2022). Chip ini termasuk dalam seri STM32F1 dan memiliki spesifikasi teknis yang cukup andal, seperti kecepatan clock hingga 72 MHz, memori flash sebesar 64 KB, dan RAM sebesar 20 KB. Selain itu, mikrokontroler ini dilengkapi dengan fitur ADC 12-bit sebanyak 10 kanal, serta antarmuka komunikasi digital seperti USART, SPI, dan I2C yang banyak digunakan dalam sistem monitoring dan kontrol otomatis (Mazidi, Naimi, & Naimi, 2018).



Keunggulan lainnya dari STM32F103C8T6 adalah fleksibilitas dalam pemrograman. Mikrokontroler ini dapat diprogram menggunakan berbagai platform pengembangan seperti STM32CubeIDE, Keil µVision, maupun Arduino IDE melalui STM32duino bootloader, sehingga mendukung kebutuhan pengguna pemula hingga profesional (Valvano, 2012). Board minimalis seperti “Blue Pill” yang menggunakan chip ini juga banyak dipilih karena harga yang terjangkau dan kemudahan dalam integrasi dengan sensor maupun aktuator. Mikrokontroler ini sangat cocok diterapkan dalam berbagai aplikasi, mulai dari otomasi rumah tangga, pengendali motor, sistem sensor lingkungan, hingga proyek berbasis Internet of Things (IoT) (Patterson, 2017).

STM32F103C8T6 adalah mikrokontroler 32-bit yang berbasis pada arsitektur ARM Cortex-M3 dan termasuk dalam keluarga STM32F1 series. Berikut adalah spesifikasi utamanya:

Fitur

Spesifikasi

Arsitektur CPU

ARM Cortex-M3 (32-bit RISC)

Frekuensi Clock Maksimum

72 MHz

Memori Flash

64 KB

SRAM (RAM)

20 KB

Jumlah GPIO (General I/O)

Hingga 37 pin I/O

Jumlah ADC (Analog to Digital)

2 ADC 12-bit, hingga 10 kanal input

DAC

Tidak tersedia (perlu eksternal jika diperlukan)

Timer

3 timer 16-bit + 1 timer 16-bit advanced (PWM, dll)

Komunikasi Serial

USART (x3), SPI (x2), I2C (x2)

USB

Full Speed USB 2.0 (Device only)

Watchdog Timer

Independent dan window watchdog

Operating Voltage

2.0 V – 3.6 V

Tegangan I/O

3.3 V (toleran hingga 5V input pada beberapa pin)

Tegangan Referensi ADC (Vref)

3.3 V

Operating Temperature

-40°C hingga +85°C

Packaging

LQFP-48 (48 pin)

Bootloader Interface

UART, USB (melalui DFU), atau SWD

Ukuran Fisik Board Blue Pill

Sekitar 5.3 cm x 2.2 cm




7. Sensor Turbidity

Sensor turbiditas mendeteksi kualitas air dengan mengukur tingkat kekeruhan. Ini menggunakan cahaya untuk mendeteksi partikel tersuspensi dalam air dengan mengukur transmisi cahaya dan laju hamburan, yang berubah dengan jumlah total padatan tersuspensi (TSS) dalam air. Ketika TTS meningkat, tingkat kekeruhan cairan meningkat.  Sensor turbiditas digunakan untuk mengukur kualitas air di sungai dan sungai, pengukuran air limbah dan limbah, instrumentasi kontrol untuk kolam pengendapan, penelitian transportasi sedimen dan pengukuran laboratorium.  Sensor ini menyediakan mode output sinyal analog dan digital. Ambang batas dapat disesuaikan saat dalam mode sinyal digital. Anda dapat memilih mode sesuai dengan MCU Anda. 

Spesifikasinya meliputi

  • Tegangan Operasi: 5V DC 
  • Operasi Saat Ini: 40mA (MAX) 
  • Waktu Respons: <500ms 
  • Resistansi isolasi: 100M (mnt) 
  • Output analog: 0-4.5V 
  • Output Digital: Sinyal level Tinggi / Rendah
  • Suhu Operasional: 5 ~ 90 
  • Suhu penyimpanan: -10 ~ 90 
  • Berat: 30g 
  • Dimensi adaptor:  38mm * 28mm * 10mm / 1.5 inci * 1.1 inci * 0.4 inci

 Persamaan NTU

Dengan batas kekeruhan yang ditetapkan sebesar 50 NTU, maka:

Menggunakan persamaan kuadrat:

Konversi ke nilai ADC 12-bit STM32:



Grafik Respon Sensor Turbidity


 





8. Float Switch

Float switch merupakan sensor level cairan yang bekerja berdasarkan pergerakan pelampung (float) akibat perubahan ketinggian fluida di dalam tangki. Ketika permukaan cairan naik atau turun, pelampung akan bergerak mengikuti level cairan tersebut. Di dalam pelampung terdapat magnet permanen yang akan mengaktifkan atau menonaktifkan reed switch yang berada di dalam tabung sensor. Saat pelampung mencapai titik level yang telah ditentukan, kontak reed switch akan berubah kondisi (ON/OFF) sehingga menghasilkan sinyal untuk mengendalikan atau memberikan indikasi kondisi level cairan.

Spesifikasi: 

Parameter

Nilai

Daya kontak maksimum

10 W

Tegangan switching maksimum

100 VDC

Arus switching maksimum

0,5 A

Tegangan tembus maksimum

220 VDC

Arus hantar maksimum

1,0 A

Resistansi kontak maksimum

100 mΩ

Rentang suhu operasi

-20°C hingga 80°C

Resistansi isolasi

> 10 Ω

Resistansi kontak

< 100 mΩ

Material pelampung

Polypropylene (PP)

Panjang bodi sensor

46 mm

Diameter luar sensor

17,5 mm

Panjang kabel

350 mm



9. Flow Sensor

 


Water flow sensor YF-S201 merupakan sensor aliran air berbasis efek Hall yang mengukur volume air dengan mendeteksi putaran rotor. Sensor ini terdiri dari rumah plastik berisi turbin kecil yang berputar ketika air mengalir, seperti ditunjukkan pada Gambar 3 [struktur water flow sensor]. Pada rotor terdapat magnet permanen yang memicu sensor Hall setiap kali melewatinya, menghasilkan pulsa listrik.

Prinsip Kerja

  1. Konversi Aliran ke Pulsa
  • Debit air yang mengalir memutar turbin dengan kecepatan proporsional.
  • Setiap putaran menghasilkan 1 pulsa dari sensor Hall (Gambar 4 [grafik pulsa vs debit]).
  • Kalibrasi standar: 4500 pulsa/liter (tertera di datasheet).

2.  Proses Pembacaan

  • Pulsa dihitung oleh STM32 menggunakan fitur interrupt pada pin PA2.
  • Volume air dihitung dengan rumus:



10. Solenoid Valve
Solenoid valve atau katup solenoida adalah komponen elektromekanis yang digunakan untuk mengontrol aliran cairan atau gas dengan prinsip kerja berbasis medan magnet. Katup ini bekerja secara otomatis dengan menggunakan lilitan kawat (koil) yang menghasilkan medan magnet saat dialiri arus listrik. Medan magnet ini kemudian menggerakkan plunger (batang logam ferromagnetik) untuk membuka atau menutup jalur aliran fluida. Saat tidak dialiri listrik, pegas akan mengembalikan plunger ke posisi semula, sehingga katup kembali ke posisi default (normal tertutup atau normal terbuka) (Patterson, 2017).

Terdapat dua jenis utama solenoid valve berdasarkan kondisi default-nya:

  1. Normally Closed (NC): jalur tertutup saat tidak dialiri listrik, dan terbuka saat koil aktif.

  2. Normally Open (NO): jalur terbuka saat tidak dialiri listrik, dan tertutup saat koil aktif.

Dalam sistem otomatis seperti pemanenan air nira, solenoid valve biasanya digunakan untuk membuka dan menutup aliran cairan secara otomatis berdasarkan input dari sensor. Ketika sensor level air mendeteksi bahwa penampungan akhir belum penuh, mikrokontroler akan mengaktifkan solenoid valve sehingga cairan nira dapat mengalir dari tangki atas ke tangki bawah. Ketika sensor mendeteksi bahwa volume sudah mencukupi, mikrokontroler akan memutus aliran listrik ke solenoid valve, sehingga katup menutup secara otomatis.

Keunggulan utama dari solenoid valve adalah waktu respon yang cepat, desain kompak, dan kemudahan integrasi dengan sistem kontrol otomatis berbasis mikrokontroler seperti STM32. Solenoid valve yang digunakan dalam proyek ini biasanya beroperasi pada tegangan 5V, 12V DC atau 24V DC dan dikendalikan melalui relay yang diaktifkan oleh sinyal digital dari mikrokontroler. 

Spesifikasi Teknis Solenoid Valve 5V DC
  • Tegangan Nominal (Tegangan Terukur): 5V
  • Arus (pada DC 5V): 1,1A
  • Resistansi DC (Hambatan): 4,5 ± 5% Ω
  • Jarak Dorong/Langkah (pada DC 5V): 3mm / 80g (kekuatan dorong)
  • Panjang Kabel Selubung (Panjang Timah): ~57mm / 2,2"
  • Berat: 12,6g

11. Pompa DC 5V

Motor pump / pompa air adalah alat untuk menggerakan air dari tempat bertekanan rendah ke tempat bertekanan yang lebih tinggi. Pada dasarnya motor pump sama dengan motor DC pada umumnya, hanya saja sudah di-packing sedemikian rupa sehingga dapat digunakan di dalam air. 

Spesifikasi :

  • Panjang kabel USB: 1 Meter
  • Jenis Pompa: Submersible DC
  • Tegangan Kerja: 3 - 5V
  • Batas Tegangan: 2.5 - 6V DC
  • Konsumsi Arus: 120 - 330 mA
  • Konsumsi Daya: 0.4 - 1.5W
  • Kapasitas Pompa: 80 - 120L/H
  • Dimensi Luar: 7.5mm / 0.3"
  • Dimensi Dalam: 4.7mm / 0.18"
  • Diameter Pompa: Kurang lebih 24 mm / 0.95"
  • Panjang Pompa: Kurang lebih 45 mm / 1.8"
  • Tinggi Pompa: Kurang lebih 33 mm / 1.30"
  • Material: Engineering plastic
  • Aktuator: Brushless DC
  • Masa Kerja: 500 jam

12. AC Dimmer Robodyn
AC Dimmer RobotDyn merupakan modul pengendali daya beban AC yang memungkinkan pengaturan besar daya listrik yang diberikan ke beban seperti lampu, pemanas, kipas AC, atau peralatan listrik lainnya menggunakan mikrokontroler. Modul ini bekerja pada tegangan logika 5 V dan kompatibel dengan mikrokontroler 5 V maupun 3,3 V. AC Dimmer digunakan untuk mengatur tingkat kecerahan lampu, kecepatan motor AC, atau daya keluaran beban AC lainnya dengan cara mengubah besar daya yang diterima oleh beban.
Prinsip kerja AC Dimmer didasarkan pada metode Pulse Width Modulation (PWM) yang dikombinasikan dengan deteksi zero crossing pada gelombang AC. Pin Zero Crossing digunakan untuk mendeteksi saat gelombang AC melewati titik nol, kemudian mikrokontroler memberikan sinyal PWM ke pin DIM untuk mengatur waktu penyalaan TRIAC pada setiap setengah siklus gelombang AC. Semakin cepat TRIAC diaktifkan setelah titik zero crossing, semakin besar daya yang diberikan ke beban. Sebaliknya, semakin lama penundaannya, semakin kecil daya yang diterima beban. Dengan metode ini, daya keluaran dapat diatur secara bertahap dari 0% hingga 100% sesuai kebutuhan aplikasi.

Spesifikasi: 

Parameter

Spesifikasi

Jumlah kanal

1 Channel

Tegangan operasi

5 V DC

Kompatibilitas logika

3,3 V dan 5 V

Metode kontrol

Pulse Width Modulation (PWM)

Tegangan beban

230 V AC

Arus beban maksimum

5 A

Kontrol daya

0–100%

Pin kontrol

PWM (DIM) dan Zero Crossing

 

13. LCD I2C 16x2

Pengertian LCD (Liquid Crystal Display), LCD (Liquid Crystal Display) adalah jenis tampilan layar yang menggunakan senyawa cair yang memiliki struktur molekul polar, ditempatkan di antara dua elektroda transparan. Ketika medan listrik diberikan, molekul-molekul tersebut akan menyesuaikan posisinya pada medan dan membentuk susunan kristalin yang mempolarisasi cahaya yang melaluinya. Citra dihasilkan dengan menggabungkan kondisi nyala dan mati dari piksel-piksel yang membentuk layar LCD. Umumnya, LCD yang dijual di pasaran telah dilengkapi dengan sirkuit terintegrasi sehingga pengguna dapat dengan mudah mengontrol tampilan LCD menggunakan mikrokontroler dan mengirimkan data melalui pin input yang telah tersedia. 


Gambar 25. Stuktur penyusun LCD 



Spesifikasi LCD I2C:
Format tampilan : 16 x 2 karakter
Pengontrol bawaan : ST 7066 (atau setara)
Siklus kerja : 1/16
5 x 8 titik termasuk kursor
Supply + 5 V (juga tersedia untuk + 3 V)
LED dapat digerakkan oleh pin 1, pin 2, pin 15, pin 16 atau A dan K
N.V. opsional untuk supply + 3 V
Kontrol pin : SDA dan SCL
Built-in potensio untuk adjust brightness
Built-in jumper untuk menon-aktifkan backlight
Dimensi : 40mm x 18mm
Berat : 20 gram


Pinout LCD I2C

Pin name

Pin type

Pin description

GND

Power

Ground

VCC

Power

Voltage Input

SDA

I2C Data

Serial Data

SCL

I2C Clock

Serial Clock

A0

Jumper

I2C Address Selection 1

A1

Jumper

I2C Address Selection 2

A2

Jumper

I2C Address Selection 3

Backlight

Jumper

Control Backlight of panel


14. Buzzer

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

Spesifikasi :

        Nilai tegangan : 6V DC 

        Tegangan pengoperasian : 4 hingga 8V DC

        Arus : ≤30mA

        Keluaran suara pada 10cm : ≥85dB

        Frekuensi resonansi : 2300 ±300Hz

        Nada : Berkelanjutan

        Suhu operasional : -25°C hingga +80°C

        Suhu penyimpanan : -30°C hingga +85°C

        Berat : 2g


15. LED Merah dan Hijau

LED (Light Emitting Diode) adalah perangkat semikonduktor yang menghasilkan cahaya ketika arus listrik melewatinya. LED terdiri dari bahan semikonduktor yang memiliki dua terminal, yaitu anoda (terminal positif) dan katoda (terminal negatif). Ketika arus listrik mengalir melalui LED, energi listrik tersebut merangsang elektron-elektron di dalam bahan semikonduktor, yang kemudian menghasilkan cahaya.

 



·       Karakteristrik spesifikasi LED berdasarkan Datasheet :

  • Tegangan Maju (Vf): Tegangan minimum yang diperlukan agar LED dapat menyala. Biasanya berkisar antara 1.8V hingga 3.3V, tergantung pada warna LED.
  • Arus Maju (If): Arus maksimum yang dapat dialirkan melalui LED tanpa merusaknya. Biasanya berkisar antara 10mA hingga 30mA.
  • Intensitas Cahaya (Luminous Intensity): Jumlah cahaya yang dipancarkan oleh LED, biasanya dinyatakan dalam millicandela (mcd).
  • Panjang Gelombang (Wavelength): Menentukan warna cahaya yang dipancarkan oleh LED.
  • Sudut Pandang (Viewing Angle): Sudut di mana cahaya LED dapat terlihat dengan jelas.


16. 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 * 10^5 = 1.000.000 Ohm atau 1 MOhm dengan toleransi 10%.


17. Adaptor 5V

Adaptor 5V merupakan perangkat catu daya yang berfungsi mengubah tegangan listrik AC dari jaringan PLN menjadi tegangan DC sebesar 5 volt yang dapat digunakan oleh perangkat elektronik. Pada proyek Sistem Pengendalian dan Distribusi Air Irigasi Otomatis Pascabencana Berbasis STM32 Blue Pill, adaptor 5V digunakan sebagai sumber daya utama untuk mikrokontroler STM32, sensor, LCD, buzzer, dan komponen elektronik lainnya. Adaptor bekerja dengan menurunkan tegangan AC, menyearahkan arus menggunakan rangkaian penyearah, kemudian menstabilkan tegangan sehingga diperoleh keluaran DC 5V yang aman dan stabil untuk sistem.

Spesifikasi: 

  • Tegangan input: 100–240 V AC
  • Frekuensi: 50–60 Hz
  • Tegangan output: 5 V DC
  • Arus output maksimum: 1,2 A
  • Daya maksimum: 6 W
  • Suhu operasi: 0–40°C. 


  • 18. ST-Link

    ST-Link merupakan perangkat pemrograman (programmer) dan debugging yang digunakan untuk mengunggah program dari komputer ke mikrokontroler STM32. Pada proyek ini, ST-Link berfungsi sebagai media komunikasi antara komputer dan STM32 Blue Pill saat proses pemrograman maupun pengujian sistem. Cara kerjanya yaitu dengan menghubungkan antarmuka SWD (Serial Wire Debug) pada STM32 ke ST-Link, sehingga kode program yang dibuat dapat ditransfer dan dijalankan pada mikrokontroler secara langsung.

    Spesifikasi:

    • Tegangan kerja: 5 V DC
    • Tegangan target STM32: 3,0–3,6 V
    • Antarmuka: USB 2.0, SWD/JTAG
    • Suhu operasi: 0–50°C

    19. Breadboard

    Breadboard terdiri dari lubang yang digunakan untuk menempatkan terminal komponen dan kemudian lubang ini dihubungkan satu sama lain menggunakan berbagai kabel/kawat.  Dua baris pertama (atas) dan dua baris terakhir (bawah) papan breadboard digunakan untuk positif (satu baris pertama dan terakhir dua) dan untuk negatif (baris lain dari dua pertama dan terakhir). Pada gambar breadboar di atas, dua baris pertama (atas) dan terakhir (bawah) papan breadboard terdiri dari 5 lubang di setiap kolom (total 10 kolom) saling terhubung secara horizontal satu sama lain secara internal. Jika terminal sumber daya terhubung dalam satu lubang satu kolom di baris atas atau bawah (salah satu dari dua baris), maka daya listrik yang sama dapat diambil dari lima lubang berturut-turut di kolom yang sama.

    20. Jumper

    Kabel jumper adalah kabel elektrik yang memiliki pin konektor di setiap ujungnya dan memungkinkan untuk menghubungkan dua komponen tanpa memerlukan solder. Biasanya kabel jamper digunakan pada breadboard atau alat prototyping lainnya agar lebih mudah untuk mengutak-atik rangkaian. Konektor yang ada pada ujung kabel terdiri atas dua jenis yaitu konektor jantan (male connector) dan konektor betina (female connector).
    Jenis-jenis kabel jumper meliputi:
    a. Kabel Jumper Male-to-Male (M-M): Kabel ini memiliki konektor male di kedua ujungnya. Digunakan untuk menghubungkan dua titik pada breadboard atau menghubungkan titik pada breadboard dengan pin header pada mikrokontroler atau modul.
    b. Kabel Jumper Male-to-Female (M-F): Kabel ini memiliki konektor male di satu ujung dan konektor female di ujung lainnya. Biasanya digunakan untuk menghubungkan pin header pada mikrokontroler atau modul dengan perangkat yang memiliki konektor male.
    c. Kabel Jumper Female-to-Female (F-F): Kabel ini memiliki konektor female di kedua ujungnya. Umumnya digunakan untuk menghubungkan dua perangkat yang memiliki konektor male, seperti menghubungkan modul sensor dengan mikrokontroler


    21. Tangki Penampungan
    Tangki penampungan merupakan wadah yang digunakan untuk menampung air sebelum didistribusikan ke lahan irigasi. Pada proyek ini, tangki berfungsi sebagai tempat penyimpanan sementara air yang telah dipompa dari sumber air sungai sehingga ketersediaan air untuk irigasi dapat lebih terjaga. Tangki bekerja sebagai reservoir yang menampung debit air masuk dan mengalirkannya kembali melalui sistem distribusi sesuai kebutuhan, dengan kondisi volume air dipantau menggunakan sensor level air (float switch).

    22. Penyaring (Kain Kasa)

    Penyaring berupa kain kasa digunakan untuk menyaring kotoran berukuran besar yang terbawa oleh aliran air sungai, seperti daun, ranting, lumpur kasar, dan sampah kecil. Pada proyek ini, penyaring berfungsi sebagai tahap filtrasi awal sebelum air masuk ke pompa dan sistem distribusi. Cara kerjanya yaitu dengan menahan partikel-partikel padat yang ukurannya lebih besar daripada pori-pori kain kasa sehingga kualitas air yang masuk ke sistem menjadi lebih baik dan risiko penyumbatan komponen dapat dikurangi.

    23. Selang/Pipa

    Pipa merupakan saluran yang digunakan untuk mengalirkan air dari satu titik ke titik lainnya dalam sistem irigasi. Pada proyek ini, pipa berfungsi sebagai media distribusi air dari sumber air menuju tangki penampungan dan dari tangki menuju saluran irigasi. Cara kerjanya yaitu dengan mengarahkan aliran air yang dihasilkan oleh pompa sehingga air dapat sampai ke lokasi tujuan dengan lebih terkontrol dan efisien.

    24. Kabel Tunggal

    Kabel tunggal adalah kabel listrik yang terdiri dari satu konduktor kawat padat atau serabut, dilapisi isolasi, berfungsi menyalurkan arus dari satu titik ke titik lain dalam berbagai instalasi. Prinsip kerjanya sederhana: konduktor logam beresistansi rendah menyediakan jalur aliran elektron, sementara isolasi mencegah korsleting dan menjaga arus tetap pada jalurnya, dengan kemampuan penyaluran arus dan keamanan dipengaruhi luas penampang serta jenis isolasinya.

    Karakteristik Spesifikasi Umum Kabel Tunggal:

            ·       Tipe Konduktor: Kawat padat (solid) atau serabut tunggal (stranded).
    ·       Material Konduktor: Umumnya Tembaga (Copper).
    ·       Material Isolasi: PVC (Polyvinyl Chloride) adalah yang paling umum.
    ·  Ukuran Penampang (Gauge): Dinyatakan dalam mm² (misal: 1.5 mm², 2.5 mm²), menentukan kapasitas arus.
    ·       Tegangan Nominal: Tegangan kerja maksimum yang diizinkan (misal: 450/750 V).
    ·       Suhu Operasi Maksimum: Suhu tertinggi yang dapat ditahan isolasi (misal: 70C).
    ·       Fleksibilitas: Rendah (untuk solid) hingga sedang (untuk stranded).
    ·       Standar: Memenuhi standar keamanan listrik nasional/internasional.


    25. Akrilik


    Akrilik merupakan material plastik transparan yang memiliki sifat ringan, kuat, dan tahan terhadap korosi. Pada proyek ini, akrilik digunakan sebagai bahan konstruksi atau casing sistem, seperti wadah prototipe, dudukan sensor, maupun penutup rangkaian elektronik. Penggunaan akrilik memudahkan proses pengamatan komponen di dalam sistem karena sifatnya yang transparan, sekaligus memberikan perlindungan terhadap komponen elektronik dari gangguan fisik dan percikan air.

    26. Relay 5V


    Relay adalah komponen elektronik berupa saklar elektronik yang digerakkan oleh arus listrik. Secara prinsip, relay merupakan tuas saklar dengan lilitan kawat pada batang besi (solenoid) di dekatnya, ketika solenoid dialiri arus listrik, tuas akan tertarik karena adanya gaya magnet yang terjadi pada solenoid sehingga kontak saklar akan menutup. Pada saat arus dihentikan, gaya magnet akan hilang, tuas akan kembali keposisi semula dan kontak saklar kembali terbuka. Relay biasanya digunakan untuk menggerakkan arus/tegangan yang besar (misalnya peralatan listrik 4 A/AC 220V) dengan memakai arus/tegangan yang kecil (misalnya 0.1 A/12 volt DC).

    Spesifikasi :

    • Trigger Voltage (Voltage across coil) : 5V DC
    • Trigger Current (Nominal current) : 70mA
    • Maximum AC load current: 10A @ 250/125V AC
    • Maximum DC load current: 10A @ 30/28V DC
    • Compact 5-pin configuration with plastic moulding
    • Operating time: 10msec Release time: 5msec
    • Maximum switching: 300 operating/minute (mechanically)


    27. Motor Servo
    Motor servo merupakan aktuator elektromekanik yang dirancang untuk menghasilkan gerakan putar dengan tingkat presisi tinggi terhadap posisi, kecepatan, maupun torsi. Motor servo bekerja menggunakan sistem kontrol tertutup (closed-loop control) yang memanfaatkan sensor umpan balik (feedback) berupa encoder untuk memantau posisi rotor secara terus-menerus. Berdasarkan informasi tersebut, pengendali akan menyesuaikan tegangan dan arus yang diberikan ke motor sehingga posisi atau sudut putaran yang diinginkan dapat dicapai secara akurat. Pada sistem ini, motor servo digunakan sebagai pengganti solenoid valve untuk mengatur buka-tutup aliran air secara otomatis. Ketika air memenuhi kriteria kualitas yang telah ditentukan, motor servo akan memutar mekanisme katup ke posisi terbuka sehingga air dapat mengalir menuju lahan irigasi. Sebaliknya, apabila kualitas air tidak memenuhi syarat, motor servo akan mengembalikan katup ke posisi tertutup untuk menghentikan distribusi air.

    Spesifikasi Motor Servo

    • Tegangan operasi: 360 VDC
    • Daya nominal: 135 W
    • Arus nominal: 0,83 A
    • Arus maksimum: 3,3 A
    • Kecepatan nominal: 9000 rpm
    • Torsi nominal: 0,14 Nm
    • Torsi maksimum: 0,5 Nm
    • Suhu operasi: -10°C hingga 40°C
     

    5. Flowchart [Kembali]



    6. Listing Program [Kembali]

     MAIN.H

    /* USER CODE BEGIN Header */

    /**

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

    * @file : main.h

    * @brief : Header for main.c file.

    * This file contains the common defines of the application.

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

    * @attention

    *

    * Copyright (c) 2026 STMicroelectronics.

    * All rights reserved.

    *

    * This software is licensed under terms that can be found in the LICENSE file

    * in the root directory of this software component.

    * If no LICENSE file comes with this software, it is provided AS-IS.

    *

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

    */

    /* USER CODE END Header */


    /* Define to prevent recursive inclusion -------------------------------------*/

    #ifndef __MAIN_H

    #define __MAIN_H


    #ifdef __cplusplus

    extern "C" {

    #endif


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

    #include "stm32f1xx_hal.h"


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

    /* USER CODE BEGIN Includes */


    /* USER CODE END Includes */


    /* Exported types ------------------------------------------------------------*/

    /* USER CODE BEGIN ET */


    /* USER CODE END ET */


    /* Exported constants --------------------------------------------------------*/

    /* USER CODE BEGIN EC */


    /* USER CODE END EC */


    /* Exported macro ------------------------------------------------------------*/

    /* USER CODE BEGIN EM */


    /* USER CODE END EM */


    void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);


    /* Exported functions prototypes ---------------------------------------------*/

    void Error_Handler(void);


    /* USER CODE BEGIN EFP */


    /* USER CODE END EFP */


    /* Private defines -----------------------------------------------------------*/


    /* USER CODE BEGIN Private defines */


    /* USER CODE END Private defines */


    #ifdef __cplusplus

    }

    #endif


    #endif /* __MAIN_H */



    MAIN.C

    /* USER CODE BEGIN Header */

    /**

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

    * @file : main.c

    * @brief : Main program body

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

    * @attention

    *

    * Copyright (c) 2026 STMicroelectronics.

    * All rights reserved.

    *

    * This software is licensed under terms that can be found in the LICENSE file

    * in the root directory of this software component.

    * If no LICENSE file comes with this software, it is provided AS-IS.

    *

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

    */

    /* USER CODE END Header */

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

    #include "main.h"

    #include "liquidcrystal_i2c.h"

    #include <stdio.h>

    #include <string.h>

    #include <math.h>


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

    /* USER CODE BEGIN Includes */


    /* USER CODE END Includes */


    /* 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 ---------------------------------------------------------*/

    ADC_HandleTypeDef hadc1;

    I2C_HandleTypeDef hi2c1;

    TIM_HandleTypeDef htim1;

    UART_HandleTypeDef huart1;


    /* USER CODE BEGIN PV */

    uint32_t turbidity_adc = 0;

    volatile uint32_t pulseCount = 0;

    float flowRate = 0;

    char lcdBuffer[20];

    uint32_t lastMillis = 0;

    uint32_t lcdTimer = 0;

    /* USER CODE END PV */


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

    void SystemClock_Config(void);

    static void MX_GPIO_Init(void);

    static void MX_I2C1_Init(void);

    static void MX_TIM1_Init(void);

    static void MX_ADC1_Init(void);

    static void MX_USART1_UART_Init(void);

    /* USER CODE BEGIN PFP */


    /* USER CODE END PFP */


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

    /* USER CODE BEGIN 0 */


    int row = 0;

    int col = 0;


    uint32_t Read_ADC(void)

    {

    HAL_ADC_Start(&hadc1);

    HAL_ADC_PollForConversion(&hadc1, 100);

    return HAL_ADC_GetValue(&hadc1);

    }


    /* 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_I2C1_Init();

    MX_TIM1_Init();

    MX_ADC1_Init();

    MX_USART1_UART_Init();

    /* USER CODE BEGIN 2 */


    /* Start PWM untuk AC Dimmer pada PA8 (TIM1 Channel 1) */

    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);


    /* LCD Init */

    HD44780_Init(2);

    HD44780_Backlight();


    HD44780_Clear();

    HD44780_SetCursor(0, 0);

    HD44780_PrintStr("System Ready");


    HAL_Delay(2000);

    HD44780_Clear();


    /* USER CODE END 2 */


    /* Infinite loop */

    /* USER CODE BEGIN WHILE */

    while (1)

    {

    /* 1. Membaca Nilai Sensor Kekeruhan Air (PA1) */

    turbidity_adc = Read_ADC();


    /* 2. Hitung Debit Air Setiap 1 Detik */

    if(HAL_GetTick() - lastMillis >= 1000)

    {

    // Konversi pulsa ke range proporsional 0-10 L/m

    flowRate = (float)pulseCount / 40.0f;


    if (flowRate > 10.0f) {

    flowRate = 10.0f;

    }


    pulseCount = 0;

    lastMillis = HAL_GetTick();

    }


    /* 3. Logika Float Sensor (PA0) untuk Mengatur Kecepatan Aliran via AC Dimmer (PA8) */

    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)

    {

    /* Air di tangki semakin sedikit -> Dimmer dipercepat (PWM tinggi) */

    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 950);

    }

    else

    {

    /* Tangki penuh / normal -> Dimmer kecepatan standar */

    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 400);

    }


    /* 4. Logika Utama Sistem Berdasarkan Sifat Tegangan Sensor Turbidity */

    if(turbidity_adc < 2000)

    {

    /* KONDISI AIR KERUH */

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET); // LED MERAH = ON

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // LED HIJAU = OFF

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // SOLENOID VALVE = OFF (MOTOR BERHENTI)


    /* Paksa nilai flow rate menjadi mutlak 0 L/min karena Valve tertutup */

    flowRate = 0.0f;

    pulseCount = 0;


    /* BUZZER PROTEUS: Pola Square Wave lambat agar terdeteksi oleh simulator Proteus */

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);

    HAL_Delay(20);

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);

    HAL_Delay(20);

    }

    else

    {

    /* KONDISI AIR JERNIH */

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); // LED MERAH = OFF

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);// BUZZER = OFF

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // LED HIJAU = ON

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // SOLENOID VALVE = ON (MOTOR BERPUTAR)

    }


    /* 5. Update Tampilan LCD 16x2 setiap 250ms */

    if(HAL_GetTick() - lcdTimer >= 250)

    {

    lcdTimer = HAL_GetTick();

    HD44780_Clear();


    // Baris 1: Menampilkan Aliran Debit Air

    sprintf(lcdBuffer, "FLOW:%4.1f L/m", flowRate);

    HD44780_SetCursor(0, 0);

    HD44780_PrintStr(lcdBuffer);


    // Baris 2: Status Valve (V:ON/OFF) & Kondisi Air

    HD44780_SetCursor(0, 1);

    if(turbidity_adc < 2000)

    {

    HD44780_PrintStr("V:OFF KERUH");

    }

    else

    {

    HD44780_PrintStr("V:ON JERNIH");

    }

    }


    /* 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_PeriphCLKInitTypeDef PeriphClkInit = {0};


    /** Initializes the RCC Oscillators according to the specified parameters

    * in the RCC_OscInitTypeDef structure.

    */

    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; // PERBAIKAN DI SINI: Menggunakan RCC_HSI_ON yang benar

    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();

    }


    /** Initializes the CPU, AHB and APB buses clocks

    */

    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();

    }

    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;

    PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;

    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

    {

    Error_Handler();

    }

    }


    /**

    * @brief ADC1 Initialization Function

    * @param None

    * @retval None

    */

    static void MX_ADC1_Init(void)

    {

    /* USER CODE BEGIN ADC1_Init 0 */


    /* USER CODE END ADC1_Init 0 */


    ADC_ChannelConfTypeDef sConfig = {0};


    /* USER CODE BEGIN ADC1_Init 1 */


    /* USER CODE END ADC1_Init 1 */


    /** Common config

    */

    hadc1.Instance = ADC1;

    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;

    hadc1.Init.ContinuousConvMode = DISABLE;

    hadc1.Init.DiscontinuousConvMode = DISABLE;

    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;

    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;

    hadc1.Init.NbrOfConversion = 1;

    if (HAL_ADC_Init(&hadc1) != HAL_OK)

    {

    Error_Handler();

    }


    /** Configure Regular Channel: PA1 (Turbidity Module)

    */

    sConfig.Channel = ADC_CHANNEL_1;

    sConfig.Rank = ADC_REGULAR_RANK_1;

    sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;

    if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)

    {

    Error_Handler();

    }

    /* USER CODE BEGIN ADC1_Init 2 */


    /* USER CODE END ADC1_Init 2 */

    }


    /**

    * @brief I2C1 Initialization Function

    * @param None

    * @retval None

    */

    static void MX_I2C1_Init(void)

    {

    /* USER CODE BEGIN I2C1_Init 0 */


    /* USER CODE END I2C1_Init 0 */


    /* USER CODE BEGIN I2C1_Init 1 */


    /* USER CODE END I2C1_Init 1 */

    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();

    }

    /* USER CODE BEGIN I2C1_Init 2 */


    /* USER CODE END I2C1_Init 2 */

    }


    /**

    * @brief TIM1 Initialization Function

    * @param None

    * @retval None

    */

    static void MX_TIM1_Init(void)

    {

    /* USER CODE BEGIN TIM1_Init 0 */


    /* USER CODE END TIM1_Init 0 */


    TIM_MasterConfigTypeDef sMasterConfig = {0};

    TIM_OC_InitTypeDef sConfigOC = {0};

    TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};


    /* USER CODE BEGIN TIM1_Init 1 */


    /* USER CODE END TIM1_Init 1 */

    htim1.Instance = TIM1;

    htim1.Init.Prescaler = 71;

    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;

    htim1.Init.Period = 999;

    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

    htim1.Init.RepetitionCounter = 0;

    htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

    if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)

    {

    Error_Handler();

    }

    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

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

    {

    Error_Handler();

    }

    sConfigOC.OCMode = TIM_OCMODE_PWM1;

    sConfigOC.Pulse = 0;

    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

    sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;

    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

    sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;

    sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;


    /* Configure PWM Channel 1 pada PA8 (AC Dimmer) */

    if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)

    {

    Error_Handler();

    }

    sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;

    sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;

    sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;

    sBreakDeadTimeConfig.DeadTime = 0;

    sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;

    sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;

    sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;

    if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)

    {

    Error_Handler();

    }

    /* USER CODE BEGIN TIM1_Init 2 */


    /* USER CODE END TIM1_Init 2 */

    HAL_TIM_MspPostInit(&htim1);

    }


    /**

    * @brief USART1 Initialization Function

    * @param None

    * @retval None

    */

    static void MX_USART1_UART_Init(void)

    {

    /* USER CODE BEGIN USART1_Init 0 */


    /* USER CODE END USART1_Init 0 */


    /* USER CODE BEGIN USART1_Init 1 */


    /* USER CODE END USART1_Init 1 */

    huart1.Instance = USART1;

    huart1.Init.BaudRate = 115200;

    huart1.Init.WordLength = UART_WORDLENGTH_8B;

    huart1.Init.StopBits = UART_STOPBITS_1;

    huart1.Init.Parity = UART_PARITY_NONE;

    huart1.Init.Mode = UART_MODE_TX_RX;

    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

    huart1.Init.OverSampling = UART_OVERSAMPLING_16;

    if (HAL_UART_Init(&huart1) != HAL_OK)

    {

    Error_Handler();

    }

    /* USER CODE BEGIN USART1_Init 2 */


    /* USER CODE END USART1_Init 2 */

    }


    /**

    * @brief GPIO Initialization Function

    * @param None

    * @retval None

    */

    static void MX_GPIO_Init(void)

    {

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* USER CODE BEGIN MX_GPIO_Init_1 */


    /* USER CODE END MX_GPIO_Init_1 */


    /* GPIO Ports Clock Enable */

    __HAL_RCC_GPIOD_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();


    /*Configure GPIO pin Output Level Awal ke LOW */

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_10, GPIO_PIN_RESET);


    /*Configure GPIO pin : PA0 (Float Sensor Input) */

    GPIO_InitStruct.Pin = GPIO_PIN_0;

    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    /*Configure GPIO pin : PA2 (Flow Sensor EXTI Interrupt) */

    GPIO_InitStruct.Pin = GPIO_PIN_2;

    GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    /*Configure GPIO pins : PB0 PB1 PB3 PB10 (Solenoid, LED Hijau, LED Merah, Buzzer) */

    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_10;

    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 untuk Flow Sensor pada PA2 */

    HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(EXTI2_IRQn);


    /* USER CODE BEGIN MX_GPIO_Init_2 */


    /* USER CODE END MX_GPIO_Init_2 */

    }


    /* USER CODE BEGIN 4 */

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

    {

    /* Menangkap pulsa eksternal dari generator pulsa Proteus */

    if(GPIO_Pin == GPIO_PIN_2)

    {

    pulseCount++;

    }

    }

    /* USER CODE END 4 */


    /**

    * @brief This function is executed in case of error occurrence.

    * @retval None

    */

    void Error_Handler(void)

    {

    /* USER CODE BEGIN Error_Handler_Debug */

    __disable_irq();

    while (1)

    {

    }

    /* USER CODE END Error_Handler_Debug */

    }


    #ifdef USE_FULL_ASSERT

    /**

    * @brief Reports the name of the source file and the source line number

    * where the assert_param error has occurred.

    * @param file: pointer to the source file name

    * @param line: assert_param error line source number

    * @retval None

    */

    void assert_failed(uint8_t *file, uint32_t line)

    {

    /* USER CODE BEGIN 6 */

    /* USER CODE END 6 */

    }

    #endif /* USE_FULL_ASSERT */



    7. Rangkaian [Kembali]

    1. Simulasi Rangkaian



    2. Prototipe



    3. Prinsip Kerja

    Sistem ini dirancang untuk memanfaatkan air sungai sebagai sumber air alternatif ketika saluran irigasi utama mengalami kerusakan akibat galodo atau banjir. Sebelum masuk ke sistem, air sungai terlebih dahulu melewati penyaring berupa kain kasa yang berfungsi menahan sampah, kerikil, lumpur kasar, dan material berukuran besar lainnya agar tidak masuk ke pompa serta mengurangi risiko kerusakan pada komponen sistem. Setelah melalui proses penyaringan awal, air dipompa menuju tangki penampungan menggunakan pompa AC yang dikendalikan oleh AC Dimmer RobotDyn. Pengaturan kecepatan pompa dilakukan berdasarkan kondisi level air dalam tangki sehingga proses pengisian dapat berlangsung lebih efisien.

    Level air pada tangki dipantau menggunakan dua buah float switch yang dipasang pada posisi berbeda. Float switch bagian bawah dipasang pada ketinggian sekitar 20% dari dasar tangki sebagai indikator level minimum, sedangkan float switch bagian atas dipasang pada ketinggian sekitar 90% dari dasar tangki sebagai indikator level maksimum. Ketika level air turun hingga mencapai float switch bawah, STM32 akan mengaktifkan pompa untuk mengisi tangki. Sebaliknya, ketika air telah mencapai float switch atas, pompa akan dimatikan secara otomatis untuk mencegah terjadinya luapan air dan menjaga efisiensi penggunaan energi.

    Setelah tangki berisi air, sensor turbidity yang dipasang di dalam tangki pada ketinggian sekitar 15% dari dasar tangki akan melakukan pengukuran tingkat kekeruhan air secara kontinu. Nilai kekeruhan yang diperoleh dibandingkan dengan batas kekeruhan yang telah ditentukan, yaitu 50 NTU. Apabila nilai kekeruhan melebihi batas yang ditetapkan, sistem akan menganggap air tidak layak untuk didistribusikan. Dalam kondisi tersebut, STM32 akan menutup solenoid valve sehingga aliran air menuju lahan pertanian terhenti, LED merah akan menyala sebagai indikator peringatan, dan buzzer akan aktif untuk memberikan notifikasi kepada pengguna. Sebaliknya, apabila nilai kekeruhan masih berada dalam batas aman, LED hijau akan menyala dan solenoid valve akan terbuka sehingga air dapat dialirkan menuju area irigasi.

    Selama proses distribusi berlangsung, flow sensor yang dipasang pada saluran keluaran tangki akan mengukur debit aliran dan total volume air yang disalurkan ke lahan pertanian. Data yang diperoleh dari flow sensor digunakan untuk memantau efektivitas distribusi air serta mengetahui jumlah air yang telah digunakan. Seluruh informasi sistem, meliputi debit aliran air, status pompa, status solenoid valve, dan kondisi air akan ditampilkan secara real-time pada LCD sebagai media monitoring utama. Dengan mekanisme tersebut, sistem mampu melakukan pengendalian dan distribusi air secara otomatis sekaligus memastikan bahwa hanya air dengan kualitas yang memenuhi syarat yang dialirkan ke lahan pertanian.



    8. Video Penjelasan [Kembali]



    9. Penutup [Kembali]

    A. KESIMPULAN

    Berdasarkan sistem yang telah dirancang, maka dapat diambil beberapa kesimpulan sebagai berikut

    1. Prototipe Smart Irrigation: Sistem Distribusi Air Irigasi Otomatis Pascabencana Berbasis STM32 dirancang untuk memanfaatkan air sungai sebagai sumber air alternatif bagi lahan pertanian ketika saluran irigasi utama mengalami kerusakan.
    2. Sistem mampu memantau tingkat kekeruhan air menggunakan sensor turbidity dan mengendalikan distribusi air secara otomatis melalui solenoid valve berdasarkan kualitas air yang terukur.
    3. Integrasi float switch, flow sensor, pompa, dan LCD memungkinkan proses pengisian tangki, pengukuran debit air, serta monitoring kondisi sistem dilakukan secara otomatis dan real-time.


    B. SARAN

    Berdasarkan hasil perancangan yang telah dilakukan, terdapat beberapa saran yang dapat dipertimbangkan untuk pengembangan sistem di masa mendatang, yaitu:

    1. Menggunakan sensor level air yang dapat mengukur ketinggian air secara kontinu agar pemantauan volume air dalam tangki menjadi lebih akurat.
    2. Menambahkan fitur monitoring dan kontrol jarak jauh berbasis IoT untuk memudahkan pengawasan sistem secara real-time.
    3. Melakukan pengujian langsung pada kondisi lapangan untuk mengevaluasi kinerja sistem terhadap variasi kualitas air sungai pascabencana.


    10. Download File [Kembali]

    Download File Rangkaian (klik disini)
    Download Video Simulasi (klik disini)
    Download Listing Program (klik disini)
    Download Library Turbidity Sensor (klik disini)
    Download Library Float Sensor (klik disini)
    Download Library Flow Sensor (klik disini)
    Download Library AC Dimmer Robodyn (klik disini)
    Download Datasheet STM32F103C8T6 (klik disini)
    Download Datasheet Turbidity Sensor (klik disini)
    Download Datasheet Float Sensor (klik disini)
    Download Datasheet Flow Sensor (klik disini)
    Download Datasheet AC Dimmer Robodyn (klik disini)
    Download Datasheet LED (klik disini)
    Download Datasheet Buzzer (klik disini)
    Download Datasheet LCD I2C (klik disini)
    Download Datasheet Solenoid Valve (klik disini)
    Download Datasheet Adaptor 5V (klik disini)
    Download Datasheet ST Link (klik disini)
    Download Datasheet Pompa DC 5V (klik disini)
    Download Datasheet Resistor (klik disini)
    Download Datasheet Motor Servo (klik disini)
    Download Datasheet Relay (klik disini)



     

     

     

    MODUL 4 PROJECT

    [KEMBALI KE MENU SEBELUMNYA] DAFTAR ISI 1. Pendahuluan 2. Tujuan 3. Alat dan Komponen 4. Landasan Teori 5. Flowchart 6. L...