//Created by Irham Azhari Aulia
// 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
}