Smart Irrigation: Sistem Distribusi Air Irigasi Otomatis Pascabencana Berbasis STM32
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.
- Memanfaatkan air sungai pascabencana sebagai sumber air alternatif untuk irigasi.
- Melakukan penyaringan dan pemantauan kualitas air sebelum didistribusikan ke sawah.
- Mengotomatisasi pengisian tangki berdasarkan level air menggunakan float switch.
- Mengendalikan distribusi air secara otomatis berdasarkan tingkat kekeruhan air.
- Menampilkan informasi kondisi sistem secara real-time sebagai media monitoring.
3. Alat dan Komponen [Kembali]
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.
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)
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.
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 |
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
|
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 |
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
- 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:
Terdapat dua jenis utama solenoid valve berdasarkan kondisi default-nya:
Normally Closed (NC): jalur tertutup saat tidak dialiri listrik, dan terbuka saat koil aktif.
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.
- 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
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
|
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 |
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 |
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
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
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
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.
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
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.
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: 70∘C).
· Fleksibilitas: Rendah (untuk solid) hingga sedang (untuk stranded).
· Standar: Memenuhi standar keamanan listrik nasional/internasional.
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.
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)
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
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 */
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.
A. KESIMPULAN
Berdasarkan sistem yang telah dirancang, maka dapat diambil beberapa kesimpulan sebagai berikut
- 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.
- Sistem mampu memantau tingkat kekeruhan air menggunakan sensor turbidity dan mengendalikan distribusi air secara otomatis melalui solenoid valve berdasarkan kualitas air yang terukur.
- 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:
- Menggunakan sensor level air yang dapat mengukur ketinggian air secara kontinu agar pemantauan volume air dalam tangki menjadi lebih akurat.
- Menambahkan fitur monitoring dan kontrol jarak jauh berbasis IoT untuk memudahkan pengawasan sistem secara real-time.
- Melakukan pengujian langsung pada kondisi lapangan untuk mengevaluasi kinerja sistem terhadap variasi kualitas air sungai pascabencana.



















Tidak ada komentar:
Posting Komentar