Arduino Người mới

Arduino UNO và HC-SR04: đo khoảng cách bằng sóng siêu âm

Cảm biến 20 nghìn đồng đo được khoảng cách từ 2cm đến 4m. Bài này giải thích cả công thức tính, không chỉ chép code.

21.09.20266 phút đọc

HC-SR04 hoạt động giống con dơi: phát một chùm sóng siêu âm, đếm thời gian sóng dội lại. Biết thời gian và biết tốc độ âm thanh, ta tính ra quãng đường.

Linh kiện cần có

Linh kiệnSố lượngGiá tham khảo
Arduino UNO R31~120.000đ
Cảm biến siêu âm HC-SR041~20.000đ
Breadboard1~25.000đ
Dây cắm đực-đực4~5.000đ

Giá tham khảo ở các cửa hàng linh kiện tại Việt Nam, tháng 10/2026. Giá thay đổi theo thời điểm và nơi bán.

Sơ đồ nối dây

Chân linh kiệnNối vào
HC-SR04 VCC5V
HC-SR04 TrigChân số 9
HC-SR04 EchoChân số 10
HC-SR04 GNDGND

Rút nguồn trước khi cắm dây. Kiểm tra lại toàn bộ sơ đồ rồi mới cắm USB.

Các bước thực hiện

Bước 1. Nối bốn dây

Cảm biến có đúng bốn chân, cắm theo bảng bên dưới. HC-SR04 bản thường dùng 5V nên nối thẳng vào Arduino UNO được, không cần mạch chia áp.

Bước 2. Nạp code

Không cần cài thư viện nào, hàm pulseIn() có sẵn trong Arduino.

Bước 3. Kiểm tra

Mở Serial Monitor ở 9600 (lưu ý bài này dùng 9600, khác các bài ESP32). Đưa tay lại gần rồi ra xa trước cảm biến, số sẽ thay đổi theo.

Mã nguồn

hc_sr04.ino
const int TRIG = 9;
const int ECHO = 10;

void setup() {
  Serial.begin(9600);
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
}

void loop() {
  // Phat mot xung 10 micro giay
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  // Do thoi gian song doi ve, don vi micro giay
  long thoiGian = pulseIn(ECHO, HIGH, 30000);

  if (thoiGian == 0) {
    Serial.println("Ngoai tam do");
  } else {
    float khoangCach = thoiGian * 0.0343 / 2;
    Serial.print("Khoang cach: ");
    Serial.print(khoangCach);
    Serial.println(" cm");
  }

  delay(300);
}

Giải thích code

Âm thanh đi khoảng 343 m/s trong không khí 20°C, tức 0,0343 cm mỗi micro giây. pulseIn() đo tổng thời gian cả lượt đi lẫn lượt về, nên phải chia đôi mới ra khoảng cách tới vật.

Tham số 30000 là thời gian chờ tối đa. Quá 30 mili giây mà chưa có sóng dội về nghĩa là vật ở xa hơn 4m hoặc bề mặt hút âm, hàm trả về 0.

Lỗi thường gặp

  • Số đọc luôn là 0 hoặc nhảy loạnThử đổi dây Trig và Echo cho nhau, rất dễ cắm ngược.
  • Đo vật mềm như rèm vải không ra kết quảSóng siêu âm bị vải hút. Cảm biến này hợp với bề mặt cứng, phẳng.
  • Dùng với ESP32 thì hỏng chânChân Echo xuất 5V trong khi ESP32 chỉ chịu 3,3V. Phải qua mạch chia áp hai điện trở 1kΩ và 2kΩ.