避障小车、倒车雷达、水箱液位、自动门——这类测距场景里最常见的就是 HC-SR04 超声波模块。它便宜、皮实、四根线接上就能用。这篇讲清楚它的原理、接线和怎么在 Arduino 里读取距离。
模块原理:Trig 发声,Echo 测量
HC-SR04 上有两个圆形的“眼睛”:一个是发射端,一个是接收端。你给 Trig 脚一个 10 微秒的高电平脉冲,模块就会发出一串 40kHz 的超声波;声波碰到物体弹回来,被接收端捕获后,Echo 脚会输出一个宽度和时间成正比的高电平。用这个高电平的时长乘上声速再除以 2,就是距离。

接线就四根线
VCC 接 5V,GND 接 GND,Trig 接一个数字脚(下面用 D9),Echo 接另一个数字脚(用 D10)。很多教程会提醒 Echo 输出是 5V,接 3.3V 的单片机时要分压,用 Arduino Uno 这类 5V 板子直接连就行。

测距代码
可以用官方自带的 pulseIn 函数,写法很直观:
const int trig=9,echo=10;
void setup(){
Serial.begin(9600);
pinMode(trig,OUTPUT);
pinMode(echo,INPUT);
}
void loop(){
digitalWrite(trig,LOW); delayMicroseconds(2);
digitalWrite(trig,HIGH); delayMicroseconds(10);
digitalWrite(trig,LOW);
long t=pulseIn(echo,HIGH); // 微秒
float cm=t/58.0; // 换算成厘米
Serial.print("距离: "); Serial.println(cm);
delay(100);
}用 newPing 库更省事
如果做避障小车,可以直接用 newPing 这个库,它把发送、计时、换算都封装好了,一句 newPing sonar(trig,echo) 就能 probe 出距离,还能做多次取平均、距离过滤,避障逻辑写起来清爽很多。
常见坑
一是有效测量范围一般在 2cm~400cm,离得太近或太斜都会读不准,安装时让探头发射面正对目标。二是供电要稳,插在面包板上长线供电容易误触发,尽量单独走 5V。三是室内多面墙会反射出“假回波”,配合多次采样取中值能明显改善。




超声波测距原理就是往返计时,其实很好懂。
“离太近读不准”说到点子上了,我 1cm 以内全是乱数。
newPing 库确实好用,读数稳定多了,感谢分享。
pulseIn 直接算厘米这个 t/58 记下了,避障小车没它不行。