深夜提醒

现在是深夜,建议您注意休息,不要熬夜哦~

🏮 🏮 🏮

新年快乐

祝君万事如意心想事成!

share-image
ESC

ESP32 连接 HC-SR04 超声波测距模块

最近想把家里吃灰的 ESP32 利用起来,顺手接了一个 HC-SR04 超声波测距模块,用来做一些简单的距离检测。整个过程比想象中顺利,记录一下接线、代码和踩过的一个小坑。

HC-SR04 模块简介

HC-SR04 是最常见的超声波测距模块之一,价格几块钱,测距范围约 2cm ~ 400cm,精度在 0.3cm 左右,足够做液位检测、障碍物报警、人体靠近感应这类项目。

模块上有四个引脚:

引脚 说明
VCC 电源正极,建议接 5V
GND 电源负极
Trig 触发脚,发送 10μs 高电平脉冲启动测量
Echo 回波脚,输出高电平持续时间即为声波往返时间

HC-SR04 模块实物

接线方式

我这块 ESP32 开发板已经刷了 MicroPython,USB 连接电脑后识别为 /dev/ttyUSB0。HC-SR04 与 ESP32 的接线如下:

HC-SR04 ESP32
VCC 5V
GND GND
Trig GPIO5
Echo GPIO4

ESP32 接线实物

这里有个小坑:我原来的 main.py 把 GPIO4 用作蓝牙状态灯输出,和 Echo 冲突了。于是把蓝牙状态灯改到了 GPIO15,腾出了 GPIO4 给 HC-SR04。

MicroPython 代码

把下面的 hcsr04.py 保存到 ESP32 文件系统中:

from machine import Pin
import time

TRIG_PIN = 5
ECHO_PIN = 4
MAX_ECHO_US = 30000
SOUND_SPEED_CM_PER_US = 0.0343


def measure_single(trig_pin=TRIG_PIN, echo_pin=ECHO_PIN):
trig = Pin(trig_pin, Pin.OUT)
echo = Pin(echo_pin, Pin.IN)

trig.value(0)
time.sleep_us(2)
trig.value(1)
time.sleep_us(10)
trig.value(0)

start_wait = time.ticks_us()
while echo.value() == 0:
if time.ticks_diff(time.ticks_us(), start_wait) > MAX_ECHO_US:
return -1

start = time.ticks_us()
while echo.value() == 1:
if time.ticks_diff(time.ticks_us(), start) > MAX_ECHO_US:
return -1

duration = time.ticks_diff(time.ticks_us(), start)
return duration * SOUND_SPEED_CM_PER_US / 2


def measure(samples=5, trig_pin=TRIG_PIN, echo_pin=ECHO_PIN):
values = []
for _ in range(samples):
d = measure_single(trig_pin, echo_pin)
if d >= 0:
values.append(d)
time.sleep_ms(10)

if not values:
return -1

values.sort()
n = len(values)
if n % 2 == 1:
return values[n // 2]
return (values[n // 2 - 1] + values[n // 2]) / 2

核心逻辑很直白:

  1. 先把 Trig 拉低 2μs 稳定,再拉高 10μs,最后拉低,触发模块发射超声波。
  2. 等待 Echo 变高,记录起始时间。
  3. 等待 Echo 变低,计算高电平持续时间。
  4. 距离 = 时间 × 声速 / 2,除以 2 是因为声波走了一个往返。

measure() 默认采样 5 次取中值,可以过滤掉偶尔的毛刺,让读数更稳定。

运行效果

main.py 里加一个循环任务,每 500ms 打印一次距离:

import hcsr04

while True:
distance = hcsr04.measure()
print('Distance: {:.1f} cm'.format(distance))
time.sleep_ms(500)

用串口工具连接 ESP32:

picocom /dev/ttyUSB0 -b 115200

就能看到连续的距离输出:

串口输出 Distance: 73.5 cm

几点注意事项

  • 供电:HC-SR04 用 3.3V 有时也能工作,但 Echo 回波幅度可能不够,建议 VCC 接 5V。
  • 测距盲区:模块正前方 2cm 以内通常测不准,安装时留出一点距离。
  • 反射面:对软质、不规则或倾斜表面反射效果差,测液位、墙面效果最好。
  • 并发任务:如果主程序里还有蓝牙、WiFi 等异步任务,记得把测距也写成协程,避免阻塞事件循环。

后续可以做什么

  • 把距离数据通过 MQTT 上报到 Home Assistant,做一个水位监测器。
  • 设定阈值,距离小于某值时驱动蜂鸣器或 LED 报警。
  • 结合舵机做简单的雷达扫描小车。

HC-SR04 虽然便宜,但可玩性很高,适合作为 ESP32 入门物联网的第一个传感器项目。

文章作者:阿文
文章链接: https://www.awen.me/post/d96bddf9.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿文的博客

评论

0 条评论
😀😃😄 😁😅😂 🤣😊😇 🙂🙃😉 😌😍🥰 😘😗😙 😚😋😛 😝😜🤪 🤨🧐🤓 😎🥸🤩 🥳😏😒 😞😔😟 😕🙁☹️ 😣😖😫 😩🥺😢 😭😤😠 😡🤬🤯 😳🥵🥶 😱😨😰 😥😓🤗 🤔🤭🤫 🤥😶😐 😑😬🙄 😯😦😧 😮😲🥱 😴🤤😪 😵🤐🥴 🤢🤮🤧 😷🤒🤕 🤑🤠😈 👿👹👺 🤡💩👻 💀☠️👽 👾🤖🎃 😺😸😹 😻😼😽 🙀😿😾 👍👎👏 🙌👐🤲 🤝🤜🤛 ✌️🤞🤟 🤘👌🤏 👈👉👆 👇☝️ 🤚🖐️🖖 👋🤙💪 🦾🖕✍️ 🙏💅🤳 💯💢💥 💫💦💨 🕳️💣💬 👁️‍🗨️🗨️🗯️ 💭💤❤️ 🧡💛💚 💙💜🖤 🤍🤎💔 ❣️💕💞 💓💗💖 💘💝💟 ☮️✝️☪️ 🕉️☸️✡️ 🔯🕎☯️ ☦️🛐 🆔⚛️🉑 ☢️☣️📴 📳🈶🈚 🈸🈺🈷️ ✴️🆚💮 🉐㊙️㊗️ 🈴🈵🈹 🈲🅰️🅱️ 🆎🆑🅾️ 🆘 🛑📛 🚫💯💢 ♨️🚷🚯 🚳🚱🔞 📵🚭 ‼️⁉️🔅 🔆〽️⚠️ 🚸🔱⚜️ 🔰♻️ 🈯💹❇️ ✳️🌐 💠Ⓜ️🌀 💤🏧🚾 🅿️🈳 🈂🛂🛃 🛄🛅🛗 🚀🛸🚁 🚉🚆🚅 ✈️🛫🛬 🛩️💺🛰️
加载中...

留言反馈

😀😃😄 😁😅😂 🤣😊😇 🙂🙃😉 😌😍🥰 😘😗😙 😚😋😛 😝😜🤪 🤨🧐🤓 😎🥸🤩 🥳😏😒 😞😔😟 😕🙁☹️ 😣😖😫 😩🥺😢 😭😤😠 😡🤬🤯 😳🥵🥶 😱😨😰 😥😓🤗 🤔🤭🤫 🤥😶😐 😑😬🙄 😯😦😧 😮😲🥱 😴🤤😪 😵🤐🥴 🤢🤮🤧 😷🤒🤕 🤑🤠😈 👿👹👺 🤡💩👻 💀☠️👽 👾🤖🎃 😺😸😹 😻😼😽 🙀😿😾 👍👎👏 🙌👐🤲 🤝🤜🤛 ✌️🤞🤟 🤘👌🤏 👈👉👆 👇☝️ 🤚🖐️🖖 👋🤙💪 🦾🖕✍️ 🙏💅🤳 💯💢💥 💫💦💨 🕳️💣💬 👁️‍🗨️🗨️🗯️ 💭💤❤️ 🧡💛💚 💙💜🖤 🤍🤎💔 ❣️💕💞 💓💗💖 💘💝💟 ☮️✝️☪️ 🕉️☸️✡️ 🔯🕎☯️ ☦️🛐 🆔⚛️🉑 ☢️☣️📴 📳🈶🈚 🈸🈺🈷️ ✴️🆚💮 🉐㊙️㊗️ 🈴🈵🈹 🈲🅰️🅱️ 🆎🆑🅾️ 🆘 🛑📛 🚫💯💢 ♨️🚷🚯 🚳🚱🔞 📵🚭 ‼️⁉️🔅 🔆〽️⚠️ 🚸🔱⚜️ 🔰♻️ 🈯💹❇️ ✳️🌐 💠Ⓜ️🌀 💤🏧🚾 🅿️🈳 🈂🛂🛃 🛄🛅🛗 🚀🛸🚁 🚉🚆🚅 ✈️🛫🛬 🛩️💺🛰️