Menu
CoddyTech

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.

challenge icon

Thử thách

Trung bình

Thê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 * 10 ms, căn thời gian bằng millis()
  • 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);
}
quiz iconTự kiểm tra

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

Tự luyện tập: Playground Arduino