请求修复Arduino Uno连接3路超声波传感器、蜂鸣器及LED的异常代码
Arduino Uno 三超声波传感器+蜂鸣器+LED 修正方案
原代码问题分析
- 三个传感器同时触发超声波,会产生声波干扰,导致回波检测不准确,引发误判
- 状态判断逻辑错误:三个传感器的判断依次覆盖设备状态,比如A传感器触发LED亮后,B传感器未触发又会把LED关掉,直接导致LED随机闪烁、蜂鸣器乱响
pulseIn未设置超时,默认超时1秒,既拖慢循环速度,又会在无回波时返回0,触发错误的安全警报- 冗余变量过多,串口打印格式混乱
修正后的代码
// 引脚定义 const int trigPinA = 7; const int echoPinA = 2; const int trigPinB = 3; const int echoPinB = 4; const int trigPinC = 5; const int echoPinC = 6; const int buzzer = 10; const int ledPin = 12; // 常量定义 const int SAFETY_DISTANCE = 5; // 安全距离(厘米) const long PULSE_TIMEOUT = 30000; // 超声波检测超时时间(微秒,对应约5米最大检测距离) void setup() { // 设置引脚模式 pinMode(trigPinA, OUTPUT); pinMode(echoPinA, INPUT); pinMode(trigPinB, OUTPUT); pinMode(echoPinB, INPUT); pinMode(trigPinC, OUTPUT); pinMode(echoPinC, INPUT); pinMode(buzzer, OUTPUT); pinMode(ledPin, OUTPUT); Serial.begin(9600); } // 封装超声波测距函数 int getDistance(int trigPin, int echoPin) { // 触发超声波 digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // 读取回波时间,带超时 long duration = pulseIn(echoPin, HIGH, PULSE_TIMEOUT); // 计算距离,超时则返回一个大于安全距离的值 if (duration == 0) { return SAFETY_DISTANCE + 1; } return duration * 0.034 / 2; } void loop() { // 逐个读取三个传感器的距离,避免干扰 int distanceA = getDistance(trigPinA, echoPinA); int distanceB = getDistance(trigPinB, echoPinB); int distanceC = getDistance(trigPinC, echoPinC); // 判断是否触发安全警报:任意一个传感器距离小于等于安全距离则触发 bool isAlarmTriggered = (distanceA <= SAFETY_DISTANCE) || (distanceB <= SAFETY_DISTANCE) || (distanceC <= SAFETY_DISTANCE); // 控制蜂鸣器和LED if (isAlarmTriggered) { digitalWrite(ledPin, HIGH); digitalWrite(buzzer, LOW); // 若蜂鸣器实际是高电平触发,改为HIGH即可 } else { digitalWrite(ledPin, LOW); digitalWrite(buzzer, HIGH); // 对应上面的触发逻辑 } // 串口打印距离信息 Serial.print("距离A: "); Serial.print(distanceA); Serial.print(" cm | 距离B: "); Serial.print(distanceB); Serial.print(" cm | 距离C: "); Serial.print(distanceC); Serial.println(" cm"); delay(100); // 可选:降低串口打印频率,减轻串口负载 }
关键修改说明
- 逐个触发传感器:通过封装的
getDistance函数,每次只触发一个传感器并读取回波,彻底避免声波互相干扰 - 修正状态判断逻辑:使用逻辑或判断,只要任意一个传感器进入安全距离范围,就保持警报状态,不会被后续传感器的判断覆盖
- 添加
pulseIn超时:避免无回波时函数阻塞1秒,同时防止超时导致的误触发 - 简化代码结构:封装测距函数,减少冗余代码,提升可读性
- 优化串口打印:清晰显示三个传感器的距离数据,便于调试
内容的提问来源于stack exchange,提问作者mathduck
相关产品推荐
相关产品推荐

