Series
Lập Trình ESP32 Cơ Bản
  1. Series Lập Trình ESP32 Cơ Bản – Giới Thiệu: Lộ Trình 19 Bài Từ Số 0
  2. 1Lập trình ESP32 – Bài 1: ESP32 là gì? Hướng dẫn bắt đầu với ESP32 cho người mới
  3. 2Lập trình ESP32 – Bài 2: Kết nối WiFi và kiểm tra Internet với ESP32
  4. 3Lập trình ESP32 – Bài 3: Đọc nút nhấn và điều khiển LED với ESP32
  5. 4Lập trình ESP32 – Bài 4: Đọc nhiệt độ & độ ẩm với cảm biến DHT11
  6. 5Lập trình ESP32 – Bài 5: ESP32 Web Server – Điều khiển LED qua trình duyệt
  7. 6Lập trình ESP32 – Bài 6: Điều khiển LED RGB
  8. 7Lập trình ESP32 – Bài 7: Điều khiển Relay qua Web Server
  9. 8Lập trình ESP32 – Bài 8: WebSocket – Điều khiển LED realtime từ trình duyệt
  10. 9Lập trình ESP32 – Bài 9: Đọc cảm biến ánh sáng (LDR) và hiển thị realtime qua WebSocket
  11. 10Lập trình ESP32 – Bài 10: Điều khiển Servo SG90 qua Web Server
  12. 11Lập trình ESP32 – Bài 11: Đọc các loại biến trở (Potentiometer / Analog Sensor)
  13. 12Lập trình ESP32 – Bài 12: Đọc cảm biến khoảng cách HC-SR04
  14. 13Lập trình ESP32 – Bài 13: ESP32 – Đọc cảm biến nhiệt độ, độ ẩm DHT11 và hiển thị dữ liệu realtime qua WebSocket
  15. 14Lập trình ESP32 – Bài 14: Hiển thị màn hình TFT (SPI)
  16. 15Lập trình ESP32 – Bài 15: Màn hình OLED SSD1306 (I2C)
  17. 16Lập trình ESP32 – Bài 16: Module SIM 4G A7680C – Gọi điện thoại, in thông tin SIM/Module, trạng thái 4G
  18. 17Lập trình ESP32 – Bài 17: Phát nhạc MP3 với module DFPlayer Mini
  19. 18Lập trình ESP32 – Bài 18: Đọc cảm biến khí gas MQ-2 và hiển thị lên màn hình OLED
  20. 19Lập trình ESP32 – Bài 19: Kết nối MQTT, Publish dữ liệu cảm biến & Subscribe điều khiển thiết bị
Kiến thức

Lập trình ESP32 – Bài 12: Đọc cảm biến khoảng cách HC-SR04

Th11 2025
Lập trình ESP32 – Bài 12: Đọc cảm biến khoảng cách HC-SR04

Hướng dẫn lập trình ESP32 đọc cảm biến siêu âm HC-SR04, đo khoảng cách vật thể theo thời gian thực. Bài viết giải thích nguyên lý hoạt động, sơ đồ kết nối, và cung cấp code ví dụ in kết quả ra Serial và OLED SSD1306.

Mục lục

  1. Giới thiệu cảm biến HC-SR04
  2. Nguyên lý hoạt động
  3. Chuẩn bị phần cứng
  4. Sơ đồ kết nối
  5. Code ví dụ 1 – Đọc cảm biến hiển thị qua Serial
  6. Code ví dụ 2 – Đọc cảm biến & hiển thị lên OLED
  7. Giải thích mã nguồn
  8. Gợi ý mở rộng
  9. Lỗi thường gặp

1) Giới thiệu cảm biến HC-SR04

Cảm biến HC-SR04 là loại siêu âm (ultrasonic) phổ biến dùng để đo khoảng cách bằng cách phát xung âm thanh và đo thời gian phản hồi khi sóng âm dội lại từ vật thể.

  • Khoảng đo: 2cm – 400cm
  • Điện áp hoạt động: 5V
  • Tín hiệu: Trig (phát xung), Echo (nhận phản hồi)
  • Giao tiếp: digital pulse (không cần giao thức đặc biệt)

2) Nguyên lý hoạt động

  1. Gửi xung HIGH 10µs vào chân Trig
  2. Module phát sóng âm tần số 40kHz
  3. Khi gặp vật cản, sóng phản xạ trở lại và được cảm biến thu qua chân Echo
  4. ESP32 đo thời gian xung HIGH tại Echo
  5. Khoảng cách được tính theo công thức:

3) Chuẩn bị phần cứng

Linh kiệnSố lượngGhi chú
ESP32 DevKit V11Board chính
HC-SR04 Ultrasonic1Module đo khoảng cách
OLED SSD1306 I2C1Tùy chọn hiển thị
Dây nối4–6 dây dupont

4) Sơ đồ kết nối

HC-SR04 PinESP32 PinMô tả
VCC5VNguồn 5V
GNDGNDChung mass
TrigGPIO5Chân phát xung
EchoGPIO18Chân nhận phản hồi

OLED (tùy chọn):

  • SDA → GPIO21
  • SCL → GPIO22
  • VCC → 3.3V
  • GND → GND

Lưu ý: Echo xuất mức 5V, nên dùng chia áp 10kΩ/20kΩ hoặc logic-level shifter để bảo vệ chân ESP32.


5) Code ví dụ 1 – Đọc cảm biến và in Serial

#define TRIG_PIN 5
#define ECHO_PIN 18

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

void loop() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  long duration = pulseIn(ECHO_PIN, HIGH);
  float distance = duration / 58.2;

  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");

  delay(500);
}

6) Code ví dụ 2 – Hiển thị lên OLED SSD1306

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define TRIG_PIN 5
#define ECHO_PIN 18
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

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

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("OLED failed!"));
    for(;;);
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
}

void loop() {
  // Phát xung đo
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  long duration = pulseIn(ECHO_PIN, HIGH);
  float distance = duration / 58.2;

  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("ESP32 - HC-SR04");
  display.setTextSize(2);
  display.setCursor(10, 30);
  display.print(distance, 1);
  display.print(" cm");
  display.display();

  Serial.printf("Distance: %.1f cm\n", distance);
  delay(500);
}

7) Giải thích mã

  • pulseIn(ECHO_PIN, HIGH) đo thời gian phản hồi (µs).
  • Công thức chia 58.2 quy đổi sang cm (tốc độ âm thanh 343m/s).
  • OLED hiển thị giá trị đo dạng chữ lớn, cập nhật mỗi 0.5s.

8) Gợi ý mở rộng

  • Thêm buzzer cảnh báo khi vật ở gần (< 20 cm).
  • Gửi dữ liệu MQTT / WebSocket lên dashboard.
  • Hiển thị biểu đồ realtime trên web UI.
  • Kết hợp servo hoặc motor để tạo hệ thống tránh vật cản tự động.

9) Lỗi thường gặp

LỗiNguyên nhânCách xử lý
Luôn hiển thị 0Sai chân Trig/EchoKiểm tra dây hoặc delayMicroseconds
Kết quả sai lệchEcho 5V chưa giảm ápThêm chia áp 10k/20k
OLED không hiển thịĐịa chỉ I2C sai (0x3C/0x3D)Kiểm tra SDA/SCL