Cảm biến đỗ xe: tiếng bíp
Thuộc phần Dự án trong hành trình Arduino của Coddy. Bài học 11 trên 24.
Cảm biến đỗ xe vừa phát âm thanh vừa hiển thị: tường càng gần thì tiếng bíp càng nhanh, cho đến khi cảm biến phát một âm liên tục báo hiệu cần dừng lại. Còi buzzer nối với chân 8.
Khoảng cách giữa các tiếng bíp phụ thuộc vào khoảng cách: lấy khoảng cách nhân với 10, tính bằng mili giây. Ở 70 cm, cứ mỗi 700 ms sẽ có một tiếng bíp; ở 20 cm, cứ mỗi 200 ms. Bộ hẹn giờ millis() quyết định khi nào đến lúc phát tiếng bíp tiếp theo:
if (millis() - lastBeep >= cm * 10) {
lastBeep = millis();
tone(buzzerPin, 1000, 50); // một tiếng bíp dài 50 ms
}Còn hai trường hợp nữa. Khi dưới 10 cm, phát tone(buzzerPin, 1000) không có thời lượng: âm thanh sẽ tiếp tục cho đến khi có thứ gì đó dừng nó. Khi khoảng cách từ 100 cm trở lên, giữ im lặng và gọi noTone(buzzerPin) để dừng cả âm liên tục còn sót lại từ trước.
Thử thách
Trung bìnhThêm tiếng bíp:
- Từ 100 cm trở lên: không phát âm thanh (gọi
noTone()) - Từ 10 đến 99 cm: phát tiếng bíp dài 50 ms ở tần số 1000 Hz sau mỗi
cm * 10ms, căn thời gian bằngmillis() - Dưới 10 cm: phát âm liên tục ở tần số 1000 Hz
Giữ nguyên đèn và phần in ra. Nhấn Chạy, đưa vật thể lại gần hơn, rồi nhấn Kiểm tra.
Tự làm thử
// Cảm biến khoảng cách
const int trigPin = 9;
const int echoPin = 10;
// Đèn cảnh báo
const int greenPin = 6;
const int yellowPin = 7;
const int redPin = 13;
// Phát xung siêu âm và trả về khoảng cách tính bằng cm.
long readDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
return duration / 58;
}
// Đèn xanh khi còn xa, đèn vàng khi đến gần, đèn đỏ khi quá gần.
void showLights(long cm) {
digitalWrite(greenPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(redPin, LOW);
if (cm >= 100) {
digitalWrite(greenPin, HIGH);
} else if (cm >= 30) {
digitalWrite(yellowPin, HIGH);
} else {
digitalWrite(redPin, HIGH);
}
}
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(redPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
long cm = readDistance();
Serial.println(cm);
showLights(cm);
delay(100);
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Dự án
3Cảm biến đỗ xe
Cảm biến đỗ xe: khoảng cáchCảm biến đỗ xe: đènCảm biến đỗ xe: tiếng bípCảm biến đỗ xe: màn hìnhTự luyện tập: Playground Arduino