
Halo, Sobat Maker! Pernah nggak sih kalian ngerasa repot banget harus nyiram tanaman tiap pagi dan sore? Atau lebih parahnya lagi, tanaman kesayangan tiba-tiba layu karena kita lupa nyiram pas cuaca lagi panas-panasnya?
Nah, sebenarnya kita bisa bikin solusi yang jauh lebih keren daripada sekadar pasang pompa otomatis biasa yang cuma “nyala-mati”. Kita bisa bangun sistem irigasi tetes pintar berbasis Arduino yang punya “otak”. Dengan bantuan logika PID, sistem ini bisa mikir seberapa banyak air yang benar-benar dibutuhkan tanaman supaya kelembapan tanahnya tetap stabil di angka ideal. Penasaran gimana cara buatnya? Yuk, kita bedah bareng-bareng!
Alat dan Bahan
Untuk memulai proyek ini, Teman-teman perlu nyiapin beberapa komponen utama. Tenang, komponennya gampang dicari di toko online atau toko elektronik terdekat. Berikut adalah daftar alat yang kita butuhin berdasarkan spesifikasi sistem:
| Komponen | Jumlah | Keterangan |
| Arduino Uno | 1 | Otak utama pengendali sistem |
| Sensor Kelembapan Tanah | 1 | Sensor tipe resistif untuk baca kadar air tanah |
| Modul Driver L298N | 1 | Pengatur daya dan kecepatan pompa air DC |
| Pompa Air DC | 1 | Aktuator untuk menyalurkan air ke tanaman |
| Selang Irigasi | 1 | Media penyaluran air sistem tetes |
| Adaptor 12V | 1 | Sumber daya utama untuk sistem dan pompa |
Skematik Rangkaian

Cara ngerakitnya cukup simpel, tapi Sobat Maker harus teliti ya. Pertama, hubungkan Sensor Kelembapan Tanah ke pin A0 di Arduino untuk membaca data analog. Selanjutnya, kita pakai Driver Motor L298N buat jembatan antara Arduino dan pompa. Kenapa harus pakai driver? Karena pin Arduino nggak bakalan kuat kalau harus langsung menggerakkan pompa air; driver L298N ini berfungsi sebagai pelindung biar Arduino kamu nggak kebakar.
Hubungkan pin input driver L298N ke pin digital 11, 12, dan 13 di Arduino. Pin 11 ini spesial karena kita bakal pakai buat sinyal PWM (pengatur kecepatan pompa).
Jangan lupa buat menghubungkan semua “Ground” jadi satu (Common Ground). Artinya, kabel negatif (-) dari adaptor 12V harus tersambung ke pin GND di Arduino dan juga GND di driver L298N. Kalau nggak nyambung, sinyal kontrolnya nggak bakal jalan dan pompanya nggak bakal muter!
Rahasia Data Stabil Filter SMA & EMA

Salah satu masalah utama kalau pakai sensor kelembapan tanah adalah datanya sering “berisik” atau banyak noise. Kalau datanya lompat-lompat nggak jelas, pompa kalian bakal ikutan nyala-mati kayak lampu disko.
Buat ngatasin ini, kita pakai jurus filter digital gabungan yang bikin grafik data kamu jadi super mulus:
- Simple Moving Average (SMA): Kita ambil 20 sampel data terakhir terus dirata-ratain buat ngilangin lonjakan data yang tiba-tiba muncul.
- Exponential Moving Average (EMA): Kita kasih bobot (alpha 0.05) buat data paling baru supaya responnya tetap cepat tapi halus.
Teknik filter digital kayak gini juga sering banget dipakai di berbagai proyek kontrol presisi lainnya, lho, seperti pada [https://raftechpcb.com/fermentasi-tempe-arduino-pid/]. Dengan data yang bersih, algoritma PID kita bisa kerja dengan jauh lebih akurat. Biar makin mantap, jangan lupa buka Serial Plotter di Arduino IDE buat ngelihat grafik kelembapan yang “smooth” hasil dari filter ini.
Mengenal Otak Sistem Logika PID dan Histeresis
Sistem ini cerdas karena pakai logika PID (Proportional, Integral, Derivative) buat nentuin “seberapa kencang” pompa harus berputar:
- P (Proportional): Memberi tenaga pompa sesuai dengan seberapa jauh jarak kelembapan sekarang dengan target (error). Makin kering, makin kencang.
- I (Integral): Tugasnya ngabisin sisa error yang bandel supaya target bener-bener tercapai tepat di angka 60%.
- D (Derivative): Berperan sebagai “rem” supaya sistem nggak overshoot atau kelewat batas pas lagi ngejar target.
Ada fitur penting namanya Anti-Windup. Ini ibarat tombol reset buat memori sistem. Kalau target sudah tercapai, kita “bersihin” ingatan si Arduino soal error yang numpuk, biar dia nggak “baper” dan terus-terusan nyiram padahal tanah sudah basah.
Selain itu, kita nerapin Zona Histeresis (Deadband) di rentang 40% – 60%. Pompa baru akan mulai beraksi kalau kelembapan turun di bawah 40%, dan bakal mati total kalau sudah menyentuh 60%. Ini penting banget biar pompa nggak gampang aus karena keseringan nyala-mati cuma gara-gara fluktuasi kecil (chattering).
Pemrograman (Coding)
Ini dia isi “otak” dari sistem kita. Program ini diatur untuk melakukan sampling setiap 8 detik dan membatasi durasi nyala pompa maksimal cuma 1 detik supaya air punya waktu buat meresap. Perhatikan bagian map(outputPID, 0, setpoint * Kp, 50, 128) yang membatasi tenaga pompa agar tetap aman dan nggak banjir.
// --- PIN DEFINITIONS
const int pinSensor = A0;
const int pinENA = 11;
const int pinIN1 = 12;
const int pinIN2 = 13;
// --- KONFIGURASI PID
const float setpoint = 60.0;
const float histeresis = 20.0;
float Kp = 0.5;
float Ki = 0.008;
float Kd = 0.8;
float errorSaatIni = 0;
float errorSebelumnya = 0;
float integralError = 0;
float derivativeError = 0;
const int pwmMinimal = 50;
const int pwmMaksimal = 128;
// --- FILTER PARAMETERS
const int NUM_READINGS = 20;
const float ALPHA = 0.05;
int rawReadings[NUM_READINGS];
int readIndex = 0;
double filteredRaw = 0;
// --- VARIABEL TIME SAMPLING
unsigned long waktuSebelumnya = 0;
const unsigned long intervalSampling = 8000;
unsigned long waktuPompaMenyala = 0;
bool pompaSedangAktif = false;
float kelembapanAktual = 0;
int nilaiPWM = 0;
void setup() {
pinMode(pinENA, OUTPUT);
pinMode(pinIN1, OUTPUT);
pinMode(pinIN2, OUTPUT);
digitalWrite(pinIN1, HIGH);
digitalWrite(pinIN2, LOW);
analogWrite(pinENA, 0);
Serial.begin(9600);
for (int i = 0; i < NUM_READINGS; i++) {
rawReadings[i] = analogRead(pinSensor);
}
filteredRaw = analogRead(pinSensor);
Serial.println("Kelembapan_Aktual, Setpoint, PWM_Pompa");
delay(1000);
}
double readSensorFiltered() {
int newReading = analogRead(pinSensor);
rawReadings[readIndex] = newReading;
readIndex++;
if (readIndex >= NUM_READINGS) readIndex = 0;
long sum = 0;
for (int i = 0; i < NUM_READINGS; i++) sum += rawReadings[i];
double averageRaw = (double)sum / NUM_READINGS;
filteredRaw = (ALPHA * averageRaw) + ((1.0 - ALPHA) * filteredRaw);
double moisturePercent = (1023.0 - filteredRaw) * 100.0/1023.0;
return constrain(moisturePercent, 0, 100);
}
void loop() {
unsigned long waktuSaatIni = millis();
kelembapanAktual = readSensorFiltered();
if (waktuSaatIni - waktuSebelumnya >= intervalSampling) {
waktuSebelumnya = waktuSaatIni;
if (kelembapanAktual >= setpoint) {
nilaiPWM = 0;
analogWrite(pinENA, 0);
integralError = 0;
errorSebelumnya = 0;
pompaSedangAktif = false;
} else if (kelembapanAktual <= (setpoint - histeresis)) {
errorSaatIni = setpoint - kelembapanAktual;
float P = Kp * errorSaatIni;
integralError += errorSaatIni;
integralError = constrain(integralError, -100, 100);
float I = Ki * integralError;
derivativeError = errorSaatIni - errorSebelumnya;
float D = Kd * derivativeError;
float outputPID = P + I + D;
nilaiPWM = map(outputPID, 0, setpoint * Kp, pwmMinimal, pwmMaksimal);
nilaiPWM = constrain(nilaiPWM, pwmMinimal, pwmMaksimal);
analogWrite(pinENA, nilaiPWM);
pompaSedangAktif = true;
waktuPompaMenyala = waktuSaatIni;
errorSebelumnya = errorSaatIni;
} else {
nilaiPWM = 0;
analogWrite(pinENA, 0);
integralError = 0;
errorSebelumnya = 0;
pompaSedangAktif = false;
}
}
if (pompaSedangAktif && (waktuSaatIni - waktuPompaMenyala >= 1000)) {
analogWrite(pinENA, 0);
nilaiPWM = 0;
pompaSedangAktif = false;
}
Serial.print(kelembapanAktual, 2);
Serial.print(",");
Serial.print(setpoint, 2);
Serial.print(",");
Serial.println(nilaiPWM);
delay(100);
}
Cara Kerja & Hasil Pengujian

Sistem ini bekerja dalam siklus 8 detik. Kenapa nggak nyala terus-terusan? Supaya air punya waktu buat meresap ke tanah sebelum sensor membaca datanya lagi. Berdasarkan hasil pengujian yang bisa kamu pantau di Serial Plotter, sistem ini terbukti cerdas banget:
- Saat Kelembapan 0%: Meski error-nya maksimal, pompa nggak bakalan “ngoyo” atau nyala terus. Dia cuma nyala 1 detik, lalu mati 7 detik buat nunggu air meresap (fase jeda). Ini kunci biar nggak terjadi banjir di pot!
- Saat Kelembapan 59% (Zona Deadband): Di Serial Plotter, kamu bakal lihat garis biru (kelembapan) ada sedikit di bawah garis oranye (setpoint), tapi garis hijau (PWM) tetap di angka nol. Inilah bukti zona histeresis bekerja menjaga pompa biar nggak gampang rusak.
- Saat Target 60% Tercapai: Sistem melakukan Hard Stop. Pompa mati total dan memori integral di-reset ke nol.
Strategi pembatasan nyala pompa selama 1 detik dan penggunaan filter digital SMA/EMA adalah kunci sukses biar tanaman kamu nggak kelebihan air (overshoot).
Kesimpulan
Proyek irigasi tetes otomatis ini sukses menjaga kelembapan tanah di angka 60% dengan sangat stabil dan presisi. Berkat gabungan filter digital dan logika PID, sistem jadi jauh lebih canggih dibandingkan alat penyiram otomatis biasa yang dijual di pasaran.
Teknologi smart farming sederhana ini bisa banget Sobat Maker terapin di rumah atau kebun sendiri buat ningkatin efisiensi air dan mastiin tanaman tumbuh maksimal tanpa perlu repot nyiram manual lagi. Yuk, siapkan Arduino-mu dan mulai bereksperimen!
