ESP32 arduino实现LD2402感知数据采集
·
UART2(GPIO17-TX、GPIO18-RX),适配 LD2402 出厂正常工作模式(无目标输出OFF、有目标输出distance:XX),实现1 秒固定定时读取数据,过滤无效空数据后通过 USB 串口格式化打印,程序采用非阻塞millis()实现定时,不占用 CPU 资源,通信稳定无丢包。

一、核心配置说明
- 串口引脚:UART2 TX=GPIO17、RX=GPIO18(与你测试一致,无需改接线);
- 波特率:LD2402 默认115200(按你补充要求修改,适配出厂固件);
- 定时规则:严格 1 秒读取 1 次,避免数据刷屏,非阻塞实现不影响后续扩展;
- 数据格式:完全匹配 LD2402 出厂正常模式(
OFF/distance:XX)。
二、硬件接线(与之前完全一致,无需改动)
保持 UART2 交叉接线、3.3V 供电、共地,直接复用测试后的接线即可:
|
HLK-LD2402 引脚 |
ESP32S3 引脚 |
接线说明 |
|
VCC |
3.3V |
严格 3.3V,禁止 5V(避免烧模块) |
|
GND |
GND |
必须共地,否则串口通信异常 |
|
TX |
GPIO18 |
LD2402 TX → ESP32S3 UART2 RX |
|
RX |
GPIO17 |
LD2402 RX → ESP32S3 UART2 TX |
|
EN |
悬空 / 3.3V |
悬空即可正常工作 |
三、完整可运行程序
UART2 测试程序配置完全兼容:
/*
ESP32S3 UART2 读取LD2402(出厂正常模式)
功能:1秒定时读取数据,USB串口格式化打印
配置:UART2(TX=17/RX=18),波特率115200(LD2402默认)
数据格式:无目标→OFF | 有目标→distance:XX(cm)
定时方式:非阻塞millis(),1秒固定读取一次
*/
#include <Arduino.h>
// 串口配置
#define UART2_TX 17 // ESP32 TX → LD2402 RX
#define UART2_RX 18 // ESP32 RX ← LD2402 TX
#define LD2402_BAUD 115200 // ✅ LD2402
#define USB_BAUD 115200
// 非阻塞定时
unsigned long lastRead = 0;
#define READ_INTERVAL 300 // 300ms读一次,足够灵敏
void setup() {
Serial.begin(USB_BAUD);
delay(100);
// 初始化 UART2
Serial2.begin(LD2402_BAUD, SERIAL_8N1, UART2_RX, UART2_TX);
Serial.println("===== LD2402 启动 =====");
Serial.println("接线:ESP32-TX17 → LD2402-RX");
Serial.println(" ESP32-RX18 ← LD2402-TX");
}
void loop() {
if (millis() - lastRead >= READ_INTERVAL) {
lastRead = millis();
readLD2402();
}
}
// 正确读取 LD2402 文本模式数据
void readLD2402() {
if (!Serial2.available()) return;
String data = Serial2.readStringUntil('\n');
data.trim();
Serial.print("原始数据:"); Serial.println(data);
if (data == "OFF") {
Serial.println("状态:无目标 🚫");
}
else if (data.startsWith("distance:")) {
// 提取距离
float dis = data.substring(9).toFloat();
Serial.print("✅ 检测到目标!距离:");
Serial.print(dis);
Serial.println(" cm");
}
Serial.println("---------------------------");
}
四、程序核心特性
- 严格 1 秒定时:采用
millis()非阻塞定时,替代delay(),定时期间 CPU 可处理其他逻辑,方便后续扩展(如联动 WS2812、HC-SR501); - 只取最新数据:读取前先清空 UART2 接收缓冲区,避免旧数据堆积,确保每次读取的是 LD2402 最新的检测结果;
- 数据过滤:自动去除无效字符、过滤空数据,避免解析异常,提升程序稳定性;
- 格式化打印:附带读取时间戳(程序运行秒数)、原始数据、解析结果,直观易读,方便调试;
- 量程验证:针对 LD2402 0-800cm 有效测距范围,过滤无效距离值,避免误显示;
- 无额外库依赖:基于 ESP32 Arduino 原生硬件串口,无需安装
SoftwareSerial,与你测试的 UART2 程序完全兼容。
五、编译与测试步骤
- 保持硬件接线不变,确保 LD2402 3.3V 供电、GND 共地、TX/RX 交叉接 GPIO18/17;
- 打开 Arduino IDE,复制上述程序,选择开发板「ESP32S3 Dev Module」和对应 USB 串口;
- 点击「编译 / 上传」,无编译错误(已适配 UART2 硬件特性);
- 打开 Arduino 串口监视器,配置参数必须严格匹配:
-
- 波特率:115200
- 换行符:勾选「自动换行」(无需勾选「显示行尾」);
- 测试效果:串口监视器每 1 秒刷新一次 LD2402 检测结果,无目标显示
OFF,有目标显示具体距离。
六、串口监视器显示效果示例
===== LD2402 启动 =====
接线:ESP32-TX17 → LD2402-RX
ESP32-RX18 ← LD2402-TX
原始数据:distance:102
---------------------------
原始数据:distance:100
✅ 检测到目标!距离:100.00 cm
---------------------------
原始数据:distance:91
✅ 检测到目标!距离:91.00 cm
---------------------------
原始数据:distance:91
✅ 检测到目标!距离:91.00 cm
---------------------------
原始数据:distance:88
✅ 检测到目标!距离:88.00 cm
--------------------------------------------------------
七、关键参数修改(按需调整)
若需修改读取间隔、波特率,直接修改宏定义即可,无需改动核心逻辑:
// 改为2秒读取一次
#define READ_INTERVAL 2000
// 若LD2402波特率被修改,可在此调整(出厂默认115200,不建议改)
#define LD2402_BAUD 9600
八、常见问题排查(基于 UART2 已测试正常)
若程序运行后无数据 / 数据异常,按以下优先级排查(UART2 硬件已验证,问题多在模块 / 接线):
- LD2402 供电是否为 3.3V:接 5V 会烧毁模块,无任何数据输出,这是最常见问题;
- 是否为出厂正常模式:若模块被刷写过自定义固件,输出格式会改变,需恢复出厂固件;
- 缓冲区是否为空:若打印「无有效数据」,检查 LD2402 是否正常工作(通电后指示灯是否闪烁);
- 接线是否松动:重点检查 GPIO18(UART2 RX)与 LD2402 TX 的连接,虚接会导致无数据;
- 波特率是否匹配:确保程序中
LD2402_BAUD=115200,与 LD2402 出厂默认一致。
更多推荐
所有评论(0)