超声波测距
* 预期实验现象描述(建议配GIF动图)
* 核心知识点回顾
ESP32-S3 HC-SR04超声波测距【超详细入门|代码逐行解析|原理精讲】
📌博客简介:零基础手把手实现ESP32-S3超声波测距,包含硬件接线、完整可运行代码、逐行代码释义、底层测距原理、串口、延时、自定义函数全部知识点、踩坑排错,适配Arduino框架,新手直接复刻,无冗余难度。
🔖标签:#ESP32-S3 #HC-SR04 #超声波测距 #嵌入式入门 #Arduino #单片机
一、实验准备
1.1 硬件器材
-
主控:乐鑫 ESP32-S3 开发板
-
传感器:HC-SR04 超声波测距模块
-
辅料:杜邦线若干、USB数据线
-
开发环境:Arduino IDE
1.2 硬件接线(重中之重,报错90%都是接线问题)
HC-SR04一共4个引脚,接线规则固定,VCC严禁接3.3V,否则测距失效、数据乱跳
|
超声波模块引脚 |
ESP32-S3引脚 |
作用说明 |
|---|---|---|
|
VCC |
5V |
模块供电,必须5V供电 |
|
GND |
GND |
共地,通信稳定核心 |
|
TRIG |
GPIO9 |
触发引脚,单片机输出信号 |
|
ECHO |
GPIO8 |
回波引脚,接收反射信号 |
⚠️注意:单片机和传感器必须共地,GND必须相连,缺少地线会出现测距乱跳、一直显示999异常数值
二、完整工程代码(直接复制编译)
// 定义超声波引脚
const uint8_t TRIG_PIN = 9;
const uint8_t ECHO_PIN = 8;
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
// 获取距离,单位cm
float getUltrasonicDis() {
// 发送10us高电平触发信号
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// 读取ECHO高电平持续时间,超时30000微秒(最大4米左右)
long pulseTime = pulseIn(ECHO_PIN, HIGH, 30000);
if (pulseTime == 0) {
return 999.0; // 超出量程/无回波
}
// 测距计算公式
float distance = pulseTime * 0.034 / 2;
return distance;
}
void loop() {
float dis = getUltrasonicDis();
Serial.print("当前距离:");
Serial.print(dis, 2); // 保留2位小数
Serial.println(" cm");
// 简单避障判断示例
if (dis < 20 && dis != 999) {
Serial.println("⚠️ 前方障碍物过近!");
}
delay(300); // 300ms测一次,避免声波干扰
}
三、代码逐行超详细解析
3.1 引脚定义部分
const uint8_t TRIG_PIN = 9;
const uint8_t ECHO_PIN = 8;
-
const:定义常量,程序运行中引脚编号不可修改,防止程序出错 -
uint8_t:8位无符号整型,单片机引脚编号专用数据类型,节省内存 -
TRIG:超声波发射触发脚;ECHO:超声波回波接收脚
3.2 初始化setup函数
setup函数上电只执行一次,专门做硬件初始化
-
Serial.begin(115200):开启串口通信,波特率115200,实现开发板和电脑通信,打印测距数据;串口监视器波特率必须一致,否则乱码 -
pinMode(TRIG_PIN, OUTPUT):设置触发引脚为输出模式,单片机向外输出电平 -
pinMode(ECHO_PIN, INPUT):设置回波引脚为输入模式,读取传感器反馈电平
3.3 自定义测距函数 getUltrasonicDis()
封装独立测距函数,解耦代码,方便重复调用,返回浮点型距离数据
-
digitalWrite(TRIG_PIN, LOW);delayMicroseconds(2);:先拉低电平、延时2微秒,稳定引脚电平,消除电路抖动 -
digitalWrite(TRIG_PIN, HIGH);delayMicroseconds(10);:输出10us高电平脉冲,HC-SR04硬性要求,必须≥10us才能发射超声波 -
digitalWrite(TRIG_PIN, LOW);:关闭触发信号,超声波发射完成 -
pulseIn():检测ECHO引脚高电平时长,超时30ms,无回波直接返回0,防止程序卡死 -
异常判定:读取时间为0,代表无障碍物、超出测距量程,返回999.0作为异常标记
-
距离公式:
pulseTime * 0.034 / 2,换算厘米距离
3.4 主循环loop函数
程序初始化完成后无限循环,周期性测距
-
float dis = getUltrasonicDis();:调用测距函数,接收返回距离 -
Serial.print():串口打印,不自动换行;Serial.println():打印后自动换行 -
避障判断:排除999异常值,防止远距离误报警
-
delay(300):间隔300ms测距,避免声波残留干扰,提升精度
四、核心函数专项讲解
4.1 delayMicroseconds() 微秒延时
作用:高精度阻塞延时,单位微秒(μs),1ms = 1000μs
-
delay():毫秒延时,用于慢速延时;delayMicroseconds:微秒延时,用于传感器精准时序
-
超声波必须使用微秒延时!如果使用delay(1),脉冲时长1000us,直接导致模块工作异常
4.2 Serial 串口通信
单片机调试最常用工具,实现开发板→电脑打印数据
-
Serial.begin(波特率):初始化串口,仅可放置在setup
-
Serial.print():打印不换行,拼接文字+数字
-
Serial.println():打印自动换行,排版整洁
4.3 自定义函数 getUltrasonicDis()
-
无传入参数,直接调用:
getUltrasonicDis() -
返回浮点小数:正常返回2~400cm;异常固定返回999.0
-
优势:代码模块化,逻辑清晰,后续拓展OLED、蜂鸣器直接复用
五、超声波底层测距原理(通俗版)
5.1 工作逻辑
HC-SR04内部搭载发射、接收两个探头,利用声波反射原理测距:
-
ESP32-S3给TRIG发送10us高电平,模块发射40kHz超声波(人耳不可闻)
-
超声波向前传播,碰到障碍物反射回弹
-
接收探头捕捉回波,拉高ECHO引脚电平
-
ECHO高电平持续时间 = 声波往返总耗时
5.2 计算公式推导
-
常温音速:340m/s = 0.034 cm/μs
-
总路程 = 声波时长 × 音速
-
真实距离 = 往返路程 ÷ 2(声波出去+返程)
最终公式:距离(cm) = 脉冲时长 × 0.034 ÷ 2
5.3 传感器量程
-
有效测距:2cm ~ 400cm
-
小于2cm:硬件盲区,数据错乱
-
大于400cm:声波衰减,接收不到回波,返回999
六、常见报错&踩坑解决
❌问题1:串口一直打印999.0
-
超声波VCC接3.3V:修改接入5V供电
-
TRIG、ECHO接线颠倒、杜邦线松动
-
缺少GND共地,电路不连通
-
障碍物超出4米测距范围
❌问题2:测距数值疯狂跳动
-
被测物体为海绵、布料,吸收声波,更换硬质挡板
-
电磁干扰:电机、灯带和超声波分开供电
-
测距延时太短,缩短间隔声波干扰
❌问题3:串口全是乱码
代码波特率115200,Arduino串口监视器右下角波特率不匹配,改成一致即可
七、拓展进阶方向
-
搭配0.96寸OLED屏幕,离线显示距离,脱离电脑串口
-
外接蜂鸣器,近距离自动报警,制作避障报警器
-
搭载小车,实现自动避障智能小车
-
多次采样取平均值,优化测距精度,消除抖动
八、总结
本篇基于ESP32-S3实现HC-SR04超声波测距,从硬件接线、代码逐行拆解、函数用法、物理原理全方位讲解,全部代码实测可跑,非常适合嵌入式、单片机零基础入门。超声波核心逻辑:10us触发发波→检测回波时长→音速换算距离,只要把控供电、共地、时序三点,即可解决99%测距异常问题。
✨后续持续更新ESP32外设教程:OLED显示屏、舵机、红外传感、WiFi数据上传
更多推荐
所有评论(0)