Menu
CoddyTech

泊车传感器:蜂鸣声

本课属于 Coddy Arduino 学习旅程的“项目”单元。第 11 课,共 24 课。

停车传感器既会发声,也会显示信息:离墙越近,蜂鸣声越快,直到变成持续的单音,表示停车。蜂鸣器连接在引脚 8 上。

蜂鸣间隔由距离决定:距离乘以 10,单位是毫秒。距离为 70 cm 时,每隔 700 ms 蜂鸣一次;距离为 20 cm 时,每隔 200 ms 蜂鸣一次。millis() 计时器会判断下一次蜂鸣的时间:

if (millis() - lastBeep >= cm * 10) {
  lastBeep = millis();
  tone(buzzerPin, 1000, 50);  // 持续 50 ms 的蜂鸣声
}

还有两种情况。距离小于 10 cm 时,不指定时长,播放 tone(buzzerPin, 1000):它会持续发声,直到有东西将其停止。距离达到或超过 100 cm 时,保持静音,并调用 noTone(buzzerPin),这样也会停止之前遗留的持续音。

challenge icon

挑战

中等

添加蜂鸣声:

  • 100 cm 或更远:不发声(调用 noTone())
  • 10 到 99 cm:每隔 cm * 10 ms 发出一次 1000 Hz、持续 50 ms 的蜂鸣声,使用 millis() 计时
  • 小于 10 cm:持续发出 1000 Hz 的音调

保留灯光和输出。按下运行,将物体移近,然后检查。

亲手试试

// 距离传感器
const int trigPin = 9;
const int echoPin = 10;
// 警示灯
const int greenPin = 6;
const int yellowPin = 7;
const int redPin = 13;

// 发送一次超声波脉冲,返回以 cm 为单位的距离。
long readDistance() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  long duration = pulseIn(echoPin, HIGH);
  return duration / 58;
}

// 距离足够远时亮绿灯,接近时亮黄灯,太近时亮红灯。
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 icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

项目中的所有课

自己练习: Arduino 在线编辑器