Nak tahu bila tangki air atas bumbung hampir kering? Pasang probe JSN-SR04T pada penutup tangki menghala ke bawah β ia ukur jarak ke permukaan air, Arduino Uno tukar jarak itu kepada peratus, papar pada OLED kecil dan bunyikan buzzer bila paras jatuh bawah 20%. Hanya probe hitam yang kalis air β papan pemacu biru mesti duduk kering di luar tangki.
Kenapa mesti guna JSN-SR04T, bukan HC-SR04 biasa?
Sensor JSN-SR04T datang dalam dua bahagian: probe silinder hitam yang tertutup rapat (rated IP67) pada kabel panjang berpalam putih 2-pin, dan papan pemacu biru berasingan dengan header 4 pin. HC-SR04 biasa ada dua “mata” terdedah yang cepat rosak dalam udara lembap tangki β untuk kerja air, probe bersalut penuh ini pilihannya.
Ikut datasheet pengeluar Manorshi, modul ini mengukur 21 cm hingga 600 cm pada bekalan DC 3.0β5.5V, dengan trigger dan echo yang berfungsi sama macam HC-SR04 β konsep asas ultrasonic ranging sudah kami terangkan dalam panduan HC-SR04 kami.
Senarai komponen
Untuk pasangan kekal
| Item | Price | Qty | |
|---|---|---|---|
Power Supply Adapter DC Universal AC to DC Converter PSU 5V2A 5V3A 9V2A 12V2A - P.S. ADAPTOR (12V2A)PSA1202 | RM15.95 |
Adaptor 12V terus ke jack DC Uno β monitor jalan 24 jam tanpa laptop.
Di mana kedudukan probe paling sesuai pada tangki?
Probe JSN-SR04T ada satu had penting: zon mati. Ia tidak boleh mengukur objek yang terlalu dekat β datasheet Manorshi versi 3.0 menyatakan minimum 21 cm, manakala datasheet revisi lama menyatakan 25 cm. Sebab angka ini berbeza ikut revisi papan, reka sistem anda untuk angka yang lebih selamat: anggap 25 cm sebagai zon mati.
Praktikalnya, pasang probe sekurang-kurangnya 30 cm di atas paras air penuh β bila tangki penuh, permukaan air kekal di luar zon mati, dan offset ini masuk dalam kiraan kod nanti. Probe memancar dalam kon lebar 75 darjah, jadi letakkannya di tengah penutup, jauh dari dinding dan titik air masuk supaya gema dinding dan kocakan inlet tidak mengganggu bacaan.
Jangan biarkan probe tergantung pada kabelnya β ia berayun dan jadi senget. Tebuk lubang di tengah penutup ikut saiz kepala probe, benamkan probe supaya mukanya menghala tepat menegak ke bawah, dan kedapkan kelilingnya dengan sealant silikon atau cable gland. Papan pemacu, Uno dan buzzer duduk dalam kotak kering dan teduh di luar tangki; hanya kepala probe menembusi penutup. Kerja atas bumbung ada adabnya: jangan panjat seorang diri, ikat kemas kabel pada paip atau struktur sedia ada, dan jauhkan wayar mains dari tangki. Untuk pasangan kekal, kuasakan Uno dengan adaptor 12V pada jack DC-nya β soket mains kekal dalam rumah, hanya kabel DC voltan rendah naik ke kotak elektronik.

Macam mana nak sambung JSN-SR04T, OLED dan buzzer ke Uno?
Papan pemacu JSN-SR04T guna empat pin β Vcc, GND, Trig, Echo β dan palam putih 2-pin dari kabel probe dicucuk terus ke soket pada papan itu. OLED 0.91 inci 128×32 pula bersambung melalui I2C: pada Arduino Uno, pin I2C ialah A4 (SDA) dan A5 (SCL). Perhatikan susunan header OLED ini: GND, VCC, SCK, SDA β label SCK di sini ialah talian jam I2C yang sama dengan SCL, cuma nama cetakan berbeza.
| Komponen / pin | Sambung ke |
|---|---|
| JSN-SR04T Vcc | Uno 5V |
| JSN-SR04T GND | Uno GND |
| JSN-SR04T Trig | Uno D9 |
| JSN-SR04T Echo | Uno D8 |
| Kabel probe (palam putih 2-pin) | Soket pada papan pemacu |
| OLED GND | Uno GND |
| OLED VCC | Uno 5V |
| OLED SCK (talian SCL) | Uno A5 |
| OLED SDA | Uno A4 |
| Buzzer wayar merah (+) | Uno D7 |
| Buzzer wayar hitam (β) | Uno GND |
Buzzer SFM-20B ialah jenis piezo aktif β spesifikasinya maksimum 10 mA pada voltan rated 12V, dan pada 5V arusnya lebih rendah lagi β jauh di bawah had 20 mA pin Uno, jadi boleh dipacu terus dari pin digital tanpa transistor (tak macam buzzer elektromagnetik yang lapar arus). Buzzer ini juga kuat, sekitar 95 dB β sebab itu kod nanti bunyikan bip pendek berkala, bukan nada berterusan.

Kalau nak tengok pemasangan sebenar sensor ini bersama OLED sebelum mula, video pendek ini menunjukkannya langkah demi langkah:
Macam mana jarak bertukar jadi peratus air?
Arduino Uno hanya tahu satu benda: jarak dari muka probe ke permukaan air. Untuk tukar jarak jadi paras, anda perlu dua ukuran tetap dari tangki sendiri β jarak penuh (probe ke paras air penuh, contohnya 30 cm) dan jarak kosong (probe ke dasar tangki, contohnya 150 cm). Kedalaman air = jarak kosong β bacaan; peratus = kedalaman Γ· (jarak kosong β jarak penuh) Γ 100.
Contoh: bacaan sensor 90 cm pada tangki tadi. Kedalaman air = 150 β 90 = 60 cm, dan peratus = 60 Γ· (150 β 30) Γ 100 = 50%. Ukur dua angka tetap ini dengan pita pengukur semasa pemasangan β kejituan seluruh sistem bergantung padanya.
Kenapa bacaan melompat-lompat dalam tangki, dan macam mana nak stabilkan?
Bacaan JSN-SR04T dalam tangki sebenar jarang duduk diam. Permukaan air berkocak setiap kali paip masuk mencurah, riak kecil menyerakkan gema, kon pancaran 75 darjah itu boleh terkena dinding tangki, dan wap air boleh berkondensasi pada muka probe β setiap satu boleh mencetuskan bacaan liar.
Penyelesaian paling berkesan: ambil beberapa bacaan dan guna median, bukan purata. Satu bacaan liar 400 cm dalam tujuh sampel akan menarik purata jauh tersasar, tetapi median hanya ambil nilai tengah selepas disusun β bacaan liar itu terus terbuang. Untuk data ultrasonic yang bersifat “spiky” begini, median hampir selalu menang.
Suhu pula mempengaruhi laju bunyi: kira-kira 331.5 m/s pada 0Β°C dan bertambah sekitar 0.6 m/s setiap 1Β°C. Kod kita anggap 343 m/s (sekitar 20Β°C); ruang udara dalam tangki yang panas terik boleh cecah 40Β°C, menyebabkan bacaan tersasar hampir 4% β lebih kurang 3 hingga 4 cm bagi setiap meter jarak. Untuk paparan peratus dan alarm, ini boleh diabaikan; nak kejituan sentimeter, kalibrasi jarak kosong di lokasi waktu tengah hari.

Apa kod penuh untuk monitor ini?
Sketch ini perlukan dua library dari Library Manager Arduino IDE: Adafruit GFX Library dan Adafruit SSD1306 (library Wire sudah terbina dalam). Alamat I2C modul 0.91 inci ini ialah 0x3C. Laraskan JARAK_PENUH dan JARAK_KOSONG ikut tangki anda, dan sketch terus siap pakai.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 oled(128, 32, &Wire, -1);
const int PIN_TRIG = 9;
const int PIN_ECHO = 8;
const int PIN_BUZZER = 7;
// Ukuran tangki anda β laraskan dua nilai ini
const float JARAK_PENUH = 30.0; // cm: probe ke paras air PENUH (kekal luar zon mati 25 cm)
const float JARAK_KOSONG = 150.0; // cm: probe ke dasar tangki
const int AMBANG_ALARM = 20; // buzzer mula berbunyi bawah 20%
const int AMBANG_RESET = 30; // buzzer senyap semula selepas naik atas 30% (histerisis)
const int BIL_SAMPEL = 7; // bilangan bacaan untuk median
bool alarmAktif = false;
float bacaJarakSekali() {
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10); // trigger 10us ikut datasheet
digitalWrite(PIN_TRIG, LOW);
unsigned long tempoh = pulseIn(PIN_ECHO, HIGH, 40000UL);
if (tempoh == 0) return -1.0; // tiada echo diterima
return tempoh * 0.0343 / 2.0; // 343 m/s (~20 darjah C)
}
float bacaJarakMedian() {
float sampel[BIL_SAMPEL];
int n = 0;
for (int i = 0; i < BIL_SAMPEL; i++) {
float j = bacaJarakSekali();
if (j > 0) {
int k = n; // insertion sort menaik
while (k > 0 && sampel[k - 1] > j) {
sampel[k] = sampel[k - 1];
k--;
}
sampel[k] = j;
n++;
}
delay(60); // beri masa gema lama mati dulu
}
if (n == 0) return -1.0;
return sampel[n / 2]; // nilai tengah = median
}
void setup() {
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_BUZZER, OUTPUT);
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // alamat I2C modul 0.91 inci
oled.clearDisplay();
oled.display();
}
void loop() {
float jarak = bacaJarakMedian();
oled.clearDisplay();
oled.setTextColor(SSD1306_WHITE);
if (jarak < 0) {
oled.setTextSize(1);
oled.setCursor(0, 12);
oled.print(F("Tiada bacaan sensor")); // semak palam probe dan wiring
oled.display();
return;
}
// Tukar jarak kepada kedalaman air dan peratus
float julat = JARAK_KOSONG - JARAK_PENUH;
float dalamAir = JARAK_KOSONG - jarak;
dalamAir = constrain(dalamAir, 0.0, julat);
int peratus = round(dalamAir / julat * 100.0);
oled.setTextSize(2); // peratus besar di kiri
oled.setCursor(0, 9);
oled.print(peratus);
oled.print(F("%"));
oled.setTextSize(1); // kedalaman kecil di kanan
oled.setCursor(72, 6);
oled.print(F("Dalam:"));
oled.setCursor(72, 18);
oled.print(dalamAir, 0);
oled.print(F(" cm"));
oled.display();
// Histerisis: ON bawah 20%, OFF semula hanya selepas atas 30%
if (!alarmAktif && peratus < AMBANG_ALARM) alarmAktif = true;
if (alarmAktif && peratus > AMBANG_RESET) alarmAktif = false;
if (alarmAktif) { // bip pendek, bukan bunyi berterusan
digitalWrite(PIN_BUZZER, HIGH);
delay(150);
digitalWrite(PIN_BUZZER, LOW);
}
delay(1000);
}
Perhatikan dua ambang alarm itu: buzzer mula berbunyi bila paras jatuh bawah 20%, tetapi hanya senyap semula selepas paras naik melepasi 30%. Tanpa histerisis begini, air yang berkocak di sekitar 20% akan buat buzzer hidup-mati tak tentu hala. Langkah seterusnya yang popular: tambah relay dan pam supaya tangki isi sendiri β konsepnya sama seperti sistem siram pokok automatik kami.
Kesilapan biasa yang kami nampak
Bacaan asyik 0 atau satu nombor tetap. Selalunya palam putih probe tak dicucuk kemas ke papan pemacu, atau wayar Trig dan Echo tertukar. Cucuk semula palam probe dan semak Trig ke D9, Echo ke D8 ikut jadual di atas.
Bacaan melompat liar. Biasanya probe terlalu dekat dengan dinding tangki atau betul-betul di atas curahan inlet β alihkan ke tengah penutup. Kalau tangki penuh sampai masuk zon mati 25 cm, bacaan juga jadi karut: naikkan kedudukan probe.
Elok atas meja, merepek dalam tangki. Atas meja probe menghala ke lantai yang rata dan pegun β keadaan ideal. Dalam tangki, pastikan probe menghala tepat menegak ke bawah; senget beberapa darjah sahaja sudah menghantar gema ke dinding, bukan kembali ke probe β sebab itulah probe dibenam kemas dalam lubang penutup, bukan tergantung bebas.
Sistem mati selepas beberapa minggu di luar. Hampir selalu puncanya papan pemacu atau Uno terdedah pada hujan dan embun. Sekali lagi: hanya probe yang kalis air β semua papan mesti dalam bekas tertutup, dan lubang kabel dikedapkan.
Soalan lazim tentang sensor paras air tangki
Boleh guna untuk tangki setinggi mana?
JSN-SR04T mengukur sehingga 600 cm, jadi selepas tolak offset pemasangan 30 cm, tangki sedalam 5 meter pun masih dalam liputan. Tangki poli rumah di Malaysia kebiasaannya 1 hingga 2 meter β sangat selesa untuk sensor ini.
Kalau air bergelora, bacaan lari tak?
Kocakan biasa sudah diserap oleh median 7 bacaan dalam kod. Kalau tangki anda sentiasa bergelora kuat, naikkan BIL_SAMPEL ke 11, atau gantung sebatang paip PVC menegak di bawah probe sebagai “stilling well” β air dalam paip jauh lebih tenang daripada permukaan terbuka.
Tahan ke probe ni kena panas matahari atas bumbung?
Probe rated IP67 dan datasheet menyatakan suhu operasi -20Β°C hingga +70Β°C, jadi haba bumbung Malaysia masih dalam julat. Yang perlu dilindungi ialah elektronik: letakkan papan pemacu dan Uno dalam bekas tertutup di tempat teduh, bukan terdedah terik.
Boleh hantar alert ke telefon tak?
Arduino Uno tiada WiFi, jadi setakat OLED dan buzzer sahaja. Naik taraf ke ESP32 dan kod yang hampir sama boleh hantar notifikasi ke telefon β lihat perbandingan ESP32, ESP8266 dan Uno kami untuk pilih papan yang sesuai.
Sesuai tak untuk tangki bawah tanah?
Sesuai β prinsipnya sama: probe di penutup atas menghala ke bawah. Cuma udara tangki bawah tanah lebih lembap, jadi titisan kondensasi lebih kerap terbentuk pada muka probe; lap muka probe setiap kali servis, dan pastikan papan pemacu kekal di atas paras tanah dalam bekas kering.
Kemas kini terakhir Ogos 2026. Tersangkut? Chat dengan kami di WhatsApp.



Arduino Uno Compatible SMD UNO R3 with Type B Cable - ATMEGA328P with CH340G-Microcontroller Project
Waterproof Ultrasonic Distance Sensor JSN-SR04T Module Water Level Measurement Range Finder 20-600cm Arduino
0.91' OLED Display Module I2C Communication 3.3V 5V For Arduino IOT Application
SFM-20B Active Buzzer DC 3-24V Piezoelectric Long Continous Beep
Power Supply Adapter DC Universal AC to DC Converter PSU 5V2A 5V3A 9V2A 12V2A - P.S. ADAPTOR (12V2A)