Arduino中超声波传感器为何仅输出0?求排查方案
问题排查:超声波传感器输出0的原因及修复
代码层面的问题(大概率是主要诱因)
- 未初始化引脚模式:代码里直接对A0执行
digitalWrite、对A1执行pulseIn,但未在setup()中设置引脚的输入输出属性。Arduino模拟引脚默认是输入模式,直接向A0写入电平可能无法有效触发传感器,导致无回波信号,pulseIn超时后返回0。
修复:在setup()中添加引脚初始化代码:pinMode(A0, OUTPUT); pinMode(A1, INPUT); pulseIn超时逻辑:pulseIn默认超时时间为1秒,若传感器未检测到回波(触发失败或无障碍物),会直接返回0。可以手动设置更合理的超时阈值(比如30000微秒,对应约5米的最大测距),避免不必要的等待:int duration = pulseIn(A1, HIGH, 30000);- 冗余库依赖:代码中引入的
math.h并非必要,Arduino原生支持round函数,可直接删除#include <math.h>。
硬件层面的排查方向
- 接线错误:确认传感器触发脚(Trig)接A0、回声脚(Echo)接A1,VCC接5V、GND接Arduino的GND。若VCC与GND接反可能损坏传感器;触发/回声引脚接错也会导致无回波信号。
- 传感器故障:更换一组数字引脚(比如D2做触发、D3做回声)重新测试,或用已知正常的传感器替换,验证是否为硬件本身问题。
- 供电不足:若传感器外接电源,确保输出电压稳定;若直接用Arduino的5V供电,避免同时连接其他高功耗模块,防止电压不足导致触发失败。
修复后的完整代码示例
void setup() { Serial.begin(9600); pinMode(A0, OUTPUT); pinMode(A1, INPUT); } void loop() { int dist = getcm(); delay(100); Serial.println(dist); } int getcm() { digitalWrite(A0, LOW); delayMicroseconds(2); digitalWrite(A0, HIGH); delayMicroseconds(10); digitalWrite(A0, LOW); int duration = pulseIn(A1, HIGH, 30000); if (duration == 0) { return -1; // 用-1标记无回波,区分真实0距离场景 } int distance = (duration * 0.0343) / 2; distance = round(distance); return distance; }
内容的提问来源于stack exchange,提问作者Sithum Harshana
相关产品推荐
相关产品推荐

