Pada tutorial ini, kita akan membuat Smart Water Tank — sistem yang otomatis menyalakan dan mematikan pompa air berdasarkan ketinggian air di dalam tandon, tanpa perlu dipantau manual. Proyek ini memakai Arduino UNO, sensor jarak HC-SR04, dan modul Relay, semuanya disimulasikan di Wokwi.
| Bagian | Komponen | Fungsi |
|---|---|---|
| Board | Arduino UNO | Pusat kendali sistem |
| Sensor | HC-SR04 | Mengukur jarak dari sensor ke permukaan air |
| Kontrol | Relay | Menyalakan/mematikan pompa (disimulasikan dengan LED) |
| Batas | 80 / 20 cm | Ambang batas kosong dan penuh |
Sistem membaca jarak permukaan air dari sensor yang dipasang di bagian atas tandon. Saat jarak terbaca besar, artinya permukaan air rendah dan pompa perlu menyala. Saat jarak terbaca kecil, artinya air sudah naik mendekati sensor dan pompa perlu dimatikan.
LED pada simulasi dipakai sebagai indikator pompa. Pada alat nyata, beban pompa tidak boleh langsung dipasang ke pin Arduino — harus lewat relay/contactor yang sesuai.
Proyek ini dibuat untuk mensimulasikan pengisian tandon air otomatis. Masalah yang ingin diselesaikan cukup nyata: pompa sering lupa dimatikan saat tandon penuh, atau lupa dinyalakan ketika air hampir habis. Dengan Arduino, sensor jarak, dan relay, sistem dapat mengambil keputusan sederhana berdasarkan tinggi permukaan air.
Sensor HC-SR04 diletakkan secara konsep di bagian atas tandon. Sensor tidak membaca kedalaman air secara langsung, melainkan membaca jarak antara sensor dan permukaan air. Semakin jauh jaraknya, semakin rendah permukaan air. Semakin dekat jaraknya, semakin penuh tandon.
Yang penting dari proyek ini bukan hanya relay menyala atau mati, tetapi cara sistem menjaga pompa agar tidak terlalu sering hidup-mati. Karena itu dipakai konsep hysteresis, yaitu dua batas berbeda: batas kosong untuk menyalakan pompa dan batas penuh untuk mematikan pompa.
pompaMenyala, supaya pompa mempertahankan kondisi terakhir saat level air berada di tengah.Rangkaian ini tidak memerlukan library tambahan, karena program hanya memakai fungsi bawaan Arduino seperti digitalWrite, pulseIn, Serial, dan delay.
| Komponen | Fungsi |
|---|---|
| Arduino UNO | Pusat kendali. Mengirim pulsa ke sensor, membaca pantulan lewat pin ECHO, menghitung jarak, lalu memberi sinyal ke relay. |
| HC-SR04 | Sensor ultrasonik dengan pin VCC, GND, TRIG, dan ECHO. Dipakai sebagai pembaca jarak permukaan air. |
| Relay Module | Bertindak sebagai saklar elektronik. Di simulasi, relay menghubungkan arus ke LED; pada dunia nyata, relay/contactor mengendalikan beban pompa dengan pengaman yang sesuai. |
| LED + Resistor | LED jadi indikator bahwa pompa sedang menyala. Resistor 220 Ohm membatasi arus LED agar tidak berlebihan. |
Sensor ultrasonik HC-SR04 bukan sensor yang tahan air (bukan sensor waterproof), jadi tidak bisa dicelupkan langsung ke dalam air. Karena itu, sensor diletakkan di bagian atas tandon, menghadap ke bawah, lalu mengukur jarak dari sensor ke permukaan air — bukan mengukur kedalaman air secara langsung. Dengan cara ini, sensor tetap kering dan aman, tapi tetap bisa “tahu” seberapa tinggi air di dalam tandon lewat perhitungan jarak.
| Komponen | Tersambung ke |
|---|---|
| HC-SR04 VCC | 5V (lewat breadboard) |
| HC-SR04 GND | GND (lewat breadboard) |
| HC-SR04 TRIG | Pin digital 3 |
| HC-SR04 ECHO | Pin digital 2 |
| Relay VCC | 5V (lewat breadboard) |
| Relay GND | GND (lewat breadboard) |
| Relay IN | Pin digital 8 |
Jalur LED indikator: COM relay mendapat jalur positif, NO relay menuju anoda LED, katoda LED menuju resistor, lalu ke GND.
Breadboard dipakai untuk membagi jalur 5V dan GND, agar sensor dan relay sama-sama mendapatkan catu daya yang stabil.
Sensor HC-SR04 berada di sisi kiri bawah gambar rangkaian, sedangkan relay dan LED berada di sisi kanan. Pada penerapan nyata, posisi fisik tentu menyesuaikan bentuk tandon dan box panel yang dipakai. Kabel yang terlihat panjang di Wokwi hanya kebutuhan visual simulasi saja — pada alat nyata, kabel harus dirapikan, diberi isolasi yang baik, dan dijauhkan dari cipratan air.
Arduino memulai pembacaan dengan memberi pulsa singkat ke pin TRIG. Sensor memancarkan gelombang ultrasonik, lalu pin ECHO menerima pantulan dari permukaan air. Waktu pantulan ini dihitung menjadi jarak dalam satuan sentimeter.
Rumus pada program memakai duration * 0.034 / 2. Angka 0.034 adalah pendekatan kecepatan suara dalam cm per mikrodetik. Pembagian dengan 2 dilakukan karena gelombang menempuh perjalanan pergi dan pulang.
Setelah jarak didapat, Arduino membandingkan nilai tersebut dengan dua batas:
Grafik ambang batas: 0 cm (Pompa OFF) — 20 cm (batasPenuh) — 50 cm (zona memori status) — 80 cm (batasKosong) — 100 cm (Pompa ON).
Air rendah → jarak besar → relay ON. Air penuh → jarak kecil → relay OFF.
Tanpa hysteresis, sistem biasanya hanya memakai satu batas. Misalnya, pompa menyala saat jarak di atas 50 cm dan mati saat di bawah 50 cm. Masalahnya, permukaan air bisa bergoyang, sensor bisa membaca naik-turun sedikit, dan relay dapat cepat sekali hidup-mati berulang kali di sekitar angka batas itu — ini buruk untuk umur pompa dan relay, karena komponen listrik yang sering dinyalakan-dimatikan cepat akan lebih cepat rusak.
Hysteresis memakai dua batas agar keputusan lebih stabil. Pada program ini, pompa hanya dinyalakan saat jarak air mencapai 80 cm atau lebih. Setelah menyala, pompa tidak langsung mati ketika air sudah turun ke 79 cm, 60 cm, atau 50 cm. Pompa tetap mengikuti status terakhir sampai air benar-benar mencapai batas penuh 20 cm atau kurang.
Dengan cara ini, pompa bekerja dalam siklus yang lebih masuk akal: menyala saat tandon benar-benar rendah, terus mengisi saat air berada di zona tengah, lalu mati setelah tandon mendekati penuh.
| Kondisi | Penjelasan |
|---|---|
| Saat jarak ≥ 80 cm | Permukaan air jauh dari sensor. Sistem menganggap tandon hampir kosong. Relay aktif dan indikator pompa menyala. |
| Saat jarak ≤ 20 cm | Permukaan air dekat dengan sensor. Sistem menganggap tandon sudah penuh. Relay mati dan indikator pompa padam. |
| Zona 20–80 cm | Bukan area keputusan baru, melainkan area mempertahankan status terakhir. Kalau sebelumnya pompa sudah menyala, ia tetap menyala. Kalau sebelumnya mati, tetap mati. |
Buka file sketch.ino di Wokwi, lalu salin kode berikut:
// Menyiapkan colokan komponen
int trigPin = 3;
int echoPin = 2;
int pinRelay = 8;
// Memori untuk menyimpan status pompa
bool pompaMenyala = false;
// Pengaturan Ukuran Toren Air (dalam centimeter)
// Semakin kosong airnya, semakin jauh jaraknya dari sensor di atap toren
int batasKosong = 80; // Jika jarak air >= 80 cm, pompa harus nyala
int batasPenuh = 20; // Jika jarak air <= 20 cm, pompa harus mati
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(pinRelay, OUTPUT);
digitalWrite(pinRelay, LOW); // Pastikan pompa mati di awal
Serial.println("=== SISTEM TOREN AIR OTOMATIS ===");
Serial.println("Memantau kedalaman air...");
}
void loop() {
// 1. Membaca Jarak Permukaan Air
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
int jarakAir = duration * 0.034 / 2;
// Tampilkan kondisi air saat ini
Serial.print("Jarak sensor ke permukaan air: ");
Serial.print(jarakAir);
Serial.println(" cm");
// 2. Logika Hysteresis (Pengendali Pompa)
if (jarakAir >= batasKosong) {
// JIKA TOREN KOSONG (Permukaan air jauh di bawah)
if (pompaMenyala == false) {
digitalWrite(pinRelay, HIGH); // Relay menyalakan pompa
pompaMenyala = true;
Serial.println("-> TOREN HAMPIR KOSONG! Pompa Air MENYALA [*CEKLEK*]");
}
} else if (jarakAir <= batasPenuh) {
// JIKA TOREN PENUH (Permukaan air sudah naik mendekati sensor)
if (pompaMenyala == true) {
digitalWrite(pinRelay, LOW); // Relay mematikan pompa
pompaMenyala = false;
Serial.println("-> TOREN SUDAH PENUH! Pompa Air MATI.");
}
}
// Jika jarak air berada di tengah-tengah (misal 50 cm),
// pompa akan mempertahankan status terakhirnya
// (kalau lagi ngisi ya lanjut ngisi, kalau lagi mati ya biarin mati).
Serial.println("----------------------------------");
delay(1500); // Jeda 1,5 detik sebelum mengecek lagi
}
Klik masing-masing bagian di bawah ini untuk memahami fungsinya satu per satu:
int trigPin = 3; dan int echoPin = 2; — menyimpan nomor pin TRIG dan ECHO sensor.int pinRelay = 8; — menyimpan nomor pin kontrol relay.bool pompaMenyala = false; — variabel bertipe boolean (hanya bisa true atau false) yang menyimpan status pompa saat ini. Nilai awalnya false (mati). Variabel inilah “ingatan” sistem, yang membuat pompa bisa mempertahankan statusnya di zona tengah (20–80 cm).int batasKosong = 80; — jarak minimal supaya pompa dianggap perlu dinyalakan.int batasPenuh = 20; — jarak maksimal supaya pompa dianggap perlu dimatikan.Catatan: angka 80 dan 20 ini tidak wajib sama pada alat nyata — nilainya harus disesuaikan dengan tinggi tandon, posisi sensor, dan titik aman yang diinginkan.
Serial.begin(9600); — mengaktifkan komunikasi Serial Monitor.pinMode(trigPin, OUTPUT); dan pinMode(echoPin, INPUT); — mengatur pin TRIG sebagai output (pengirim sinyal) dan ECHO sebagai input (penerima pantulan).pinMode(pinRelay, OUTPUT); — mengatur pin relay sebagai output.digitalWrite(pinRelay, LOW); — memastikan relay (dan pompa) dalam kondisi mati di awal program, sebelum ada pembacaan sensor sama sekali.Serial.println(...) dua baris — menampilkan pesan pembuka ke Serial Monitor.digitalWrite(trigPin, LOW); delayMicroseconds(2); — memastikan TRIG mati sesaat sebagai ancang-ancang.digitalWrite(trigPin, HIGH); delayMicroseconds(10); — menyalakan TRIG selama 10 mikrodetik untuk memancarkan gelombang ultrasonik.digitalWrite(trigPin, LOW); — mematikan TRIG lagi.long duration = pulseIn(echoPin, HIGH); — mengukur berapa lama pin ECHO menerima sinyal HIGH, yaitu waktu tempuh gelombang pergi-pulang.int jarakAir = duration * 0.034 / 2; — mengubah waktu tempuh menjadi jarak dalam sentimeter, dengan rumus yang sudah dijelaskan di Langkah 3.Serial.print(...) beberapa baris — menampilkan jarak yang baru dibaca ke Serial Monitor.if (jarakAir >= batasKosong) { ... } — mengecek apakah jarak sudah mencapai atau melebihi 80 cm (tandon hampir kosong).if (pompaMenyala == false) { ... } — di dalam blok tadi, ada pengecekan tambahan: apakah pompa sedang mati? Ini penting supaya pesan “Pompa MENYALA” dan perintah digitalWrite tidak diulang-ulang terus-menerus setiap 1,5 detik selama kondisi kosong bertahan — cukup dijalankan sekali saja tepat saat status berubah dari mati menjadi menyala.digitalWrite(pinRelay, HIGH); pompaMenyala = true; — menyalakan relay, dan memperbarui “ingatan” status pompa menjadi menyala.} else if (jarakAir <= batasPenuh) { ... } — else if berarti "kalau kondisi pertama tadi salah, coba cek kondisi ini". Blok ini mengecek apakah jarak sudah mencapai 20 cm atau kurang (tandon penuh), dengan logika yang mirip: hanya mematikan relay dan mengubah pompaMenyala menjadi false jika sebelumnya statusnya memang sedang menyala.else terakhir untuk kondisi "di antara 20 dan 80 cm" — dan memang sengaja tidak ada. Itulah yang membuat status pompa tidak berubah sama sekali saat berada di zona tengah; program hanya "diam" dan mempertahankan nilai pompaMenyala serta kondisi relay yang sudah ada sebelumnya.delay(1500); — jeda 1,5 detik sebelum membaca jarak lagi.Pengujian di Wokwi sebaiknya dilakukan bertahap. Jangan langsung menganggap rangkaian salah bila LED belum berubah, karena sistem hysteresis memang sengaja mempertahankan status di zona tengah.
| Kondisi Jarak | Hasil |
|---|---|
| ≥ 80 cm | Muncul pesan tandon hampir kosong, relay aktif, LED menyala. |
| 20–80 cm | Status mengikuti keadaan sebelumnya (tidak berubah). |
| ≤ 20 cm | Muncul pesan tandon penuh, relay mati, LED padam. |
🔒 Simulasi ini dikunci. Minta passcode ke gurumu untuk membuka.