Ruang IoT · IoT

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.

Penulis
Ruang IoT Admin
Dipublikasikan
12 Agustus 2026
Waktu baca
3 menit

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.

Mulai membaca
Ilustrasi tutorial: Praktikum Monitoring Level Air: ESP32 + HC-SR04 dengan Filtering
Ilustrasi praktikum Ruang IoT.

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

ParameterContoh
TRIGGPIO 5
ECHO melalui pembagi teganganGPIO 18
Jarak sensor ke dasar tangki80 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:

TUTORIAL SELESAI

Sudah memahami alurnya?

Praktikkan konsep yang baru dipelajari melalui project, perangkat ESP32, telemetry, dashboard, atau Virtual Lab di Ruang IoT.

Buka Ruang IoT