HC-SR04超声波测距接ESP32:接线代码与精度

2026-11-03 07:08:55 19阅读

给机器人加避障,第一个要解决的问题是“前面多远有东西”。HC-SR04 大概是最便宜的答案:十几块钱、四个引脚、Arduino 和 ESP32 都能驱动,玩家手里几乎人手一个。这篇把它的接线、代码和精度这几件事一次理清楚,参数和代码都以 Random Nerd Tutorials 的 ESP32 教程页为底核对过,另对照了两篇专门讲电平兼容的实操文,把它没展开的坑补上。

HC-SR04超声波模块与ESP32开发板

先把模块看清楚:四个引脚和标称参数

HC-SR04 正面是两颗圆柱形的超声换能器,左边发射(T)、右边接收(R),中间那颗金属器件是 40kHz 的谐振晶振;背面是驱动电路,常见的clone版用 MAX3232 之类做收发驱动。引脚一共四个:VCC、Trig、Echo、GND。

HC-SR04超声波模块正面

HC-SR04超声波模块背面电路

关键标称参数整理成表,这几项在教程页和 datasheet 上是一致的:

项目数值
供电5V DC
工作电流15 mA
工作频率40 kHz
量程2 cm 到 400 cm
标称精度0.3 cm
测量角度15°
触发信号10 µs TTL 脉冲
尺寸45 × 20 × 15 mm

测距原理:一次声波往返计时

原理就是声呐:Trig 收到 10µs 高电平后,模块发出 8 个 40kHz 的超声脉冲,同时 Echo 拉高;声波碰到物体反射回来,Echo 拉低。主控用 pulseIn() 量出 Echo 的高电平时长,就是声波往返时间。

超声波发射与回波示意

距离 = 声速 × 时间 ÷ 2。20℃ 时声速约 343 m/s,换算过来就是 0.034 cm/µs,除以 2 之后每厘米距离对应约 58µs。顺带一提,声速对温度敏感,大约每差 1℃ 变 0.6 m/s——冬天和夏天测同一个东西,读数会差出几个百分点,做精细测距时值得用 DHT22 之类的温度计补偿。

接线:ESP32 上怎么接才稳

Random Nerd Tutorials 的接法是 VCC 接 VIN(5V)、GND 接 GND、Trig 接 GPIO 5、Echo 接 GPIO 18。教程页明确说这两个 GPIO 可以换成别的可用脚,不必拘泥。

HC-SR04与ESP32接线图

这里有一个教程没展开、但绕不开的点:Echo 脚输出的是 5V 电平,而 ESP32 的 GPIO 是 3.3V 系统。短时实验里直接接大多没事,但长期跑谁也不敢保证;稳妥做法是在 Echo 到 GPIO 之间加一组分压电阻,串一个 1kΩ、对地一个 2kΩ,把 5V 分到约 3.3V 再进 GPIO。Trig 方向相反,是 ESP32 输出给模块,3.3V 电平模块认作高电平,可以直接接。

另一个实操经验:模块发射瞬间电流有尖峰,供电不稳时会随机误触发。在模块的 VCC 和 GND 之间就近并一颗 100µF 电解电容,能明显减少“幽灵回波”。面包板供电的尤其建议加。

代码:一份能直接烧的最小示例

下面这份示例逐字符照搬自 Random Nerd Tutorials 的教程页,能直接在 Arduino IDE(装好 ESP32 支持包后)烧录运行,串口波特率 115200:

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-hc-sr04-ultrasonic-arduino/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/

const int trigPin = 5;
const int echoPin = 18;

//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701

long duration;
float distanceCm;
float distanceInch;

void setup() {
  Serial.begin(115200); // Starts the serial communication
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
}

void loop() {
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);
  
  // Calculate the distance
  distanceCm = duration * SOUND_SPEED/2;
  
  // Convert to inches
  distanceInch = distanceCm * CM_TO_INCH;
  
  // Prints the distance in the Serial Monitor
  Serial.print("Distance (cm): ");
  Serial.println(distanceCm);
  Serial.print("Distance (inch): ");
  Serial.println(distanceInch);
  
  delay(1000);
}

逻辑拆开看就三步:先给 Trig 一个 10µs 脉冲触发测距;再用 pulseIn(echoPin, HIGH) 量 Echo 高电平持续了多少微秒;最后乘 0.034 除以 2 得到厘米数。SOUND_SPEED 定义成 0.034 cm/µs,CM_TO_INCH 是给习惯英寸的人准备的换算系数。

精度这件事:标称 0.3cm,实测环境说了算

ESP32与HC-SR04面包板实测

标称精度 0.3cm 是理想条件下的分辨率下限,实际能不能拿到,取决于几件事。第一是目标物:15° 测量角之外的斜面会把回波弹偏,软布、海绵这类吸音材料回波很弱,容易丢目标;第二是温度,前面说过声速漂移的问题;第三是供电,尖峰引起的误触发会混进离谱读数。

还有个新手常踩的坑:pulseIn() 不设超时的话,量程外(比如对着开阔空间)Echo 等不到回落,程序会卡住整整一秒。常见做法是加第三个参数给个 30000µs 的上限,返回 0 就按“超出量程”处理,输出日志里单独标出来,别让它污染数据。

测量频率也别贪快,示例里两次测距间隔了 1 秒,属于稳妥值;做避障要更快刷新的话,把间隔压到 60-100ms 一般还能稳,再快回波串扰就开始出现了。串口监视器里先跑通,再谈上机。

小结

HC-SR04 是那种“便宜但有脾气”的器件:接线四根、代码十几行就能跑,但要在 ESP32 上长期稳跑,Echo 分压、电源去耦、pulseIn 超时这三件事最好一次做齐。参数以上面表格为准,代码来自教程页原样搬运,照着烧就能出数。下一步想让它上机器人,不妨配合舵机做个转动测距的“扫眼”,避障体验会好一截。


作者:固件烧录仔
链接:https://www.aiddithome.com/p/145a2fdd6f316d.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
5条评论
胶佬憨憨
1楼 · 2026-11-03 07:09:22

这个模块我拿来给小车做过三层防撞,最深的印象就是软的东西基本测不到,窗帘海绵全是盲区。文里说 15 度角外回波弹偏,确实是这样,斜着对着墙读数能差出一倍。分压电阻那段建议新手直接焊死,我用洞洞板飞线接的 1k+2k,跑了半年没出过事。

老张装机
2楼 · 2026-11-03 07:09:22

pulseIn 不加超时会卡一秒这个太真实了,第一次对着空房间测试,串口半天才蹦一个数,查了一晚上原来是这个。

调参到凌晨
3楼 · 2026-11-03 07:09:22

0.034 这个系数记住就行,58 微秒一厘米,改代码的时候心算都方便。

下班才有空
4楼 · 2026-11-03 07:09:22

问一下接 OLED 那版原教程里 Trig 和 Echo 还是 5 和 18 吗?想照着加个小屏幕。

阿强焊点总飞
5楼 · 2026-11-03 07:09:22

100 微法电容这个tip收了,面包板上确实偶尔蹦出 400 多厘米的幽灵数,一直没想明白,估计就是供电尖峰。