/**
Trường Công nghệ Thông tin và Truyền thông, Đại học Bách Khoa Hà Nội
Website: https://soict.hust.edu.vn
Học phần: Hệ nhúng
Mô tả bài thực hành: Đo khoảng cách và báo về qua Serial, đèn Led
Các công cụ cần thiết:
- ESP32
- Bo mạch cắm breadboard
- HC-SR04
- 1 đèn led
- 1 điện trở từ 220 ~ 1K Ohm
**/
#define SR04_TRIG_PIN 23 // Vị trí chân GPIO của ESP32 được nối với Trig của SR04
#define SR04_ECHO_PIN 22 // Vị trí chân GPIO của ESP32 được nối với Echo của SR04
#define MY_LED 5 // Vị trí chân GPIO của ESP32 được nối với đèn LED
//-------------------------------------------------------------------
// Khởi tạo
//-------------------------------------------------------------------
void setup() {
// Chế độ hoạt động của chân Pin nối với Led: Output
pinMode(MY_LED, OUTPUT);
// SR04 phát xung âm khi có tín hiệu điều khiển từ chân Trig, và nhận siêu âm
// phản hồi thì báo về qua Echo. Vì vậy Trig là chân OUTPUT, còn Echo là chân INPUT
pinMode(SR04_TRIG_PIN, OUTPUT);
pinMode(SR04_ECHO_PIN, INPUT);
/// Thiết lập giao tiếp Serial ở phía ESP32
// - Tốc độ liên lạc 115200 bit per second
Serial.begin(115200);
// Gửi thông điệp chào hỏi về máy tính
Serial.println("ESP32 đo khoảng cách");
}
/**
* Đọc khoảng cách tới vật phản xạ. Đơn vị cm.
* @detail: Xem datashet của SR04
*/
int GetDistance() {
digitalWrite(SR04_TRIG_PIN, LOW); // Đưa chân Trig xuống mức thấp trong 2uS
delayMicroseconds(2);
digitalWrite(SR04_TRIG_PIN, HIGH); //Gửi luồng siêu âm kéo dài 10uS
delayMicroseconds(10);
digitalWrite(SR04_TRIG_PIN, LOW); //Tắt luồng siêu âm
unsigned int microseconds = pulseIn(SR04_ECHO_PIN, HIGH); // Đợi cho tới khi có phản hồi
return microseconds / 58; // Từ thời gian hành trình tính toán khoảng cách
}
unsigned int distance; // Khoảng cách từ vật thể tới cảm biến siêu âm
//-------------------------------------------------------------------
// Thân vòng lặp vĩnh viễn
//-------------------------------------------------------------------
void loop() {
/// Đọc trạng thái nút bấm
distance = GetDistance();
// Gửi về Serial
Serial.println(distance);
// Đèn báo hiệu theo khoảng cách
analogWrite(MY_LED, distance*10/4);
}