* 预期实验现象描述(建议配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()

封装独立测距函数,解耦代码,方便重复调用,返回浮点型距离数据

  1. digitalWrite(TRIG_PIN, LOW);delayMicroseconds(2);:先拉低电平、延时2微秒,稳定引脚电平,消除电路抖动

  2. digitalWrite(TRIG_PIN, HIGH);delayMicroseconds(10);:输出10us高电平脉冲,HC-SR04硬性要求,必须≥10us才能发射超声波

  3. digitalWrite(TRIG_PIN, LOW);:关闭触发信号,超声波发射完成

  4. pulseIn():检测ECHO引脚高电平时长,超时30ms,无回波直接返回0,防止程序卡死

  5. 异常判定:读取时间为0,代表无障碍物、超出测距量程,返回999.0作为异常标记

  6. 距离公式: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内部搭载发射、接收两个探头,利用声波反射原理测距:

  1. ESP32-S3给TRIG发送10us高电平,模块发射40kHz超声波(人耳不可闻)

  2. 超声波向前传播,碰到障碍物反射回弹

  3. 接收探头捕捉回波,拉高ECHO引脚电平

  4. ECHO高电平持续时间 = 声波往返总耗时

5.2 计算公式推导

  • 常温音速:340m/s = 0.034 cm/μs

  • 总路程 = 声波时长 × 音速

  • 真实距离 = 往返路程 ÷ 2(声波出去+返程)

最终公式:距离(cm) = 脉冲时长 × 0.034 ÷ 2

5.3 传感器量程

  • 有效测距:2cm ~ 400cm

  • 小于2cm:硬件盲区,数据错乱

  • 大于400cm:声波衰减,接收不到回波,返回999

六、常见报错&踩坑解决

❌问题1:串口一直打印999.0
  1. 超声波VCC接3.3V:修改接入5V供电

  2. TRIG、ECHO接线颠倒、杜邦线松动

  3. 缺少GND共地,电路不连通

  4. 障碍物超出4米测距范围

❌问题2:测距数值疯狂跳动
  1. 被测物体为海绵、布料,吸收声波,更换硬质挡板

  2. 电磁干扰:电机、灯带和超声波分开供电

  3. 测距延时太短,缩短间隔声波干扰

❌问题3:串口全是乱码

代码波特率115200,Arduino串口监视器右下角波特率不匹配,改成一致即可

七、拓展进阶方向

  1. 搭配0.96寸OLED屏幕,离线显示距离,脱离电脑串口

  2. 外接蜂鸣器,近距离自动报警,制作避障报警器

  3. 搭载小车,实现自动避障智能小车

  4. 多次采样取平均值,优化测距精度,消除抖动

八、总结

本篇基于ESP32-S3实现HC-SR04超声波测距,从硬件接线、代码逐行拆解、函数用法、物理原理全方位讲解,全部代码实测可跑,非常适合嵌入式、单片机零基础入门。超声波核心逻辑:10us触发发波→检测回波时长→音速换算距离,只要把控供电、共地、时序三点,即可解决99%测距异常问题。

✨后续持续更新ESP32外设教程:OLED显示屏、舵机、红外传感、WiFi数据上传

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐