【ESP32】打造全网最强esp-idf基础教程——9.HC-SR04超声波传感器实验

HC-SR04超声波传感器实验

       一眨眼明天又周一了,虽然今天什么都没干,但还是辛苦我了,至少来发博客了。。

一、HC-SR04介绍
       HC-SR04超声波测距模块是依据超声波遇到障碍物发生反射的原理进行测距的。HC-SR04能够产生发射超声波信号,接收并且处理超声波,最后输出一段和发送与接收间隔时间相同的高电平信号,是物联网实验中常用的测距模块之一。
       HC-SR04有4个引脚功能如下:

管脚

定义

功能

VCC

电源

3.3-5V

Trig

触发

输入触发脉冲

Echo

回响

测距完毕,会产生回响电平

GND

       工作时序如下,通过Trig引脚,触发一个10us左右电平,然后模块内部自动会发出8个40KHz的超声波,我们的程序就监控回响引脚Echo,Echo会返回一段高电平持续时间,这个就是超声波从发射到返回的时间。

       那么我们假设获取到的时间是T,声波在空气中传播速度大概是v=340m/s,我们可以计算单向距离D=T*v/2。

二、控制程序
       在了解完HC-SR04的工作原理后,回到我们实验程序,程序最关键的地方在于获取Echo的电平时间,换句话说,

<think>嗯,用户想用ESP32连接HC-SR04传感器测量距离,并在LCD1602上显示结果。首先,我需要回顾一下HC-SR04的工作原理。这个模块通过Trig引脚发送超声波,Echo引脚接收反射回来的信号,根据高电平持续时间计算距离。ESP32的GPIO25和GPIO33分别对应Trig和Echo,对吧?接下来要考虑如何连接这两个引脚,以及是否需要上拉或下拉电阻。根据之前的引用资料,HC-SR04需要5V供电,但Echo输出是5V电平,ESP32的GPIO是3.3V,可能需要分压电路,避免损坏ESP32。不过有些资料提到可以直接连接,可能需要确认这一点。 然后是代码部分。需要使用ESP32的GPIO控制Trig输出一个10μs的高电平脉冲,然后通过Echo引脚检测高电平持续时间。这里可能需要使用输入捕获或者简单的GPIO读取加计时器。考虑到精度,使用微秒级计时比较合适。代码中需要初始化GPIO,设置Trig为输出,Echo为输入。接着,触发Trig,等待Echo变高,记录时间,然后等待Echo变低,计算时间差。距离计算是时间差乘以声速(343米/秒)的一半,因为声音是来回的。 接下来是LCD1602的连接。LCD1602通常使用I2C接口,这样只需要四根线(VCC、GND、SDA、SCL)。ESP32的I2C引脚一般是GPIO21和GPIO22,但用户可能想自定义,需要确认。代码中需要包含LiquidCrystal_I2C库,初始化LCD,然后定期更新显示测量的距离。需要注意的是,如果用户使用的是非I2C的LCD,接线和代码会不同,但问题中提到了LCD1602,通常默认I2C模块。 需要处理可能的错误情况,比如传感器未检测到障碍物,返回超时的情况。另外,代码中需要处理浮点数运算,将距离转换为厘米,保留两位小数。同时,避免频繁触发传感器,每次测量后适当延时,比如100毫秒。 用户提供的引用中有关于HC-SR04与STM32、树莓派的连接,但这里需要针对ESP32的特定GPIO进行调整。确保Trig和Echo引脚设置正确,并正确初始化。同时,引用中提到的测距范围是3cm到4m,因此在代码中可能需要加入超出范围的提示。 最后,整合所有部分:初始化传感器和LCD,循环中触发测量,计算距离,显示在LCD上。示例代码需要包含必要的库,引脚定义,以及循环逻辑。可能还需要处理I2C地址的问题,通常LCD1602的I2C地址是0x27或0x3F,用户可能需要根据实际情况修改。 检查代码是否符合ESP-IDF或Arduino框架的语法,用户的问题中没有明确,但示例代码可能更倾向于Arduino,因为更常见。需要确认使用的开发环境,但用户可能使用Arduino IDE,所以代码基于Arduino编写。 总结步骤:硬件连接(Trig、Echo、VCC、GND,I2C引脚),代码结构(初始化、测距函数、显示函数),注意事项(电压匹配、延时、错误处理)。确保代码中的注释清晰,用户能够理解每个部分的作用。可能还需要测试代码是否存在逻辑错误,比如时间计算是否正确,LCD显示是否刷新正常。</think>以下是基于ESP32连接HC-SR04超声波传感器和LCD1602显示屏的完整教程与示例代码: --- ### 一、硬件连接 | HC-SR04 | ESP32 | LCD1602 (I2C模块) | ESP32 | |---------|-------------|-------------------|-------------| | VCC | 5V引脚 | VCC | 3.3V/5V | | Trig | GPIO25 | SDA | GPIO21 | | Echo | GPIO33 | SCL | GPIO22 | | GND | GND | GND | GND | **注意**: 1. HC-SR04的Echo引脚输出为5V电平,需通过分压电路(如1kΩ+2kΩ电阻分压)转换为3.3V后再连接ESP33引脚[^3][^4] 2. LCD1602建议选择带I2C转接板的版本以简化接线 --- ### 二、Arduino示例代码 ```cpp #include <Wire.h> #include <LiquidCrystal_I2C.h> // 硬件定义 #define TRIG_PIN 25 #define ECHO_PIN 33 LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C地址可能为0x3F void setup() { pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); lcd.init(); lcd.backlight(); lcd.print("Distance:"); } float measureDistance() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); long duration = pulseIn(ECHO_PIN, HIGH); return duration * 0.0343 / 2; // 声速343m/s=0.0343cm/μs } void loop() { float distance = measureDistance(); lcd.setCursor(0, 1); if (distance >= 400 || distance <= 2) { lcd.print("Out of range "); } else { lcd.print(distance); lcd.print(" cm "); } delay(200); } ``` --- ### 三、关键实现说明 1. **测距原理**:通过Trig引脚发送10μs高电平脉冲,测量Echo引脚高电平持续时间,根据公式$d = (t \times v)/2$计算距离(v=343m/s)[^4] 2. **误差处理**:当测量值>400cm或<2cm时显示超量程提示 3. **LCD刷新**:每秒更新5次测量结果(delay(200)控制) 4. **I2C地址确认**:使用I2C扫描工具确认LCD的I2C地址(常见0x27或0x3F) --- ### 四、常见问题解决 1. **无显示**:检查I2C地址是否匹配,调整对比度电位器 2. **测距不稳定**:增加软件滤波(如连续采样3次取中值) 3. **Echo信号异常**:确保分压电路正确,避免5V直接输入ESP32 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值