超声波测距 HC-SR04 — 原型快速验证距离触发的入门利器
- ✓ 搞懂 HC-SR04 的 Trig/Echo 时序原理和声速计算公式,知道如何算出距离
- ✓ 跑通一段可实际使用的测距示例代码(原型级),知道"应该看到什么"
- ✓ 理解盲区、材质吸声、角度偏移、温度对精度的影响
- ✓ 明确展厅工程化的边界:原型用 Arduino/ESP32,正式工程选带工业接口的方案或接采集模块
- ✓ 拿到选型对比(超声 vs 其他距离测量)和故障排查表
你想做一个展项:"观众把手伸向感应区,距离越近,屏幕上的图像变化越大",或者"人走到 50cm 以内,语音自动播报"。这类距离触发效果,原型阶段用 HC-SR04 超声波测距是最快的方法——几十块钱、两根 IO 线、十行代码就能跑起来,在展厅现场对着客户演示一点问题没有。
但你要清楚:HC-SR04 是原型工具,不是工程交付方案。吸声材质、角度偏移、温度变化、盲区……把这些坑踩完你才会知道"为什么展厅正式工程要选激光测距或工业级超声波"。本篇把原理和坑都讲透,让你用它快速验证点子,同时知道什么时候该换。
R2 内容,涉及传感器接线。HC-SR04 的具体电气参数(引脚电平、最大驱动电流)以模块 datasheet 为准;工程级替代方案的接线以所用型号和科星等工业模块手册为准。
原理:超声波发射-接收的 Trig/Echo 时序
HC-SR04 工作的核心原理非常直白:
- 给 Trig 引脚一个 ≥10µs 的高电平脉冲,模块立即发射一组 8 个 40kHz 超声波脉冲。
- 超声波以声速(约 343m/s,20°C 空气,以实测环境为准)向前传播,碰到障碍物反射回来。
- 模块接收到回声后,Echo 引脚输出一段高电平。这段高电平的持续时间就是超声波"出去再回来"的时间。
- 用这段时间计算距离。
距离计算公式
飞行时间 T = Echo 高电平持续时长(µs)
单程时间 = T / 2
距离 = 声速 × 单程时间
= 343(m/s)× (T / 2)(µs)
= 343 × 1e-6 × T / 2(m)
≈ T / 5830(m)
= T / 58.3(cm) ← 常用近似
简化记法:Echo 高电平时间(µs)÷ 58 ≈ 距离(cm)(20°C 附近)。
声速随温度变化:T°C 时声速约 = 331.3 + 0.606×T(m/s)。20°C 约 343m/s,0°C 约 331m/s,40°C 约 355m/s。如果展厅温控不稳定(冬夏温差大),测出来的距离会有几 cm 偏差。精度要求高的场合要做温度补偿或改用 ToF 激光测距。
量程与盲区
HC-SR04 官方标称量程 2cm ~ 400cm(以你所用的具体模块 datasheet 为准):
- 2cm 以内是盲区:模块发射完脉冲后需要一小段时间"切换到接收模式",太近的回声来不及接到,Echo 不会输出正确时间。展厅安装时保证被测目标不会进入 2cm 以内盲区。
- 400cm 以外:回声能量衰减太多,模块可能接不到,Echo 超时或输出很长的无效时间。实际可靠量程通常比标称要小,视目标材质和角度而定。
可跑示例(原型级,Arduino/ESP32)
以下代码适用于原型验证阶段,使用 Arduino/ESP32 等开发板。正式展厅工程应使用带工业接口的测距方案(RS485/Modbus 输出的工业超声波传感器,或激光测距模块接工业 IO),不要直接把 Arduino 接进展厅。
// HC-SR04 测距示例(Arduino Uno / ESP32,原型用)
// Trig → D9, Echo → D10(GPIO 自行对应)
// 以你的板子 datasheet 为准
const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
// 1. Trig:先拉低清空,再给 10µs 高脉冲
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// 2. 读 Echo 高电平时长(µs);超时 30ms 无回波
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
// 3. 计算距离
if (duration == 0) {
Serial.println("超时 / 无回波(目标太远或太近)");
} else {
float distance_cm = duration / 58.0;
Serial.print("距离: ");
Serial.print(distance_cm, 1);
Serial.println(" cm");
}
delay(100); // 每 100ms 测一次,避免回波互相干扰
}
你应该看到什么(串口监视器):
距离: 45.3 cm
距离: 45.1 cm
距离: 43.8 cm
距离: 18.2 cm ← 手靠近
距离: 18.0 cm
超时 / 无回波(目标太远或太近)
如果数值在目标不动时抖动超过 2~3cm,大概率是:目标材质吸声、角度偏斜、或者测量间隔太短导致余波干扰——调大 delay(),或者加软件滤波(如取 3 次测量的中位数)。
展厅用法:距离触发 / 手势靠近
超声波测距在展厅里最常见的两种用法:
1. 距离阈值触发
设定一个距离门限(如 60cm),人手/身体进入这个范围就触发内容,退出就停止:
if (distance_cm > 5 && distance_cm < 60) {
// 触发:发送信号给中控或直接控制设备
} else {
// 恢复待机
}
2. 距离映射交互
距离映射到某个参数(如音量、画面亮度、动画进度):
// 将 10~80cm 映射到 0~100 的参数值
float param = map(distance_cm, 10, 80, 0, 100);
param = constrain(param, 0, 100);
工程化说明:原型验证通过后,正式展厅建议用带 RS485/Modbus 接口的工业级超声波传感器(如带 0~5V 模拟量输出或 Modbus RTU 输出的型号)接入科星模拟量采集器或 IO 模块,再进中控。Arduino/ESP32 不要留在最终交付的工程里。
盲区、材质、角度、温度:四大精度杀手
盲区(< 2cm)
前面讲了,不要让被测物进入 2cm 内,安装时留足间距。
材质吸声
超声波是声波,布料、泡沫、海绵、毛绒这类多孔材质会吸收声波,反射很弱,测距不稳甚至测不到。展厅展品表面如果是软性材质,HC-SR04 可能不适用,换 ToF 激光测距(不受材质吸声影响)。
角度偏斜
超声波有一个发射角(HC-SR04 约 ±15°,以 datasheet 为准)。目标面与超声波束不垂直时,能量反射偏向,接收端收到的能量弱,测距不稳或偏大。被测面尽量与传感器正面平行。
温度
前面公式已说明。温差大(>10°C)的场合加温度补偿,或改用对温度不敏感的 ToF 激光测距。
展厅里最常踩的坑:传感器装在出风口附近,夏天开空调后距离测量突然漂移——那是温度变了,不是传感器坏了。要么把传感器移开风口,要么加 DHT11/DS18B20 读温度实时补偿声速。
工程化替代路径
当原型验证通过、需要做展厅交付版时,超声波测距的工程化替代方案:
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 精度要求 mm 级,目标材质多样 | ToF 激光测距(VL53L0X 等,加工业接口) | 不受材质吸声影响,精度高 |
| 量程 > 3m,户外或强温差环境 | 工业超声波传感器(Modbus/模拟量输出) | 工业封装、温度补偿、耐用 |
| 只需要"进入区域"判断,不需要精确距离 | 毫米波雷达(DO 输出) | 抗环境干扰强,不受材质影响 |
| 多路测距(3 路以上) | 工业超声波 + 科星模拟量采集器 | 多通道集中采集,接 Modbus 进中控 |
选型对比表
| 维度 | HC-SR04(原型) | 工业超声波传感器 | ToF 激光(VL53L0X) |
|---|---|---|---|
| 量程 | 2~400cm | 0.05~10m(型号不同) | 3cm~2m |
| 精度 | ±1~3cm(受温度/材质影响) | ±1% FS(以手册为准) | ±3%(以手册为准) |
| 接口 | GPIO(Trig/Echo) | Modbus RTU/模拟量 | I2C |
| 工程接法 | 需要控制器(Arduino/ESP32) | 直接接工业 IO/采集器 | 需要控制器,原型小装置 |
| 耐用性 | 一般(消费级裸板) | 高(IP67 封装等) | 一般(消费级封装) |
| 价格 | 很低(原型入门) | 中高 | 低(消费级,工程需加接口) |
| 材质影响 | 吸声材质失效 | 同样受材质影响 | 不受吸声影响 |
| 展厅适用阶段 | 原型验证 | 正式工程 | 原型/小装置(工程需工业化) |
具体参数以各型号 datasheet 为准,此表做方向选型参考。
故障排查表
| 现象 | 最可能原因 | 处理方法 |
|---|---|---|
| 一直返回 0 或超时 | 无回波:目标太远/太近/材质吸声/角度严重偏斜 | 先拿一块硬平面正对传感器测,确认基本功能;再排查安装条件 |
| 数值抖动 ±5cm 以上 | 测量间隔太短(余波干扰)/ 材质反射差 / 角度偏 | 加大测量间隔(≥100ms);多次取中位数;调整安装角度 |
| 读数比实际偏大 | 温度偏高声速未补偿 / 接收到旁边物体的反射波 | 加温度补偿;缩小检测角度;检查旁边是否有强反射面 |
| Echo 一直高电平 | GPIO 被干扰 / 接线不良 | 检查 VCC(5V)是否稳定;Echo 线是否和强电紧贴 |
| 多传感器互相干扰 | 两颗 HC-SR04 同时发射,接到对方回波 | 轮询发射:每次只给一颗 Trig,等它 Echo 完再触发下一颗 |
| 软材质目标测不到 | 布/泡沫/毛绒吸收超声波 | 改用 ToF 激光测距 |
进阶 / 应用案例
- 手势"飞页"效果:展柜上方装一颗 HC-SR04,手从左向右横扫,测距值先减小再增大——检测到这个变化模式就触发"翻页",不需要任何触摸。原型演示非常惊艳。
- 多路距离感应分区:大展台 3 个区域各装一颗 HC-SR04,分别检测三个区域有无人靠近,各自触发对应内容——原型级验证多区域联动。
- 结合温度补偿提升精度:在传感器附近加一颗 DS18B20 或 DHT22 读实时温度,动态修正声速公式,把精度从 ±3cm 压到 ±1cm 以内。
动手挑战
- 跑通上面的示例代码,然后换几种不同材质的物体做被测面(硬板、布料、纸箱、泡沫),记录每种材质下数值的稳定性——感受材质影响到底有多明显。
- 故意以 30°角斜对传感器测同一目标,和正对测同一目标,对比数值差异——体验角度偏斜的影响。
本节学到的知识
- 量程 2~400cm,标称值,实际可靠量程比标称小,视目标材质和角度而定;2cm 以内是盲区(模块切收模式来不及),安装留足间距。
- 接线就 Trig / Echo 两根线加电源;模块供电 5V,Echo 线别和强电紧贴,接口是数字量(GPIO),不是 RS485/Modbus。
- 时序:给 Trig 一个 ≥10µs 高电平脉冲触发一组 8 个 40kHz 超声波,读回 Echo 高电平时长即飞行时间。
- 测距公式记法:Echo 高电平时间(µs) ÷ 58 ≈ 距离(cm)(20°C 附近);声速约 343m/s(20°C),随温度变,公式 331.3 + 0.606×T。
- 精度约 ±1~3cm,受温度、材质、角度影响;温差 >10°C 要做温度补偿(配 DS18B20/DHT22 实时修正声速)。
- 发射角约 ±15°(以 datasheet 为准),被测面要尽量与传感器正面平行,斜对会测不准或偏大。
- 四大精度杀手:盲区、材质吸声、角度偏斜、温度;布/泡沫/毛绒等多孔材质吸声,HC-SR04 可能测不到,换 ToF 激光。
- 测量间隔 ≥100ms(避免余波互相干扰);多颗一起用要轮询发射(一颗测完再触发下一颗),否则收到对方回波。
- 定位是原型工具,不是工程交付方案:正式展厅换 Modbus/模拟量输出的工业超声波,接科星采集器→中控,Arduino/ESP32 别留在最终工程里。
- 具体电气参数(引脚电平、驱动电流、精确量程)以模块 datasheet 为准。
小结 · 你掌握了什么
- HC-SR04 的 Trig/Echo 时序:给 10µs 触发脉冲,读 Echo 高电平时长,除以 58 得距离(cm)。量程 2~400cm,2cm 以内是盲区。
- 四大精度杀手:盲区、材质吸声、角度偏斜、温度变化。展厅里温度和材质是最常踩的坑。
- 示例代码能跑,但这是原型工具。正式展厅工程要换工业接口的测距方案(工业超声波 Modbus 接入 / ToF 加工业网关),才能接进科星 IO → 中控的工程链路。
- 知道什么时候换方案:材质吸声换 ToF,量程 > 3m 换工业超声波,只需存在检测换毫米波雷达。
想看精度更高、不受材质影响的激光测距,参考 ToF 激光测距 VL53L0X。