最近想把家里吃灰的 ESP32 利用起来,顺手接了一个 HC-SR04 超声波测距模块,用来做一些简单的距离检测。整个过程比想象中顺利,记录一下接线、代码和踩过的一个小坑。
HC-SR04 模块简介
HC-SR04 是最常见的超声波测距模块之一,价格几块钱,测距范围约 2cm ~ 400cm,精度在 0.3cm 左右,足够做液位检测、障碍物报警、人体靠近感应这类项目。
模块上有四个引脚:
| 引脚 | 说明 |
|---|---|
| VCC | 电源正极,建议接 5V |
| GND | 电源负极 |
| Trig | 触发脚,发送 10μs 高电平脉冲启动测量 |
| Echo | 回波脚,输出高电平持续时间即为声波往返时间 |

接线方式
我这块 ESP32 开发板已经刷了 MicroPython,USB 连接电脑后识别为 /dev/ttyUSB0。HC-SR04 与 ESP32 的接线如下:
| HC-SR04 | ESP32 |
|---|---|
| VCC | 5V |
| GND | GND |
| Trig | GPIO5 |
| Echo | GPIO4 |

这里有个小坑:我原来的 main.py 把 GPIO4 用作蓝牙状态灯输出,和 Echo 冲突了。于是把蓝牙状态灯改到了 GPIO15,腾出了 GPIO4 给 HC-SR04。
MicroPython 代码
把下面的 hcsr04.py 保存到 ESP32 文件系统中:
|
核心逻辑很直白:
- 先把 Trig 拉低 2μs 稳定,再拉高 10μs,最后拉低,触发模块发射超声波。
- 等待 Echo 变高,记录起始时间。
- 等待 Echo 变低,计算高电平持续时间。
- 距离 = 时间 × 声速 / 2,除以 2 是因为声波走了一个往返。
measure() 默认采样 5 次取中值,可以过滤掉偶尔的毛刺,让读数更稳定。
运行效果
在 main.py 里加一个循环任务,每 500ms 打印一次距离:
|
用串口工具连接 ESP32:
|
就能看到连续的距离输出:

几点注意事项
- 供电:HC-SR04 用 3.3V 有时也能工作,但 Echo 回波幅度可能不够,建议 VCC 接 5V。
- 测距盲区:模块正前方 2cm 以内通常测不准,安装时留出一点距离。
- 反射面:对软质、不规则或倾斜表面反射效果差,测液位、墙面效果最好。
- 并发任务:如果主程序里还有蓝牙、WiFi 等异步任务,记得把测距也写成协程,避免阻塞事件循环。
后续可以做什么
- 把距离数据通过 MQTT 上报到 Home Assistant,做一个水位监测器。
- 设定阈值,距离小于某值时驱动蜂鸣器或 LED 报警。
- 结合舵机做简单的雷达扫描小车。
HC-SR04 虽然便宜,但可玩性很高,适合作为 ESP32 入门物联网的第一个传感器项目。
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿文的博客!
评论
0 条评论