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.
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ện | Số lượng | Giá tham khảo |
|---|---|---|
| Arduino UNO R3 | 1 | ~120.000đ |
| Cảm biến siêu âm HC-SR04 | 1 | ~20.000đ |
| Breadboard | 1 | ~25.000đ |
| Dây cắm đực-đực | 4 | ~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ện | Nối vào |
|---|---|
| HC-SR04 VCC | 5V |
| HC-SR04 Trig | Chân số 9 |
| HC-SR04 Echo | Chân số 10 |
| HC-SR04 GND | GND |
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
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Ω.