You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求修复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); // 可选:降低串口打印频率,减轻串口负载
}

关键修改说明

  1. 逐个触发传感器:通过封装的getDistance函数,每次只触发一个传感器并读取回波,彻底避免声波互相干扰
  2. 修正状态判断逻辑:使用逻辑或判断,只要任意一个传感器进入安全距离范围,就保持警报状态,不会被后续传感器的判断覆盖
  3. 添加pulseIn超时:避免无回波时函数阻塞1秒,同时防止超时导致的误触发
  4. 简化代码结构:封装测距函数,减少冗余代码,提升可读性
  5. 优化串口打印:清晰显示三个传感器的距离数据,便于调试

内容的提问来源于stack exchange,提问作者mathduck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:23:15