超声波测距 HC-SR04 — 原型快速验证距离触发的入门利器

2026-06-22 接口:数字(Trig/Echo) R2
你将学到
  • 搞懂 HC-SR04 的 Trig/Echo 时序原理和声速计算公式,知道如何算出距离
  • 跑通一段可实际使用的测距示例代码(原型级),知道"应该看到什么"
  • 理解盲区、材质吸声、角度偏移、温度对精度的影响
  • 明确展厅工程化的边界:原型用 Arduino/ESP32,正式工程选带工业接口的方案或接采集模块
  • 拿到选型对比(超声 vs 其他距离测量)和故障排查表

你想做一个展项:"观众把手伸向感应区,距离越近,屏幕上的图像变化越大",或者"人走到 50cm 以内,语音自动播报"。这类距离触发效果,原型阶段用 HC-SR04 超声波测距是最快的方法——几十块钱、两根 IO 线、十行代码就能跑起来,在展厅现场对着客户演示一点问题没有。

但你要清楚:HC-SR04 是原型工具,不是工程交付方案。吸声材质、角度偏移、温度变化、盲区……把这些坑踩完你才会知道"为什么展厅正式工程要选激光测距或工业级超声波"。本篇把原理和坑都讲透,让你用它快速验证点子,同时知道什么时候该换。

R2 内容,涉及传感器接线。HC-SR04 的具体电气参数(引脚电平、最大驱动电流)以模块 datasheet 为准;工程级替代方案的接线以所用型号和科星等工业模块手册为准。


原理:超声波发射-接收的 Trig/Echo 时序

HC-SR04 工作的核心原理非常直白:

  1. Trig 引脚一个 ≥10µs 的高电平脉冲,模块立即发射一组 8 个 40kHz 超声波脉冲。
  2. 超声波以声速(约 343m/s,20°C 空气,以实测环境为准)向前传播,碰到障碍物反射回来。
  3. 模块接收到回声后,Echo 引脚输出一段高电平。这段高电平的持续时间就是超声波"出去再回来"的时间。
  4. 用这段时间计算距离。

距离计算公式

飞行时间 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 以内。

动手挑战

  1. 跑通上面的示例代码,然后换几种不同材质的物体做被测面(硬板、布料、纸箱、泡沫),记录每种材质下数值的稳定性——感受材质影响到底有多明显。
  2. 故意以 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

📄 来源 / 自校链接

本文为公开资料整理,非亲测。关键参数与代码请结合实物与下列官方来源验证。

需要展厅软硬件方案或定制开发?