6 分钟阅读

前言

之前硬件初恋的时候,买了一个感觉很厉害的人体存在传感器模块,而且很便宜,但是发现这东西,想要改阈值的话,还要上位机来调试、于是去问了售后。我说,我现在手上有一块ESP32,能不能用来做上位机来调整?它说,不行呢亲,一定要买上位机的呢。

于是我被气红温了,和deepseek交流了一个下午,用ESP32手搓了一个上位机。这就是这篇文章的前世故事(bushi)。

下简称HLK-LD2402-24G-人体传感器模块为 HLK

一、整体思路

先说结论:ESP32 完全可以胜任 HLK 的上位机角色

整体架构

HLK 人体存在模块  <--GPIO-->  ESP32  --> USB串口 -->  PC

ESP32 作为上位机处理数据的写入和读取:

  1. 接收并回传模块数据:一端接 HLK 模块,一端接电脑。GPIO端口可以双向传输数据,包括状态信息、参数回读结果等

  2. 作为串口监视:USB串口连接电脑控制台,回传信息。电脑仅作为状态读取,用来实时监控数据状态。


因此,目前也有局限。

  • 现有版本的逻辑只能提前设置好参数,烧录后按流程运行,没有健壮的错误处理设计,也不能实时控制。

  • 最理想的情况是“上位机”,可以实时监控目前状态(包括门限、目前距离等实时数据),并且可以在电脑端更改门限


二、硬件连接

1️⃣ 所需硬件

  • ESP32 开发板(我用的是常见的 ESP32-CH340C)
  • HLK 人体存在传感器模块
  • 若干杜邦线(硬在哪)

2️⃣ 接线说明

UART 通信 为例:

HLK 模块 ESP32
TX GPIO16 (RX2)
RX GPIO17 (TX2)
GND GND
VCC 5V / 3.3V(视模块型号)

都使用学长馈赠的电源模块进行供电。


注意,这里有一点踩坑提醒:TX和RX不是对应关系,是数据流的关系,所以RX端口要连接HLK的TX口,TX端口要连接HLK的RX口。

TX 和 RX 的含义

  • TX(Transmit):发送端

    👉 表示 “这个引脚负责把数据发出去”

  • RX(Receive):接收端

    👉 表示 “这个引脚负责接收外部发来的数据”


三、HLK 模块的串口通信

在正式写代码前,必须搞清楚 HLK 模块的通信方式。


通信参数来自官方文档。配置命令必须进入配置模式才生效。

1、基本协议握手

参数
波特率 115200
数据位 8
校验 None
停止位 1
电平 TTL 3.3V

与ESP32对应

Serial2.begin(115200, SERIAL_8N1, RX_PIN, TX_PIN);

2、核心协议通信部分

字段 说明
帧头 固定 FD FC FB FA
长度 仅帧内数据长度,不含头尾
小端 所有多字节数值都是小端
帧尾 固定 04 03 02 01

一条完整的命令帧为:

FD FC FB FA | 长度(2字节) | 帧内数据 | 04 03 02 01

  • 长度 = 帧内数据的字节数

  • 帧内数据 = 命令字(2字节) + 命令值(N字节)

    具体命令字可以查阅原始资料

3、ACK 返回帧结构

一条完整的命令帧为:

FD FC FB FA | 长度(2字节) | 命令字 | ACK | 04 03 02 01

其中,ACK 状态:

  • 0x0000 → 成功
  • 0x0001 → 失败

如果是特殊操作(如读取sn号等),具体返回帧结构会发生改变,具体参阅参数资料。

4、门限参数的计算

门限参数本质是能量(功率),模块内部用的是:

\[M = 10^{N \over 10}\]

其中,N是分贝

注意!这里的分贝是回波能量的量化单位,和距离没有直接换算公式,需要凭借经验和尝试,距离只是影响回波强度的一个因素

回波能量 = 人体反射 × 距离衰减 × 姿态 × 环境

影响因素包括但不限于:

  • 人体姿势
  • 人体移动幅度
  • 环境反射
  • 环境材质
  • 距离

所以可以使用自动门限生成(但是我没有写这个代码哈哈哈哈)(默默记下,说不定会填坑…)

5、举例

一个完整设置最大距离 5m的命令

计算步骤

  • 5.0 m → 50(大约)

  • 50 → 0x00000032

  • 小端 → 32 00 00 00

完整命令帧(逐字节)

FD FC FB FA        // 帧头
08 00              // 长度 = 8
07 00              // 命令字:写参数
01 00              // 参数ID:最大距离
32 00 00 00        // 参数值:5.0m
04 03 02 01        // 帧尾

收到完整回复帧:

FD FC FB FA        // 帧头
04 00              // 长度 = 4
07 00              // 命令字:写参数(与请求一致)
00 00              // 状态码:成功
04 03 02 01        // 帧尾

至此,串口通信和门限配置大概完成

四、ESP32 程序设计

1、串口初始化

void setup() {
  Serial.begin(115200);      // PC 串口
  Serial2.begin(115200);     // HLK 模块
}

2、串口桥接逻辑

核心思路非常简单:

  • ESP32 → HLK
  • HLK → ESP32 → PC
void loop() {
  // PC 发给 HLK
  while (Serial.available()) {
    Serial2.write(Serial.read());
  }

  // HLK 返回给 PC
  while (Serial2.available()) {
    Serial.write(Serial2.read());
  }
}

五、参数配置与调试

我是用的比较传统的办法,多次尝试不同门限,写入再测试。所以会很繁琐。如果可以自动门限生成,就会方便很多。

但是,这也并不是这个项目的本质目的。我只是一方面想怼回客服,另一方面来学习串口通信的相关理论信息。


六、效果与总结

最终效果:

  • 无需官方上位机
  • ✅ ESP32 即插即用

从结果来看,这个 HLK 模块并没有任何“不可替代”的上位机逻辑,本质就是串口协议封装。

所谓“必须买官方上位机”,更多是商业策略,而不是技术限制。哈哈哈没招了吧()。

当然了,说句公道话,上位机是更完美的选项,在大型工程是必不可少的。

这个毛坯房在基本程度上还原了基本的串口通信,但是不会是成熟方案。


七、结语

如果你也被“必须买官方工具”这件事恶心过,希望这篇文章能给你一点参考。

能用串口解决的问题,就别急着掏钱。

锦的美图

留下评论