第 5 讲 · 超声波测距、滤波与数码管显示

飞行时间法

HC-SR04 的基本时序是:

  1. Arduino 向 Trig 发送至少 10 μs10\ \mu\mathrm{s} 高电平;
  2. 模块发射超声波;
  3. Echo 输出的高电平宽度对应往返时间 TT;
  4. 用 d=vT/2d=vT/2 计算单程距离。

若 pulseIn 返回微秒,且声速近似为 340 m/s340\ \mathrm{m/s},则

dcm≈Tμs58.8.d_{\mathrm{cm}}\approx\frac{T_{\mu\mathrm{s}}}{58.8}.

源报告的实验代码用了 delay(10) 产生 Trig 高电平,单位是毫秒,远大于要求的 10 μs10\ \mu\mathrm{s}。它可能仍能触发,但更准确的写法是 delayMicroseconds(10)。

误差从哪里来

  • 声速:温度改变时,把 vv 固定为 340 m/s340\ \mathrm{m/s} 会引入系统误差;
  • 几何与材质:倾斜、柔软或表面不平的物体可能不把声波反射回探头;
  • 盲区与衰减:过近时余震干扰,过远时回波弱;
  • 时间量化:定时分辨率、函数延迟和单位换算都会进入结果。

源报告记录显示,在 5 cm、20 cm、50 cm 和 80 cm 设置点都有多次测量,并对比平均数与中位数,这比只保留一次读数更能说明稳定性。

滑动窗口滤波

对最近 NN 个样本 x1,…,xNx_1,\ldots,x_N,均值滤波为

xˉ=1N∑i=1Nxi.\bar x=\frac1N\sum_{i=1}^{N}x_i.

中位数滤波则先排序,取中间元素。窗口越大,输出通常越稳,但对真实距离变化的响应也越慢,所以滤波不是“越强越好”。

显示一个数字实际在做什么

七段数码管用 aa 到 gg 七条线段组成数字,外加小数点 dp。代码需要:

  1. 把待显示数值拆成各位;
  2. 查表得到每个数字应点亮的段;
  3. 按硬件是共阴还是共阳输出正确电平;
  4. 为每条 LED 回路限流。

源报告遇到数码管部分段不亮,定位到面包板上电阻密集导致短路或接触不良。“只在公共端串一个电阻”虽能让所有段亮起来,但不能保证每段电流一致;更可靠的修复是给各段单独限流并重新整理连线。

评论