Sensor Ultrasonik HC-SR04 dengan Arduino: Wiring, Kod dan Cara Baca Jarak

HC-SR04 ultrasonic sensor on a breadboard emitting a cone of sound waves toward a wall and receiving the echo back

Untuk guna HC-SR04 dengan Arduino, bekalkan kuasa 5V, hantar pulse HIGH selama 10 µs pada TRIG, kemudian ukur berapa lama ECHO kekal HIGH dengan pulseIn(). Jarak dalam sentimeter = angka mikrosaat itu ÷ 58. Pembahagian dengan 2 untuk perjalanan pergi-balik bunyi sebenarnya sudah termasuk dalam nombor 58 itu — sebab itulah ia nampak macam nombor rawak pada mulanya.

Apa fungsi empat pin pada HC-SR04?

HC-SR04 ada empat pin dalam susunan tetap — VCC, TRIG, ECHO, GND — dengan silkscreen di sebelah header; ada batch yang letak label di depan, ada yang di belakang. VCC dan GND untuk kuasa; TRIG ialah input yang anda pandu; ECHO pula output yang modul pandu balik kepada anda.

HC-SR04 ialah komponen 5V: datasheet menyatakan working voltage DC 5V dan working current 15 mA. Itu beban yang ringan, senang sahaja dibekalkan oleh rail 5V pada Uno sendiri — tak sama dengan servo dalam panduan beza servo 180° vs 270° vs 360° kami. Angka 5V itu mula jadi penting sebaik sahaja anda tinggalkan Uno, macam yang diterangkan dalam bahagian ESP32 di bawah.

Macam mana nak sambung HC-SR04 ke Arduino Uno?

HC-SR04 perlukan tepat empat jumper wire male-female untuk sampai ke Uno. TRIG dan ECHO boleh masuk mana-mana dua digital pin — pin 9 dan 10 di bawah cuma konvensyen biasa.

Pin HC-SR04 Pin Arduino Uno Nota
VCC 5V Mesti 5V — pin 3.3V tak boleh jalankan HC-SR04 klasik dengan stabil
TRIG D9 (mana-mana digital pin) OUTPUT — anda yang pulse pin ini
ECHO D10 (mana-mana digital pin) INPUT — modul yang tarik pin ini jadi HIGH
GND GND Ground yang dikongsi bukan pilihan, ia wajib

Kalau TRIG dan ECHO tertukar, bacaan jadi sifar sampailah anda tukar balik. Selalunya modul selamat, tapi bukan bermakna ia tak apa-apa dari segi prinsip: output TRIG Arduino anda berakhir tersambung ke output ECHO modul, dan dua output akan tolak-menolak setiap kali kedua-duanya tak sependapat.

Sensor ultrasonik HC-SR04 disambung ke Arduino Uno atas breadboard dengan empat jumper wire: VCC ke 5V, TRIG ke pin 9, ECHO ke pin 10, GND ke GND
Empat wayar sahaja: VCC ke 5V, TRIG ke D9, ECHO ke D10, GND ke GND. Susunan pin tak pernah berubah.

Apa kod asas HC-SR04 untuk Arduino?

HC-SR04 tak perlukan library — tiga panggilan digitalWrite() tambah satu pulseIn() sudah jadi keseluruhan driver. Upload sketch ini, buka Serial Monitor pada 9600 baud, dan lambai tangan depan sensor.

// Pembaca jarak asas HC-SR04 - Arduino Uno
// TRIG pada pin 9, ECHO pada pin 10.

const int TRIG_PIN = 9;
const int ECHO_PIN = 10;

void setup() {
  Serial.begin(9600);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
}

void loop() {
  // 1. Mula dari keadaan LOW yang bersih, kemudian hantar trigger pulse 10 us.
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  // 2. Ukur berapa lama ECHO kekal HIGH, dalam mikrosaat.
  //    Had 30000 us = berhenti tunggu selepas kira-kira 5 m jarak sasaran
  //    (30000 / 58 = 517 cm; bunyi itu sendiri merentas ~10 m pergi dan balik).
  //    Ia juga duduk bawah pulse ~38 ms yang modul keluarkan bila tak nampak apa-apa.
  long duration = pulseIn(ECHO_PIN, HIGH, 30000);

  // 3. Tukar unit. 58 = mikrosaat pergi-balik bagi setiap sentimeter.
  if (duration == 0) {
    Serial.println("No echo - out of range, or nothing reflected back");
  } else {
    float distanceCm = duration / 58.0;
    Serial.print(distanceCm);
    Serial.println(" cm");
  }

  delay(100);   // datasheet minta sekurang-kurangnya 60 ms antara setiap ping
}

Kenapa bahagi 2, dan dari mana datangnya 58?

Pulse ECHO pada HC-SR04 mengukur perjalanan pergi dan balik, dan satu fakta itu sahaja menjelaskan kedua-dua pemalar tadi. Bila TRIG dapat pulse 10 µs, modul akan tembak lapan kitaran ultrasonik 40 kHz, kemudian tahan ECHO pada HIGH selama mana burst itu mengambil masa untuk sampai ke sasaran anda dan kembali semula.

Bunyi bergerak lebih kurang 343 m/s dalam udara suhu bilik, atau kira-kira 0.0343 cm setiap mikrosaat. Pulse itu merentas jarak dua kali, jadi jarak = (masa × 0.0343) ÷ 2 — iaitu masa ÷ 58.3, yang dibundarkan oleh datasheet kepada ÷ 58. (Datasheet yang sama juga cetak 340 m/s bersebelahan ÷ 58 itu, yang sepatutnya bagi ÷ 58.8 — ketidakselarasan kecil datasheet itu sendiri.) Banyak sketch lain pula tulis duration / 29.1 / 2, iaitu ÷ 58.2. Semua ini jatuh dalam lingkungan 1% antara satu sama lain, dan suhu udara menggerakkan laju bunyi lebih jauh daripada itu.

Rajah pemasaan menunjukkan trigger pulse 10 mikrosaat, burst ultrasonik 40 kHz lapan kitaran bergerak ke dinding dan balik, serta pulse echo yang lebarnya sama dengan masa pergi-balik
Trigger 10 µs menembak lapan kitaran 40 kHz; ECHO kekal HIGH sepanjang perjalanan pergi dan balik — sebab itulah ada ÷2.

Lebih senang tengok keseluruhan kitaran dalam video? Walkthrough ini terangkan dari mula sampai habis:

Berapa jarak sebenar HC-SR04, dan apa yang buat bacaan gagal?

HC-SR04 dispesifikasikan untuk 2 cm hingga 400 cm, dengan ketepatan ranging sehingga 3 mm dan sudut ukuran berkesan di bawah 15°. Kon 15° itulah spec yang selalu tak diambil kira oleh pemula.

Spec Nilai Apa maknanya untuk projek anda
Julat jarak 2 cm – 400 cm Bawah 2 cm ialah zon buta: burst 40 kHz lapan kitaran ambil 200 µs untuk dihantar, tetapi perjalanan pergi-balik 2 cm cuma ambil kira-kira 116 µs, jadi echo sampai balik sebelum modul sempat habis menghantar
Ketepatan sehingga 3 mm Kes terbaik: sasaran rata dan keras, betul-betul mengadap sensor
Sudut ukuran bawah 15° Ia kon, bukan laser — ia nampak benda paling dekat dalam kon itu
Working voltage / current 5V DC / 15 mA Selamat pada pin 5V Uno, tak sama dengan servo
Frekuensi burst 40 kHz, 8 kitaran Tak boleh didengar telinga; sensor yang berdekatan boleh cross-talk
Kitaran ukuran minimum 60 ms Ping lebih cepat daripada ini, burst sebelumnya belum reda, jadi echo yang masih melekat itu masuk ke dalam ukuran seterusnya
Saiz modul 45 × 20 × 15 mm Ukur potongan casing supaya muat kedua-dua tin transducer

Empat jenis sasaran akan kalahkan sensor ini tak kira sebagus mana kod anda. Permukaan lembut atau berbulu — kain, foam, patung lembut — menyerap burst itu dan bukannya memantulkannya. Permukaan yang senget pula melantunkannya ke tepi macam cahaya kena cermin.

Objek yang lebih kecil daripada kon pancaran langsung terlepas pandang, dan apa-apa yang bawah 2 cm duduk dalam zon buta. Sebelum salahkan sketch, tengok dulu apa yang anda halakan sensor itu kepadanya.

Perbandingan pantulan ultrasonik: dinding rata dan keras memantulkan burst bunyi terus balik berbanding foam yang menyerapnya dan panel senget yang melencongkannya ke tepi
Rata dan keras memantul bersih; lembut menyerap; senget melencong jauh. Sasaran lebih penting daripada kod.

Macam mana nak hentikan bacaan 0 rawak dan jitter?

Bila HC-SR04 tak jumpa apa-apa, ia tidak biarkan ECHO kekal low — datasheet kata pin itu keluarkan pulse high 38 ms sebaliknya. Baca tanpa timeout, anda akan dapat kira-kira 38000 µs, yang bertukar jadi 655 cm palsu, bukannya error yang jelas. Timeout 30000 µs dalam sketch di atas duduk sikit di bawah 38 ms itu, jadi ping tanpa halangan pulang sebagai 0 yang bersih. Masalah “membeku satu saat” yang orang selalu adukan pula lain ceritanya: bila ECHO langsung tak naik — wayar longgar, tiada shared ground, modul mati — pulseIn() akan block selama satu saat penuh mengikut nilai default. Apa pun keadaannya, hantar timeout secara eksplisit.

Untuk jitter, ambil beberapa bacaan dan guna yang tengah. Median menolak nilai pelik jauh lebih baik daripada purata, sebab satu bacaan buruk tak boleh tarik keputusan.

// Median 5 bacaan - menolak nilai pelik yang sekali-sekala muncul.
// Guna pemalar TRIG_PIN / ECHO_PIN daripada sketch di atas.

long readOnce() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  return pulseIn(ECHO_PIN, HIGH, 30000);
}

float readMedianCm() {
  long s[5];
  for (int i = 0; i < 5; i++) {
    s[i] = readOnce();
    delay(60);                 // hormat kitaran ukuran 60 ms
  }
  for (int i = 1; i < 5; i++) {          // insertion sort, 5 item
    long k = s[i];
    int j = i - 1;
    while (j >= 0 && s[j] > k) { s[j + 1] = s[j]; j--; }
    s[j + 1] = k;
  }
  if (s[2] == 0) return -1.0;  // bacaan tengah kena timeout
  return s[2] / 58.0;
}

Library NewPing buat semua ini untuk anda: ia set timeout secara automatik, langsung tak guna pulseIn(), dan datang dengan helper ping_median(). pulseIn() biasa memang cukup untuk belajar dan untuk satu sensor; guna NewPing bila anda jalankan beberapa sensor atau tak mampu ada loop yang blocking.

Boleh ke guna HC-SR04 dengan ESP32 atau board 3.3V lain?

Trigger 3.3V selalunya jalan — datasheet panggil TRIG sebagai input TTL, dan 3.3V melepasi threshold TTL — walaupun ia marginal pada modul yang microcontroller atas papannya guna aras input 5V CMOS. ECHO yang jadi masalah sebenar: ia pandu balik 5V penuh, dan Espressif menetapkan GPIO ESP32 pada 3.6V, sambil menyuruh anda tambah voltage divider kalau melebihi itu. Sambung ECHO terus ke ESP32 dan anda sedang jalankan pin itu di luar spec.

Penyelesaiannya ialah divider dua perintang pada ECHO sahaja: 1 kΩ dari ECHO ke GPIO, 2 kΩ dari node yang sama ke GND. Itu menurunkan 5V kepada 5 × (2 ÷ 3) = 3.33V. TRIG sambung terus, tak perlu divider. Pilihan lain, beli varian HC-SR04P yang jalan pada 3V–5.5V; HC-SR04 klasik memang komponen 5V. ESP32 langsung tak keluar pun? Itu masalah berasingan — baca panduan kami tentang cara betulkan ESP32 yang tak detect.

Kesilapan biasa yang kami nampak daripada pelanggan sebenar

HC-SR04 tarik lebih banyak soalan daripada pelajar RBT sekolah dan pembina projek tahun akhir berbanding hampir mana-mana sensor lain yang kami jual, dan kegagalan yang sama berulang minggu demi minggu. Tiada satu pun daripadanya kecacatan sensor.

Yang paling kerap ialah modul yang label pinnya dah pudar, hilang atau hampir tak boleh dibaca — silkscreen halus di sebelah header itu memang tak tahan banyak pegangan. Susunannya sentiasa VCC, TRIG, ECHO, GND, jadi baca pin daripada jadual di atas dan jangan main teka, serta ketepikan sebab ini dulu sebelum buat keputusan modul anda rosak.

Satu lagi yang biasa ialah bacaan yang keluar tepat-tepat dua kali ganda. Itu ÷2 yang tertinggal — bahagi dengan 58, bukan 29. Diikuti rapat oleh sketch yang nampak macam hang atau tersekat-sekat, yang hampir selalunya berpunca daripada pulseIn() dipanggil tanpa argumen timeout, lalu block selama satu saat penuh mengikut default setiap kali ECHO langsung tak naik — wayar longgar, shared ground yang tertinggal, atau modul yang dah mati.

Kemudian ada kon 15° itu. Pembina halakan sensor pada sasaran dan terlupa yang tepi meja, dinding atau casing mereka sendiri duduk dalam pancaran itu, jadi sensor dengan jujurnya lapor objek yang lebih dekat tadi. Pasang modul supaya ia memandang ke ruang yang lapang.

Akhir sekali, ground. Sensor yang dibekalkan kuasa daripada satu supply tapi menghantar isyarat ke Arduino tanpa GND yang dikongsi akan hasilkan bacaan yang nampak macam noise semata-mata — ikat ground itu bersama. Panduan LM2596 buck converter kami terangkan cara bina rail 5V yang bersih.

FAQ

Berapa jauh HC-SR04 boleh ukur?

2 cm hingga 400 cm, dengan ketepatan sampai kira-kira 3 mm dalam keadaan yang baik. Bawah 2 cm ialah zon buta — bacaan berhenti mengikut jarak sebenar dan melekat berhampiran nilai paling rendah modul — dan melebihi lebih kurang 4 m, echo dah terlalu lemah untuk dikesan.

Kenapa HC-SR04 saya asyik baca 0 atau nombor yang sama?

Bacaan 0 yang berterusan bermakna pulseIn() kena timeout — selalunya TRIG dan ECHO tertukar, tiada GND yang dikongsi, atau sasaran menyerap bunyi. Nilai yang melekat sekitar 655 cm pula ialah output “tiada halangan” yang didokumenkan modul, iaitu pulse ECHO 38 ms, jadi ia memang tak nampak apa-apa. Nilai yang langsung tak berubah juga boleh bermakna anda ping lebih laju daripada kitaran ukuran 60 ms yang dibenarkan, jadi setiap bacaan masih tangkap echo daripada burst sebelumnya.

Perlu ke library untuk guna HC-SR04?

Tak perlu. Tiga panggilan digitalWrite() tambah satu pulseIn() sudah jadi keseluruhan driver. NewPing berbaloi ditambah bila anda jalankan beberapa sensor atau perlukan pemasaan yang tak blocking, tapi ia pilihan sahaja.

Boleh ke sambung HC-SR04 terus ke ESP32?

TRIG boleh, ECHO tak boleh. ECHO keluarkan 5V dan GPIO ESP32 bukan 5V tolerant, jadi letak divider 1 kΩ / 2 kΩ pada ECHO, atau guna varian HC-SR04P 3V–5.5V sebagai ganti.

Kenapa jarak yang saya ukur tepat dua kali ganda daripada jarak sebenar?

Anda bahagi dengan 29 dan bukan 58. Pulse ECHO merangkumi perjalanan penuh bunyi pergi dan balik, jadi perjalanan pergi-balik itu kena dibahagi dua — bahagikan mikrosaat dengan 58 untuk dapat sentimeter.

Kemas kini terakhir Julai 2026. Tersangkut? Chat dengan kami di WhatsApp.

Leave a Reply

Your email address will not be published. Required fields are marked *