SISTEM PEMANTAUAN KETINGGIAN AIR MENGGUNAKAN RASPBERRY PICO

 SISTEM PEMANTAUAN KETINGGIAN AIR MENGGUNAKAN RASPBERRY PICO

Amin Bagus Hari Saputro1 Firza Fadhil Baihaqi2 Muhammad Rafi Athallah3 Rofiqul Ula Azmi4

Prodi D4 Teknologi Rekayasa Elektronika, Jurusan Teknik Elektro, Politeknik Negeri Semarang

Email : amin.43423303@mhs.polines.ac.id1, firza.43423309@mhs.polines.ac.id2, rafi.43423315@mhs.polines.ac.id3, rofiq.43423321@mhs.polines.ac.id4


Abstrak

Ketinggian air pada tandon atau tangki penampung umumnya masih dipantau secara manual, sehingga keterlambatan mendeteksi kondisi kosong atau meluap kerap terjadi. Penelitian ini merancang sistem pemantauan ketinggian air menggunakan Raspberry Pi Pico yang terhubung dengan sensor ultrasonik HC-SR04 untuk mengukur jarak permukaan air, layar OLED SH1106 untuk menampilkan animasi gelombang dan persentase level air, serta LED dan buzzer sebagai indikator kondisi aman, waspada, dan bahaya. Sistem membaca jarak dari sensor HC-SR04, mengonversinya menjadi persentase level air berdasarkan jarak wadah kosong dan penuh, kemudian menentukan status berdasarkan tiga ambang batas: di bawah 40% (bahaya), 40% sampai 69% (waspada), dan 70% ke atas (aman). Kontrol buzzer dirancang secara non-blocking menggunakan pencatatan waktu (ticks_ms()) sehingga tampilan OLED tetap dapat diperbarui saat buzzer berbunyi. Pengujian menunjukkan sistem dapat membaca jarak permukaan air dan menampilkan status secara real-time sesuai ambang batas yang ditentukan. Sistem ini dapat diterapkan pada tandon rumah tangga sebagai alternatif pemantauan otomatis berbiaya rendah.

Kata kunci: Raspberry Pi Pico, HC-SR04, OLED SH1106, MicroPython

I. Pendahuluan

1.1 Latar belakang

Air bersih merupakan kebutuhan dasar yang penggunaannya hampir selalu bergantung pada wadah penampung, seperti tandon, tangki, atau bak air. Pemantauan ketinggian air pada wadah tersebut umumnya masih dilakukan secara manual, yaitu dengan melihat langsung kondisi tangki. Cara ini memiliki dua kelemahan utama: keterlambatan mendeteksi tangki yang hampir kosong sehingga suplai air terhenti tanpa peringatan, dan risiko tangki meluap karena pengguna lupa memantau secara berkala.

Raspberry Pi Pico, sebagai mikrokontroler berbiaya rendah berbasis chip RP2040, dapat dipasangkan dengan sensor ultrasonik untuk mengukur jarak permukaan air tanpa kontak langsung. Data hasil pengukuran kemudian ditampilkan pada layar OLED, sementara LED dan buzzer memberikan peringatan otomatis ketika ketinggian air mendekati batas kritis.

Berdasarkan uraian tersebut, kelompok kami merancang Sistem Pemantauan Ketinggian Air berbasis Raspberry Pi Pico yang mengukur, menampilkan, dan memberi peringatan kondisi air secara otomatis.

1.2 Rumusan masalah

  1. Bagaimana merancang sistem yang dapat mengukur ketinggian air dalam tangki secara real-time menggunakan sensor ultrasonik HC-SR04?
  2. Bagaimana menampilkan data ketinggian air secara informatif dan mudah dipahami melalui layar OLED?
  3. Bagaimana sistem dapat memberikan indikasi kondisi aman, waspada, dan bahaya secara otomatis kepada pengguna?

1.3 Tujuan

  1. Merancang dan membangun sistem pemantauan ketinggian air berbasis Raspberry Pi Pico dengan sensor ultrasonik HC-SR04.
  2. Menampilkan data ketinggian air secara real-time dalam bentuk animasi gelombang dan persentase level pada layar OLED SH1106.
  3. Mengimplementasikan indikator kondisi air (aman, waspada, bahaya) menggunakan LED dan buzzer sebagai peringatan otomatis.

II. Metodologi

Perancangan sistem dilakukan melalui lima tahap. Tahap pertama adalah studi literatur, yaitu mempelajari prinsip kerja sensor ultrasonik, protokol komunikasi I2C untuk OLED, dan pemrograman MicroPython pada Raspberry Pi Pico. Tahap kedua adalah perancangan perangkat keras, meliputi penentuan konfigurasi pin dan perangkaian komponen (sensor HC-SR04, OLED SH1106, tiga LED indikator, dan buzzer aktif) ke Raspberry Pi Pico. Tahap ketiga adalah perancangan perangkat lunak, yaitu penyusunan algoritma pembacaan sensor, perhitungan persentase level air, penentuan status, kontrol LED dan buzzer, serta visualisasi animasi gelombang pada OLED menggunakan fungsi sinus. Tahap keempat adalah pengujian dan kalibrasi, yaitu menguji akurasi pembacaan jarak serta menyesuaikan nilai JARAK_KOSONG dan JARAK_PENUH terhadap dimensi wadah air yang digunakan. Tahap terakhir adalah analisis hasil, yaitu mengevaluasi kesesuaian antara kondisi air sebenarnya dengan status yang ditampilkan sistem.

III. Tinjauan pustaka

3.1 Raspberry Pi Pico

Gambar 1. Raspberry Pico

Raspberry Pi Pico adalah papan mikrokontroler berbasis chip RP2040 rancangan Raspberry Pi, dengan prosesor dual-core Arm Cortex-M0+ dan sejumlah antarmuka I/O termasuk I2C, SPI, dan Programmable I/O (PIO) [1]. Papan ini mendukung pemrograman menggunakan MicroPython maupun C/C++, sehingga digunakan pada sistem ini sebagai unit pemrosesan utama untuk pembacaan sensor dan kontrol aktuator.

3.2 Sensor ultrasonik HC-SR04


Gambar 2. HCSR-04

HC-SR04 adalah modul sensor jarak ultrasonik non-kontak dengan jangkauan pengukuran 2 cm hingga 400 cm dan akurasi hingga sekitar 3 mm [2]. Sensor bekerja dengan memancarkan gelombang ultrasonik 40 kHz melalui pin Trigger, kemudian menghitung selisih waktu hingga gelombang pantul diterima oleh pin Echo. Selisih waktu tersebut dikonversi menjadi jarak menggunakan kecepatan rambat bunyi di udara. Prinsip pantulan gelombang ini menjadikan HC-SR04 sensor yang umum dipakai untuk deteksi level cairan tanpa perlu bersentuhan langsung dengan air.

3.3 OLED SH1106


Gambar 3. OLED SH1106

SH1106 merupakan IC driver layar OLED/PLED monokrom yang mendukung resolusi hingga 132×64 piksel dan dapat diakses melalui antarmuka I2C, SPI, maupun paralel [3]. Modul OLED berbasis SH1106 berukuran 128×64 piksel dipilih pada sistem ini karena konsumsi dayanya rendah dan kontrasnya tinggi tanpa memerlukan lampu latar (backlight).

3.4 Buzzer aktif


Gambar 4. Buzzer

Buzzer aktif menghasilkan bunyi ketika diberi tegangan searah tanpa memerlukan sinyal frekuensi eksternal, sehingga dapat dikendalikan langsung melalui pin digital mikrokontroler.

 3.5 LED indikator


Gambar 5. LED
LED digunakan sebagai indikator visual status sistem: warna hijau, kuning, dan merah masing-masing merepresentasikan kondisi aman, waspada, dan bahaya.

 3.5 Diagram Blok Sistem

Gambar 6.  Diagram Blok Sistem

 3.6 Diagram Alir Sistem

Alur kerja program dapat digambarkan sebagai berikut:

Gambar 7.  Diagram Alir Sistem

 3.7 Gambar Rangkaian

Gambar 8.  Diagram Alir Sistem

 3.8 Diagram Pengawatan


Gambar 9.  Diagram Pengawatan

 3.9 Program

"""============================================================================
Pemrogram      : Kelompok RE-3D/03

1. 03-Amin Bagus Hari Saputro            NIM:4.34.23.3.03
2. 09-Firza Fadhil Baihaqi               NIM:4.34.23.3.09
3. 15-Muhammad Rafi Athallah             NIM:4.34.23.3.15
4. 21-Rofiqul Ula Azmi                   NIM:4.34.23.3.21

Tgl. Praktikum : Rabu, 17 Juni 2026

===============================================================================
Proyek03-SistemPemantauanTangkiAir

Program sistem monitoring Tangki Air yang menggunakan sensor ultrasonik
HC-SR04 untuk mengukur ketinggian air secara real-time.
Data ketinggian air ditampilkan pada OLED SH1106 dalam bentuk
animasi gelombang dan persentase level air.
LED dan buzzer digunakan sebagai indikator kondisi aman,
waspada, dan bahaya.

-------------------------------------------------------------------------------
Materi Baru:

- Penggunaan sensor ultrasonik HC-SR04
- Monitoring ketinggian air berbasis Raspberry Pi Pico
- Tampilan grafis OLED SH1106
- Animasi gelombang menggunakan fungsi sinus
- Penggunaan PWM untuk buzzer
- Sistem pemantauan level air secara real-time

-------------------------------------------------------------------------------
Komponen:

- 1x Raspberry Pi Pico
- 1x Sensor Ultrasonik HC-SR04
- 1x OLED SH1106 128x64 I2C
- 1x Active Buzzer
- 1x LED Hijau
- 1x LED Kuning
- 1x LED Merah
- Resistor secukupnya
- Kabel Jumper
- Catu Daya 5V

===============================================================================

Fitur Sistem:

1. Sensor HC-SR04 mengukur jarak permukaan air terhadap sensor.
2. Sistem menghitung persentase level air berdasarkan tinggi wadah.
3. OLED menampilkan status kondisi air dan persentase level air.
4. Animasi gelombang air secara real-time.
5. Jika level air kurang dari 40%: Status BAHAYA, LED Merah
   menyala, buzzer berbunyi interval 0,25 detik, tulisan "Habis!"
   berkedip pada OLED, gelombang air kecil.
6. Jika level air antara 40% sampai 69%: Status WASPADA, LED Kuning
   menyala, buzzer berbunyi interval 0,7 detik, gelombang air sedang.
7. Jika level air mencapai 70% atau lebih: Status AMAN, LED Hijau menyala,
   Buzzer mati, gelombang air Penuh.
8. Sistem bekerja secara otomatis dan terus menerus memantau
   perubahan level air secara real-time.

-------------------------------------------------------------------------------
Konfigurasi Pin

OLED SH1106 (I2C)
SCL         : GPIO 15
SDA         : GPIO 14

HC-SR04
Trigger     : GPIO 2
Echo        : GPIO 3

LED Hijau   : GPIO 17
LED Kuning  : GPIO 27
LED Merah   : GPIO 28

Buzzer      : GPIO 0

==============================================================================="""
#=== Pustaka ===
from machine import Pin, I2C
from time import sleep_us, sleep_ms, ticks_ms, ticks_us, ticks_diff
from math import sin
from sh1106 import SH1106_I2C

#=== Deklarasi Variabel
i2c = I2C(1, scl=Pin(15),sda=Pin(14),freq=400000)
oled = SH1106_I2C(128, 64, i2c)
trig = Pin(2, Pin.OUT)
echo = Pin(3, Pin.IN)
led_hijau  = Pin(17, Pin.OUT)
led_kuning = Pin(27, Pin.OUT)
led_merah  = Pin(28, Pin.OUT)
buzzer = Pin(0, Pin.OUT)
buzzer.off()

#=== Konstanta Pendeteksi Banjir ===
JARAK_KOSONG  = 22
JARAK_PENUH   = 2
RANGE_CM      = JARAK_KOSONG - JARAK_PENUH

BATAS_WASPADA = 40
BATAS_AMAN  = 70

#=== Variabel Animasi ===
phase  = 0.0
phase2 = 1.5

#=== Fungsi Baca Jarak HC-SR04 ===
def baca_jarak():
  trig.low()
  sleep_us(2)
  trig.high()
  sleep_us(10)
  trig.low()

  t0 = ticks_us()
  while echo.value() == 0:
    if ticks_diff(ticks_us(), t0) > 30000:
      return JARAK_KOSONG

  start_us = ticks_us()
  while echo.value() == 1:
    if ticks_diff(ticks_us(), start_us) > 30000:
      return JARAK_KOSONG

  durasi_us = ticks_diff(ticks_us(), start_us)
  jarak = durasi_us * 0.0343 / 2
  return jarak

#=== Fungsi Hitung Level Air (%) ===
def hitung_level(jarak):
  if jarak > JARAK_KOSONG:
    jarak = JARAK_KOSONG
  if jarak < JARAK_PENUH:
    jarak = JARAK_PENUH
  level = int((JARAK_KOSONG - jarak) * 100 / RANGE_CM)
  return level

#=== Fungsi Tentukan Status ===
def tentukan_status(level):
  if level >= BATAS_AMAN:
    return "Aman"
  elif level >= BATAS_WASPADA:
    return "Waspada"
  else:
    return "Bahaya"

#=== Fungsi Kontrol LED ===
def set_led(status):
  led_hijau.off()
  led_kuning.off()
  led_merah.off()
  if status == "Aman":
    led_hijau.on()
  elif status == "Waspada":
    led_kuning.on()
  else:
    led_merah.on()

#=== Fungsi Gambar Gelombang Air ===
def gambar_gelombang(level_px, amplitudo):
  WAVE_W   = 64
  WAVE_TOP = 10
  WAVE_BOT = 63

  permukaan = WAVE_BOT - level_px
  if permukaan < WAVE_TOP + 1:
    permukaan = WAVE_TOP + 1

  for x in range(1, WAVE_W - 1):
    y1 = int(permukaan + sin(x * 0.18 + phase) * amplitudo)
    y2 = int(permukaan + sin(x * 0.11 + phase2) * max(1, amplitudo - 1))

    if y1 < WAVE_TOP + 1: y1 = WAVE_TOP + 1
    if y1 > WAVE_BOT:     y1 = WAVE_BOT
    if y2 < WAVE_TOP + 1: y2 = WAVE_TOP + 1
    if y2 > WAVE_BOT:     y2 = WAVE_BOT

    oled.line(x, y1, x, WAVE_BOT, 1)
    oled.pixel(x, y2, 1)

#=== Program Utama ===
WAVE_W   = 64
WAVE_TOP = 10
WAVE_BOT = 63
WAVE_H   = WAVE_BOT - WAVE_TOP          # = 53 px

buzzer_state = False
last_beep    = 0

while True:
  now = ticks_ms()

  # --- Baca Sensor ---
  jarak  = baca_jarak()
  level  = hitung_level(jarak)
  status = tentukan_status(level)

  # --- Kontrol LED ---
  set_led(status)

  # --- Kontrol Buzzer Aktif Non-Blocking ---
  if status == "Aman":
    buzzer.off()                        # Buzzer mati
    buzzer_state = False
    last_beep    = now

  elif status == "Waspada":
    if now - last_beep >= 700:          # interval 0,7 detik
      buzzer_state = not buzzer_state
      last_beep = now
      if buzzer_state:
        buzzer.on()                     # Buzzer berbunyi
      else:
        buzzer.off()                    # Buzzer diam

  else:                                 # Bahaya
    if now - last_beep >= 250:          # interval 0,25 detik
      buzzer_state = not buzzer_state
      last_beep = now
      if buzzer_state:
        buzzer.on()                     # Buzzer berbunyi
      else:
        buzzer.off()                    # Buzzer diam

  # --- Atur Amplitudo Gelombang ---
  if status == "Aman":
    amplitudo = 2
  elif status == "Waspada":
    amplitudo = 4
  else:
    amplitudo = 7

  level_px = int(level * WAVE_H / 100)

  # --- Gambar pada OLED ---
  oled.fill(0)

  oled.rect(0, 0, 128, 10, 1)
  oled.text("Kelompok 3", 24, 1, 1)

  oled.rect(0, WAVE_TOP, WAVE_W, WAVE_H + 1, 1)
  gambar_gelombang(level_px, amplitudo)

  oled.rect(64, 10, 64, 54, 1)

  COL_X  = 65
  COL_W  = 62
  CHAR_W = 8

  def tengah_kanan(teks):
    return COL_X + (COL_W - len(teks) * CHAR_W) // 2

  oled.rect(66, 13, 58, 14, 1)
  if status == "Aman":
    oled.text("Aman", tengah_kanan("Aman"), 16, 1)
  elif status == "Waspada":
    oled.text("Waspada", tengah_kanan("Waspada"), 16, 1)
  else:
    if (now // 350) % 2:
      oled.text("Habis!", tengah_kanan("Bahaya!"), 16, 1)

  oled.rect(66, 30, 58, 30, 1)
  oled.text("Level:", tengah_kanan("Level:"), 34, 1)
  persen_str = "{}%".format(level)
  oled.text(persen_str, tengah_kanan(persen_str), 48, 1)

  oled.show()

  phase  += 0.22
  phase2 += 0.15
  if phase  > 6.28: phase  -= 6.28
  if phase2 > 6.28: phase2 -= 6.28

  sleep_ms(55)

IV. Cara kerja sistem

Secara garis besar, sistem bekerja melalui siklus berulang (loop) berikut:

4.1 Pengukuran jarak

Pin trig diberi pulsa HIGH selama 10 mikrodetik untuk memicu sensor HC-SR04 memancarkan gelombang ultrasonik. Sistem kemudian mengukur durasi pin echo berada pada kondisi HIGH menggunakan fungsi ticks_us(). Durasi tersebut dikonversi menjadi jarak dengan rumus jarak = durasi × 0.0343 / 2, di mana pembagian dua dilakukan karena gelombang menempuh jarak pergi-pulang. Jika tidak ada pantulan yang terdeteksi dalam batas waktu tertentu, sistem menganggap kondisi tangki dalam keadaan kosong sebagai nilai aman (fail-safe).

4.2 Perhitungan persentase level air

Jarak yang terbaca dipetakan ke dalam rentang antara JARAK_KOSONG (jarak sensor ke permukaan saat tangki kosong) dan JARAK_PENUH (jarak saat tangki penuh). Selisih keduanya (RANGE_CM) digunakan sebagai pembagi untuk mengonversi jarak menjadi persentase level air antara 0% hingga 100%.

4.3 Penentuan status dan kontrol aktuator

Berdasarkan persentase level, sistem menentukan tiga kondisi:

  • Bahaya (level < 40%): LED merah menyala, buzzer berbunyi setiap 0,25 detik, teks peringatan berkedip di OLED, dan animasi gelombang mengecil.
  • Waspada (40% ≤ level < 70%): LED kuning menyala, buzzer berbunyi lebih jarang yaitu setiap 0,7 detik, dan gelombang bergerak sedang.
  • Aman (level ≥ 70%): LED hijau menyala, buzzer mati, dan gelombang tampak penuh.

Kontrol buzzer dirancang secara non-blocking menggunakan pencatatan waktu (ticks_ms()) sehingga program tetap dapat memperbarui tampilan OLED tanpa harus berhenti menunggu (sleep panjang) saat buzzer berbunyi.

4.4 Visualisasi pada OLED

Gambar 10.  Visual pada OLED

Animasi gelombang air digambar menggunakan fungsi trigonometri sin() yang nilainya berubah terhadap variabel fase (phase dan phase2) yang terus bertambah setiap perulangan program, sehingga menghasilkan efek gelombang yang bergerak secara halus. Amplitudo gelombang disesuaikan dengan status air: semakin kritis kondisinya, gelombang digambar semakin bergejolak. Di sisi kanan layar, OLED menampilkan status kondisi air dan angka persentase level secara berdampingan dengan animasi tersebut.

4.4 Foto Prototipe

Gambar 11.  Prototipe

V. Kesimpulan

Sistem pemantauan ketinggian air berbasis Raspberry Pi Pico yang dirancang mengukur ketinggian air menggunakan sensor ultrasonik HC-SR04, menampilkan hasilnya sebagai animasi gelombang dan persentase pada layar OLED SH1106, serta mengaktifkan LED dan buzzer sesuai tiga kategori: aman (level ≥ 70%), waspada (40% sampai 69%), dan bahaya (di bawah 40%). Kontrol buzzer yang dirancang secara non-blocking memungkinkan tampilan OLED tetap diperbarui tanpa terhambat oleh jeda bunyi peringatan. Sistem belum diuji pada wadah dengan permukaan air yang bergelombang akibat aliran masuk deras, sehingga pengujian pada kondisi tersebut perlu dilakukan pada tahap selanjutnya. Pengembangan lebih lanjut dapat berupa penambahan modul Wi-Fi untuk pemantauan jarak jauh melalui aplikasi, serta pencatatan data (logging) untuk menganalisis pola pemakaian air dari waktu ke waktu.

VI. Daftar Pustaka

  1. Raspberry Pi Ltd. (2024). Raspberry Pi Pico datasheet: An RP2040-based microcontroller board. Diakses dari https://www.raspberrypi.com/products/raspberry-pi-pico/
  2. SparkFun Electronics. (t.t.). Ultrasonic Ranging Module HC-SR04 datasheet. Diakses dari https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf
  3. Sino Wealth / Univision Technology. (t.t.). SH1106 132 x 64 dot matrix OLED/PLED segment/common driver with controller datasheet. Diakses dari https://www.pololu.com/file/0J1813/SH1106.pdf
  4. Raspberry Pi Ltd. (t.t.). MicroPython documentation for Raspberry Pi Pico-series. Diakses dari https://www.raspberrypi.com/documentation/microcontrollers/micropython.html

VI. Lampiran

Komentar

Postingan populer dari blog ini

Robot Pengikut Jalur Berdasarkan Pengenalan Nomor Angka Dalam Plat Nomor Di Area Parkir Berbasis Raspberry Pi 4

Rancang Bangun Smart Trash Bin Berbasis IC Atmega 328