Praktikum Monitoring Level Air: ESP32 + HC-SR04 dengan Filtering
Ukur level air menggunakan ESP32 dan HC-SR04, lengkap dengan pembagi tegangan ECHO, kalibrasi tangki, filtering, dan telemetry.
Artikel ini disusun sebagai panduan teknis Ruang IoT. Gunakan daftar isi untuk berpindah antarbagian dan ikuti langkah secara berurutan ketika artikel memuat praktik atau konfigurasi.
Sensor ultrasonik dapat digunakan untuk mengukur jarak permukaan air dari bagian atas tangki. Dengan mengetahui tinggi efektif tangki, jarak tersebut dapat dikonversi menjadi persentase level. Praktikum ini menggunakan ESP32 dan HC-SR04 sebagai contoh, lalu menambahkan filtering sederhana agar tampilan level tidak berubah liar akibat satu pembacaan yang buruk.
Catatan kelistrikan sebelum merakit
ESP32 bekerja pada domain I/O sekitar 3.3 V, sedangkan banyak modul HC-SR04 menggunakan suplai 5 V dan pin ECHO dapat menghasilkan level yang lebih tinggi dari GPIO ESP32. Gunakan pembagi tegangan atau level shifter yang sesuai pada jalur ECHO. Periksa datasheet board/sensor yang Anda gunakan; jangan mengandalkan asumsi bahwa semua breakout identik.
Perangkat dan geometri tangki
| Parameter | Contoh |
|---|---|
| TRIG | GPIO 5 |
| ECHO melalui pembagi tegangan | GPIO 18 |
| Jarak sensor ke dasar tangki | 80 cm |
| Jarak minimum permukaan saat “penuh” | 10 cm |
Dengan contoh di atas, rentang efektif air adalah 70 cm. Nilai harus dikalibrasi pada tangki sebenarnya karena posisi sensor, dead zone, dan bentuk tangki memengaruhi hasil.
Program pengukuran jarak
const int TRIG_PIN = 5;
const int ECHO_PIN = 18;
const float EMPTY_DISTANCE_CM = 80.0;
const float FULL_DISTANCE_CM = 10.0;
float readDistanceCm() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsigned long duration = pulseIn(ECHO_PIN, HIGH, 30000);
if (duration == 0) return NAN;
return duration * 0.0343f / 2.0f;
}
float levelPercent(float distance) {
float pct = (EMPTY_DISTANCE_CM - distance) * 100.0f /
(EMPTY_DISTANCE_CM - FULL_DISTANCE_CM);
return constrain(pct, 0.0f, 100.0f);
}
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
float sum = 0;
int valid = 0;
for (int i = 0; i < 5; i++) {
float d = readDistanceCm();
if (!isnan(d) && d > 2 && d < 400) {
sum += d;
valid++;
}
delay(80);
}
if (valid == 0) {
Serial.println("Tidak ada pembacaan valid");
} else {
float distance = sum / valid;
Serial.printf("distance=%.1f cm level=%.1f%%\n",
distance, levelPercent(distance));
}
delay(1000);
}Validasi hasil
Bandingkan hasil dengan pengukuran manual pada minimal tiga titik: hampir kosong, setengah, dan hampir penuh. Jangan hanya menguji satu posisi. Jika data loncat, periksa permukaan air yang bergelombang, sudut pemasangan sensor, pantulan dinding, kabel, dan suplai.
Integrasi telemetry dan alarm
Kirim distance_cm, level_percent, dan sensor_valid. Alarm level rendah atau tinggi sebaiknya menggunakan histeresis agar status tidak berganti-ganti pada satu titik. Untuk tangki tertutup atau lingkungan lembap, gunakan sensor yang memang sesuai lingkungan fisik tersebut.
Kriteria keberhasilan
Sistem dianggap berhasil jika pembacaan stabil pada tiga titik uji, error pembacaan ditandai sebagai invalid alih-alih dikonversi menjadi level palsu, dan persentase tetap dibatasi 0–100%.
Referensi resmi dan bacaan lanjut
Gunakan dokumentasi resmi berikut untuk memeriksa API, kompatibilitas board, dan perubahan versi library:
Sudah memahami alurnya?
Praktikkan konsep yang baru dipelajari melalui project, perangkat ESP32, telemetry, dashboard, atau Virtual Lab di Ruang IoT.