24GHz 毫米波传感器 - 人体静态存在检测模块 Lite (MR24HPC1)

介绍
24GHz 毫米波传感器 - 人体静态存在检测模块 Lite 是一款集成天线、对健康友好的毫米波雷达传感器,采用 FMCW 测距技术,工作频率为 24GHz,用于实现人体静态存在检测,不受环境影响。这也是一款个性化雷达,用户可以配置其底层参数来确定检测功能。
应用
- 自动户外照明
- 自动开门
- 全屋监控
- 智能家电(电视、浴霸、安防等)
- 办公节能(空调、照明)
- 睡眠监测曲线
- 家庭安防
- IPC 触发
特性
- 人体存在毫米波雷达:采用 FMCW 测距技术,工作频率为 24GHz,检测范围 5 米,用于检测感应区域内的人体行为
- 个性化雷达检测:提供可配置的检测范围、运动触发、状态变化时间,以及可视化调试软件,满足各种场景需求
- 对健康友好的工作状态:输出功率低至对人体无害
- 高抗干扰能力:输出数据不受温度、湿度、噪音、气流、灰尘、光线等环境影响
- 支持 Arduino
硬件概述

- 5V 引脚是雷达的电源接口,RX 和 TX 是雷达的数据传输接口。RX 表示串行接收,TX 表示串行发送。
- 人体存在状态输出接口。您可以使用这两个引脚的电平来判断当前环境中的人体运动状态。 S1 输出:高电平 - 有人,低电平 - 无人。 S2 输出:高电平 - 活动,低电平 - 静止。
- 刷写固件引脚。
- 顶部输入/输出引脚。
入门指南
固件版本更新
毫米波传感器经过了长期的技术沉淀和用户提供的宝贵建议,我们一直在对原产品进行迭代,以提供更准确可靠的监测结果和更好的用户体验。
新出货的传感器默认搭载最新固件,以确保最新的产品体验。但是,为了老用户的体验,我们在此提供最新固件和更新方法,确保您能够使用我们的最新技术。
通用方法 - 使用 J-link 烧录固件
如果您遇到固件错误或雷达异常、固件故障等问题,使用此方法重新刷写固件是最有效的方法。
最新固件下载
固件版本 | 下载地址 |
---|---|
Jlink_MR24HPC1-20230302.bin | 下载 |
-
请仔细检查您产品的功能,请不要与其他毫米波传感器混用刷写此固件,否则可能导致产品功能异常,后果需要您自行承担!
-
还请注意,不同的固件更新方式使用不同的固件内容,您下载的是通过 J-link 烧录的固件。
将您的雷达更新到最新版本
步骤 1. 您需要准备一个 Jlink 和 MR24HPC1 24GHz 毫米波传感器。
通过杜邦线将雷达和 Jlink 连接,如下图所示。

步骤 2. 下载必要的软件和固件。
文件 | 下载地址 |
---|---|
JlinkV644e.rar | 下载 |
Pack_Segger_AT32F4xx_v1.3.3.zip | 下载 |
步骤 3. 解压 JlinkV644e.rar 并打开其中的 JLink_Windows_V644e.exe 文件。
按照默认选项安装即可。安装完成后,启动 J-Flash V6.44e 软件。
步骤 4. 安装芯片包。
解压 Pack_Segger_AT32F4xx_v1.3.3.zip 并打开其中的 Segger_AT32F4xx_AddOn.exe。

如果在向 JFlash 添加内容时遇到如下图所示的错误,您可以按照以下说明解决问题。

解决方案:
-
解压文件并打开
-
将 JLinkDevices.xml 从 C:\Program Files\SEGGER\JLink_V794 复制到 C:\Users[用户]\AppData\Roaming\SEGGER
这样就解决了问题,我们可以使用 JFlash 或 JFlash Lite 软件进行刷写。
步骤 5. 创建新项目。


找到并选择 AT32F403ARGT7。


步骤 6. 将雷达固件(.bin 文件)拖放到此软件中,会弹出一个窗口,我们将使用其默认的起始地址 0x8000000。

步骤 7. 点击 Target -> Connect

连接成功时会显示 Connected successfully。

擦除固件:Target -> manual Programming -> Erase Chip

升级固件:Target -> manual Programming -> Program & Verify

此时,固件更新完成。
通过 UART 更新固件
考虑到 J-link 价格昂贵,对于绝大多数只需要更新雷达固件的用户来说,购买 J-link 过于奢侈,因此我们提供了通过 UART 的更新方法。
最新固件下载
固件版本 | 下载地址 |
---|---|
UART_MR24HPC1-20230302.bin | 下载 |
-
请仔细检查您产品的功能,请不要与其他毫米波传感器混用来刷写此固件,否则可能导致产品功能异常,后果需要您自行承担!
-
还请注意,不同的固件更新方式使用不同的固件内容,您下载的是通过 UART 烧录的固件。
-
在使用 UART 升级固件之前,请确保您的雷达固件版本至少是 G24VD1SYV001006 版本,否则可能会导致雷达失效,此时您必须使用 J-link 烧录固件才能使用!
您可以通过向雷达发送命令 0x53 0x59 0x02 0xA4 0x00 0x01 0x0F 0x62 0x54 0x43
来查询固件版本号信息。然后雷达报告的数据以字符串形式显示,您将看到类似下图所示的效果。
G24VD1SYV000009
是雷达报告的型号,其中 000009
是版本号。这意味着此传感器不支持 UART 升级。

将您的雷达更新到最新版本
步骤 1. 您需要准备一个 UART 转 USB 和 MR24HPC1 24GHz 毫米波传感器。
通过杜邦线将雷达和 UART 转 USB 连接,如下图所示。

步骤 2. 下载必要的软件和固件。
文件 | 下载地址 |
---|---|
PackageMake-v1.1.1.zip | 下载 |
步骤 3. 解压 PackageMake-v1.1.1.zip 包并打开其中的 PackageMake-v1.1.1.exe 文件。
将连接传感器的 UART 转 USB 连接到计算机,点击软件左上角的齿轮图案,选择端口号,将波特率设置为 115200,然后点击右下角确认。(如果找不到端口号,请检查连接,然后点击左下角的刷新按钮重试)

步骤 4. 连接传感器
按照上述方式完成串口设置后,点击右上角的第二个图标,如果端口选择正确,您将看到雷达的原始数据被打印出来。

步骤 5. 更新固件
左键点击右上角的最后一个图标,这将弹出一个选择固件的窗口。请选择您已下载的固件版本。

选择完成后,所选文件路径将出现在软件下方,请仔细检查所选固件版本和型号是否与您使用的传感器一致。

要升级固件,请双击软件左上角的最后一个图像,然后固件将开始下载到传感器。


等待进度条完成,固件更新即完成。
上位机的使用
通过 UART 转 USB 设备将雷达直接连接到计算机的 USB 端口。接线如下表所示。
![]() | |||
雷达传感器 | UART 转 USB | ||
5V | --> | 5V | |
GND | --> | GND | |
RX | --> | TX | |
TX | --> | RX |
除了上述提到的串口软件,您还可以直接使用专为雷达设计的上位机软件。
以下十个部分解释了软件各个部分的作用。

-
端口
选择雷达连接到计算机的端口。通常需要在选择之前点击刷新按钮刷新端口。选择后请点击打开按钮。
-
波特率
MR24HPC1雷达需要设置为115200的波特率。
-
运动能量
该值等同于动态值。该值的变化代表环境中的恒定运动噪声。当空间中没有人时运动能量较低,随着运动幅度和距离的增加,整体运动能量会变得更高。
-
退出能量
该值等同于静态值。该值的变化代表环境中的恒定静态噪声。当空间无人时退出能量较低,当空间中有静止的人时(胸部呼吸的轻微运动),整体退出能量会在较高值处波动。
-
距离
静止距离:存在轻微运动区域时环境与雷达之间的直线距离。当空间中某个位置有人静止时,实时输出与雷达的直线距离。 运动距离:环境中运动位置与雷达之间的直线距离。当空间中某个位置有人在运动时,实时输出该位置与雷达的直线距离。

-
图形设置
用于清楚地确定实时波形与阈值之间的关系。基于实时曲线变化,可以观察空间不同状态下底噪的变化,并基于底噪的变化可以设置人体存在的阈值,对静止状态的存在/不存在/活动进行简单判断。

-
查询
搜索当前参数设置。关于各个参数值的含义,由于篇幅原因请参考用户手册了解详情。
-
设置
设置各个参数的阈值。
-
状态显示
该窗口实时显示当前距离、速度和运动状态等值。
-
发送和回复
发送和接收的数据帧。
使用Arduino进行传感器开发
Arduino库概述
如果这是您第一次使用Arduino,我们强烈建议您参考Arduino入门指南。
本示例中使用的库代码可以通过点击下面的图标下载。
函数
在开始开发草图之前,让我们看看库的可用函数。
-
void recvRadarBytes()
—— 该函数根据传感器数据协议中的帧头和帧尾,通过UART收集传感器报告的数据帧。与showData()
函数配合使用,可以通过串口打印出收集的数据信息。-
输入参数: 无
-
返回值: 无
-
-
void showData()
—— 该函数用于通过串口一次性打印出传感器报告的完整数据帧,需要与recvRadarBytes()
函数配合使用。-
输入参数: 无
-
返回值: 无
-
-
void HumanStatic_func(bool bodysign /*=false*/)
—— 该函数负责解析传感器的数据帧,并输出人体存在状态的相关数据。-
输入参数:
bodysign
—— 该参数是控制是否输出人体运动参数的开关。如果为true,输出将包含大量人体征象参数数据,这可能会影响您查看数据的体验。默认情况下该参数为false,不显示身体征象参数信息。 -
返回值:
-
int radarStatus
—— 返回的值表示解析的数据帧属于哪个状态类别。具体类别可以在默认变量部分找到。 -
int bodysign_val
—— 返回的值表示人体运动参数的值。该值仅在参数bodysign=true
时有效。 -
int static_val
—— 该值等同于静态值。该值的变化代表环境中的恒定静态噪声。当空间无人时退出能量较低,当空间中有静止的人时(胸部呼吸的轻微运动),整体退出能量会在较高值处波动。该值仅在打开底层消息时有效。
-
-
-
int dynamic_val
—— 该值的变化代表环境中的恒定运动噪声。当空间中无人时运动能量较低,随着运动幅度和距离的增加,整体运动能量会变高。此值仅在开启底层消息时有效。-
int dis_static
—— 存在轻微移动区域时环境与传感器之间的直线距离。当空间中某个位置有人静止时,会实时输出与传感器的直线距离。此值仅在开启底层消息时有效。 -
int dis_move
—— 环境中移动位置与传感器之间的直线距离。当空间中某个位置有人在运动时,会实时输出该位置与传感器的直线距离。此值仅在开启底层消息时有效。 -
int speed
—— 该值表示移动物体的运动速度。该值仅供参考。此值仅在开启底层消息时有效。
-
-
void checkSetMode_func(const unsigned char* buff, int len, bool cyclic /*= false*/)
—— 该函数可用于向传感器发送数据帧。发送的数据帧和返回的数据帧都会通过串口打印出来。-
输入参数:
-
buff
—— 您想要发送给传感器的数据帧。 -
len
—— 您想要发送给传感器的数据帧长度。 -
cyclic
—— 循环发送开关。默认为 false,如果您希望循环发送此数据帧,可以设置为 true。
-
-
返回值: 无
-
-
void reset_func()
—— 该函数用于重置传感器。-
输入参数: 无
-
返回值: 无
-
默认变量
#define MESSAGE_HEAD1 0x53 //数据帧头1
#define MESSAGE_HEAD2 0x59 //数据帧头2
#define MESSAGE_END1 0x54 //数据帧结束1
#define MESSAGE_END2 0x43 //数据帧结束2
#define HUMANSTATUS 0x80 //人体存在信息
#define HUMANEXIST 0x01 //人体存在
#define HUMANMOVE 0x02 //人体运动信息
#define HUMANSIGN 0x03 //人体体征参数
#define HUMANDIRECT 0x0B //人体运动趋势
#define SOMEBODY 0x01 //有人移动
#define NOBODY 0x00 //无人
#define NONE 0x00
#define SOMEBODY_STOP 0x01 //有人静止
#define SOMEBODY_MOVE 0x02 //有人移动
#define CA_CLOSE 0x01 //有人接近
#define CA_AWAY 0x02 //有人远离
#define DETAILSTATUS 0x08 //人体状态底层参数
#define DETAILINFO 0x01 //人体运动状态详细数据
#define DETAILDIRECT 0x06 //人体运动趋势
#define DETAILSIGN 0x07 //人体体征参数
//返回状态,在arduino中使用
#define SOMEONE 0x01 //有人
#define NOONE 0x02 //无人
#define NOTHING 0x03 //无消息
#define SOMEONE_STOP 0x04 //有人静止
#define SOMEONE_MOVE 0x05 //有人移动
#define HUMANPARA 0x06 //人体体征参数
#define SOMEONE_CLOSE 0x07 //有人接近
#define SOMEONE_AWAY 0x08 //有人远离
#define DETAILMESSAGE 0x09 //人体状态底层参数
#define reset_frame_len 10 //重置数据帧长度
//重置数据帧
const unsigned char reset_frame[10] = {0x53, 0x59, 0x01, 0x02, 0x00, 0x01, 0x0F, 0xBF, 0x54, 0x43};
安装
步骤 1. 您需要安装 Arduino 软件。
步骤 2. 启动 Arduino 应用程序。

步骤 3. 选择您的开发板型号并将其添加到 Arduino IDE 中。
-
如果您想在后续教程中使用 Seeeduino V4.2,请参考此教程完成添加。
-
如果您想在后续教程中使用 Seeeduino XIAO,请参考此教程完成添加。
-
如果您想在后续教程中使用 XIAO RP2040,请参考此教程完成添加。
-
如果您想在后续教程中使用 XIAO nRF52840,请参考此教程完成添加。
-
如果您想在后续教程中使用 XIAO ESP32C3,请参考此教程完成添加。
对于 XIAO nRF52840,请选择 Seeed nRF52 mbed-enabled Boards,否则运行程序时可能会报错。

步骤 4. 安装 Arduino 代码库。
首先从 GitHub 获取代码库并下载到您的本地计算机。
由于您已经下载了 zip 库文件,请打开您的 Arduino IDE,点击 Sketch > Include Library > Add .ZIP Library。选择您刚刚下载的 zip 文件,如果库安装正确,您将在通知窗口中看到 Library added to your libraries。这意味着库已成功安装。

Arduino 示例
现在我们已经安装了库并了解了基本功能,让我们为 XIAO nRF52840 Sense 运行一些示例,看看它的表现如何。
所需材料
在完成以下示例之前,您需要准备以下材料。
![]() | ![]() | ![]() |
MR24HPC1 | Seeed XIAO BLE nRF52840 Sense | 2mm 到 2.54mm 间距排线 |
步骤 1. 通过主板将设备连接到计算机。接线图如下表所示。
![]() | |||
MR24HPC1 | 主板 | ||
5V | --> | 5V | |
GND | --> | GND | |
RX | --> | D6 | |
TX | --> | D7 |
步骤 2. 在 Arduino IDE 左上角的菜单栏中,选择 tool,选择您正在使用的开发板类型,并选择相应的串口。
如果您使用的是 MacOS,设备的串口名称通常以 /dev/cu.usbmodem xxx 开头,以设备名称结尾。如果您使用的是 Windows,设备的串口名称通常以 COM 开头,同样以设备名称结尾。

在此示例中,我们将演示传感器如何与我们的热门产品 XIAO nRF52840 Sense 配合工作。
演示 1:串口打印传感器输出的原始数据帧
此示例将指导您完成通过串口打印传感器报告的原始数据的过程。
以下示例程序位于库的 examples 文件夹中,名为 MR24HPCB1_rawdata_print。
#include "Arduino.h"
#include <humanstaticLite.h>
//#include <SoftwareSerial.h>
// 选择任意两个可以与SoftwareSerial一起用于RX和TX的引脚
//#define RX_Pin A2
//#define TX_Pin A3
//SoftwareSerial mySerial = SoftwareSerial(RX_Pin, TX_Pin);
// 我们将使用软件串口
//HumanStaticLite radar = HumanStaticLite(&mySerial);
// 也可以尝试硬件串口
HumanStaticLite radar = HumanStaticLite(&Serial1);
void setup() {
// 将您的设置代码放在这里,运行一次:
Serial.begin(115200);
Serial1.begin(115200);
// mySerial.begin(115200);
while(!Serial); //当串口打开时,程序开始执行。
Serial.println("Ready");
}
void loop() {
// 将您的主要代码放在这里,重复运行:
radar.recvRadarBytes(); //接收雷达数据并开始处理
radar.showData(); //串口打印一组接收到的数据帧
delay(200); //添加时间延迟以避免程序卡死
}
如果您使用的是 XIAO ESP32 系列,并且毫米波雷达没有数据反馈。您可以尝试将上面的代码从
Serial1.begin(115200);
改为 Serial1.begin(115200, SERIAL_8N1, D7, D6);
。
在这个程序中,我们使用 XIAO nRF52840 的硬件 Serial1 端口连接到传感器,并使用硬件 Serial 端口来输出数据,因此我们需要在初始化函数 Setup()
中单独初始化这个串口。
在主 loop()
函数中,我们使用 recvRadarBytes()
函数从传感器接收数据帧,然后使用 showData()
函数通过串口打印出接收到的数据帧。
在这个程序中,需要注意的是,每两个数据帧的接收和输出之间都有一个间隔,以避免主板出现阻塞。这个时间不应少于 150ms。
这意味着主板无法接收传感器报告的所有数据帧,但由于传感器报告的帧数非常大且频繁,这不会影响使用传感器判断环境的准确性。
上传程序。将串口监视器的波特率设置为 115200 应该会显示结果。输出应该类似于下图。

演示 2:解析人体存在信息的串口打印
在这个示例中,我们将使用库中的函数来解析接收到的数据帧,并通过串口打印出传感器主动报告的所有特征数据。
以下示例程序位于库的 examples 文件夹中,名为 MR24HPCB1_parsed_rawdata。
#include "Arduino.h"
#include <humanstaticLite.h>
//#include <SoftwareSerial.h>
// Choose any two pins that can be used with SoftwareSerial to RX & TX
//#define RX_Pin A2
//#define TX_Pin A3
//SoftwareSerial mySerial = SoftwareSerial(RX_Pin, TX_Pin);
// we'll be using software serial
//HumanStaticLite radar = HumanStaticLite(&mySerial);
// can also try hardware serial with
HumanStaticLite radar = HumanStaticLite(&Serial1);
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial1.begin(115200);
// mySerial.begin(115200);
while(!Serial); //When the serial port is opened, the program starts to execute.
Serial.println("Ready");
}
void loop() {
// put your main code here, to run repeatedly:
radar.HumanStatic_func(true); //Turn on printing of human movement sign parameters
if(radar.radarStatus != 0x00){
switch(radar.radarStatus){
Serial.println(radar.radarStatus);
case SOMEONE:
Serial.println("Someone is here.");
Serial.println("---------------------------------");
break;
case NOONE:
Serial.println("Nobody here.");
Serial.println("---------------------------------");
break;
case NOTHING:
Serial.println("No human activity messages.");
Serial.println("---------------------------------");
break;
case SOMEONE_STOP:
Serial.println("Someone stop");
Serial.println("---------------------------------");
break;
case SOMEONE_MOVE:
Serial.println("Someone moving");
Serial.println("---------------------------------");
break;
case HUMANPARA:
Serial.print("The parameters of human body signs are: ");
Serial.println(radar.bodysign_val, DEC);
Serial.println("---------------------------------");
break;
case SOMEONE_CLOSE:
Serial.println("Someone is closing");
Serial.println("---------------------------------");
break;
case SOMEONE_AWAY:
Serial.println("Someone is staying away");
Serial.println("---------------------------------");
break;
case DETAILMESSAGE:
Serial.print("Spatial static values: ");
Serial.println(radar.static_val);
Serial.print("Distance to stationary object: ");
Serial.print(radar.dis_static);
Serial.println(" m");
Serial.print("Spatial dynamic values: ");
Serial.println(radar.dynamic_val);
Serial.print("Distance from the movement object: ");
Serial.print(radar.dis_move);
Serial.println(" m");
Serial.print("Speed of moving object: ");
Serial.print(radar.speed);
Serial.println(" m/s");
Serial.println("---------------------------------");
break;
}
}
delay(200);
}
如果您使用的是 XIAO ESP32 系列,并且毫米波雷达没有数据反馈。您可以尝试将上面的代码从 Serial1.begin(115200);
改为 Serial1.begin(115200, SERIAL_8N1, D7, D6);
。
要实现数据解析功能,我们首先需要调用 HumanStatic_func()
函数。传入的参数可以是 true
或 false
,用于控制是否启用人体运动参数的显示。
如果您选择开启,即传入参数 true
,您可能会在串口获得以下消息。

人体运动参数:人体运动幅度值。当空间内无人时,人体运动参数为 0,当有人存在且静止时为 1-5,当身体运动时为 2-100(运动幅度越大,身体运动参数越接近)。 这意味着如果您觉得传感器识别的结果不符合您的预期,您可以通过自定义判断人体运动参数来输出人体存在的信息。
如果您想停止串口上人体运动参数的疯狂输出,请输入参数 false
,然后您就能在串口上看到干净的身体状态信息。

您可能在较长时间内看不到串口监视器上打印的内容,这可能是正常的。传感器内置的算法是这样的,只有当被监控对象的运动状态发生变化时才会输出信息。如果您在上传程序后一直保持静止,您可能希望起身走动并观察效果。
还有一种可能是您接收到的数据与上面两张图片中显示的信息不同。那么您可能已经打开了底层消息输出开关。

有关如何开启和关闭底层消息的更多信息,请参考 Demo 3 的相关部分。简而言之,打开底层消息意味着导出更详细的数据。
关于底层消息数据的含义,由于篇幅原因,请查阅本传感器的 功能 部分或用户手册。
Demo 3: 向传感器发送数据
MR24HPC1 提供了丰富的模式设置功能。本示例将以开关底层消息为例,说明如何发送数据帧的实现。
以下示例程序位于库的示例文件夹中,名为 MR24HPCB1_open_underlyingMes。
#include "Arduino.h"
#include <humanstaticLite.h>
//#include <SoftwareSerial.h>
// 选择任意两个可以与SoftwareSerial一起用于RX和TX的引脚
//#define RX_Pin A2
//#define TX_Pin A3
//SoftwareSerial mySerial = SoftwareSerial(RX_Pin, TX_Pin);
// 我们将使用软件串口
//HumanStaticLite radar = HumanStaticLite(&mySerial);
// 也可以尝试硬件串口
HumanStaticLite radar = HumanStaticLite(&Serial1);
const unsigned char close_buff[10] = {0x53, 0x59, 0x08, 0x00, 0x00, 0x01, 0x00, 0xB5, 0x54, 0x43}; //关闭开放底层消息
const unsigned char open_buff[10] = {0x53, 0x59, 0x08, 0x00, 0x00, 0x01, 0x01, 0xB6, 0x54, 0x43}; //开启开放底层消息
void setup() {
// 将您的设置代码放在这里,只运行一次:
Serial.begin(115200);
Serial1.begin(115200);
// mySerial.begin(115200);
while(!Serial); //当串口打开时,程序开始执行。
Serial.println("Ready");
}
void loop() {
// 将您的主要代码放在这里,重复运行:
radar.checkSetMode_func(open_buff, 10, false);
delay(50); //不要将延迟时间设置得太长,因为这可能会影响雷达返回的数据帧的接收。
}
如果您使用的是XIAO ESP32系列,并且毫米波雷达没有数据反馈。您可以尝试将上面的代码从Serial1.begin(115200);
更改为Serial1.begin(115200, SERIAL_8N1, D7, D6);
。
在向传感器发送数据之前,我们需要查阅用户手册,根据我们的需求获取要发送的完整数据帧,并在程序中定义一个数组来保存要发送的数据帧。
在这个示例中,我们根据用户手册创建了两个数据帧数组。它们的功能是开启或关闭开放底层消息功能。
c
const unsigned char close_buff[10] = {0x53, 0x59, 0x08, 0x00, 0x00, 0x01, 0x00, 0xB5, 0x54, 0x43}; //关闭开放底层消息
const unsigned char open_buff[10] = {0x53, 0x59, 0x08, 0x00, 0x00, 0x01, 0x01, 0xB6, 0x54, 0x43}; //开启开放底层消息
关于校验位"sum"的计算。
所有数据帧都有一个校验位,以确保数据的发送或接收准确无误。校验位通常位于数据帧的倒数第二位。它通过将校验位之前的所有位相加并取十六进制的低两位来计算。 让我们以查询设备ID的数据帧为例。

可以看到校验位位于整个数据帧的倒数第二位。然后我们开始将之前的所有十六进制数相加。
0x53 + 0x59 + 0x02 + 0xA2 + 0x00 + 0x01 + 0x0F = 0x0160
然后我们需要取它的低两位,即60,所以这个数据帧的校验和是60。如果我们想查询传感器的ID,那么你可以定义以下数组。
const unsigned char DevID_buff[10] = {0x53, 0x59, 0x02, 0xA1, 0x00, 0x01, 0x0F, 0x60, 0x54, 0x43};
然后我们通过调用checkSetMode_func()
函数来发送数据帧。传入的参数是数据帧数组、数组长度和一个表示是否循环发送的布尔值。
radar.checkSetMode_func(open_buff, 10, false);
上传程序。将串口监视器的波特率设置为 115200 应该会显示结果。输出应该类似于下面的图像。

此时请检查返回的数据帧,如果它们与用户手册中描述的返回数据帧匹配,则设置成功。
通常,我们的命令不需要重复发送给传感器,但由于传感器回复消息的速度非常快,我们无法确保能够接收到传感器返回的确切数据消息。这个问题有两种解决方案。
- 多次重新上传上述程序。
- 将
checkSetMode_func()
函数的第三个参数(循环发送)设置为true
。但是请注意,重复发送设置类型的数据帧可能会导致传感器卡死,因此请谨慎使用此功能。如果传感器卡死,请断开传感器的 5V 供电引脚,等待片刻后功能即可恢复。
演示 4:重置传感器
有时您可能遇到传感器检测异常的问题,或者想要清除传感器上的所有设置,那么您可以根据此示例重置传感器。
以下示例程序位于库的示例文件夹中,名为 MR24HPCB1_reset_radar。
#include "Arduino.h"
#include <humanstaticLite.h>
//#include <SoftwareSerial.h>
// 选择任意两个可以与SoftwareSerial一起用于RX和TX的引脚
//#define RX_Pin A2
//#define TX_Pin A3
//SoftwareSerial mySerial = SoftwareSerial(RX_Pin, TX_Pin);
// 我们将使用软件串口
//HumanStaticLite radar = HumanStaticLite(&mySerial);
// 也可以尝试硬件串口
HumanStaticLite radar = HumanStaticLite(&Serial1);
void setup() {
// 将您的设置代码放在这里,运行一次:
Serial.begin(115200);
Serial1.begin(115200);
// mySerial.begin(115200);
while(!Serial); //当串口打开时,程序开始执行。
Serial.println("Ready");
radar.reset_func();
}
void loop() {
// 将您的主要代码放在这里,重复运行:
}
如果您使用的是 XIAO ESP32 系列,并且毫米波雷达没有数据反馈。您可以尝试将上面的代码从 Serial1.begin(115200);
改为 Serial1.begin(115200, SERIAL_8N1, D7, D6);
。
重置传感器非常简单,您只需要调用 reset_func()
。重置只需要执行一次,所以我们在 Setup()
函数中使用它。
演示 5:使用 Arduino/Seeeduino
我们的库兼容 Arduino,您也可以选择手头的 Arduino 来开发您的传感器项目。
MR24HPC1 传感器使用 UART 串口通信,您只需要按照下面的接线将传感器连接到您的 Arduino。
MR24HPC1 | MCU | |
5V | --> | 5V |
GND | --> | GND |
RX | --> | 软串口 TX |
TX | --> | 软串口 RX |
所有功能的应用方式与上面的 演示 1
到 演示 4
相同,所以我们不会在这个例子中重复它们。在这个例子中,我们将为您概述如何使用 Arduino 的软串口从传感器获取数据信息。
有关 Arduino 软串口的说明,请参考 Arduino 官方文档。
为了避免使用 Serial 同时进行输出和数据传输造成的数据混乱,在 Arduino 端我们通常使用软串口。
软串口库的导入和 RX、TX 引脚的定义需要在程序的早期完成。以下程序将 A2 和 A3 引脚定义为软串口的 RX 和 TX 引脚。
#include <SoftwareSerial.h>
//选择任意两个可以与SoftwareSerial一起使用的引脚作为RX和TX
#define RX_Pin A2
#define TX_Pin A3
SoftwareSerial mySerial = SoftwareSerial(RX_Pin, TX_Pin);
//我们将使用软件串口
HumanStaticLite radar = HumanStaticLite(&mySerial);
另外,不要忘记在 Setup()
函数中设置软件串口的波特率。
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
mySerial.begin(115200);
while(!Serial); //When the serial port is opened, the program starts to execute.
Serial.println("Ready");
}
以演示1为例,如果您想使用Arduino打印来自传感器的上报数据帧,那么完整的程序如下所示。
#include "Arduino.h"
#include <humanstaticLite.h>
#include <SoftwareSerial.h>
// 选择任意两个可以与SoftwareSerial一起用于RX和TX的引脚
#define RX_Pin A2
#define TX_Pin A3
SoftwareSerial mySerial = SoftwareSerial(RX_Pin, TX_Pin);
// 我们将使用软件串口
HumanStaticLite radar = HumanStaticLite(&mySerial);
void setup() {
// 将您的设置代码放在这里,只运行一次:
Serial.begin(115200);
mySerial.begin(115200);
while(!Serial); //当串口打开时,程序开始执行。
Serial.println("Ready");
}
void loop() {
// 将您的主要代码放在这里,重复运行:
radar.recvRadarBytes(); //接收雷达数据并开始处理
radar.showData(); //串口打印一组接收到的数据帧
delay(200); //添加时间延迟以避免程序卡死
}
演示 6: 直接连接到 PC 获取数据
如果您想使用专为传感器设计的上位机,或者想使用串口软件获取完整的数据帧,可以参考此例程。
通过 UART 转 USB 设备将传感器直接连接到计算机的 USB 端口。接线如下表所示。
![]() | |||
雷达传感器 | UART 转 USB | ||
5V | --> | 5V | |
GND | --> | GND | |
RX | --> | TX | |
TX | --> | RX |
使用串口调试助手等软件选择传感器所在的串口。

MR24HPC1 传感器需要 5V 电源供电,否则传感器可能无法正常工作。
连接成功后,您将看到传感器发送稳定的消息流。

同时,您也可以通过软件的发送功能向传感器发送数据帧。

演示 7: MR24HPBC1 & XIAO ESP32C3 & ESPHome & Home Assistant
我们为这款雷达和 XIAO ESP32C3 创建了连接到 ESPHome 和 Home Assistant 的教程,如果您感兴趣,可以参考这里的教程。
演示 8: 在 XIAO ESP32C3 中使用传感器
由于 XIAO ESP32C3 硬件串口的特殊设计,为了使用 UART 与传感器发送和接收数据消息,您需要使用以下代码。
#include "Arduino.h"
#include <humanstaticLite.h>
#include <HardwareSerial.h>
//HardwareSerial MySerial(0); // 如果您想使用 D6 和 D7 作为串口引脚,请取消注释此行并注释下面的行。
HardwareSerial MySerial(1); // 创建一个新的 HardwareSerial 类
// 也可以尝试硬件串口
HumanStaticLite radar = HumanStaticLite(&MySerial);
void setup() {
// 将您的设置代码放在这里,只运行一次:
Serial.begin(115200);
/*
* 4, 5 表示 GPIO4 和 GPIO5,对应引脚 D2 和 D3。
* 如果您想直接使用 XIAO ESP32C3 的硬件 UART 引脚,可以将 4, 5 更改为 -1, -1。
* MySerial.begin(115200, SERIAL_8N1, -1, -1);
*
* 除此之外,您还可以使用 D9 (GPIO9) 和 D10 (GPIO10) 引脚作为串口。
* MySerial1.begin(115200, SERIAL_8N1, 9, 10);
*/
MySerial.begin(115200, SERIAL_8N1, 4, 5);
while(!Serial); //当串口打开时,程序开始执行。
delay(500);
Serial.println("Ready");
}
void loop() {
// 将您的主要代码放在这里,重复运行:
radar.recvRadarBytes(); //接收雷达数据并开始处理
radar.showData(); //串口打印一组接收到的数据帧
delay(200); //添加时间延迟以避免程序卡死
}
故障排除
常见问题 1:此传感器能否在同一环境中同时检测多个人?
答:不可以。此传感器只能用于单个生物体。如果监测范围内有多个人或动物,这将对监测结果产生影响。
常见问题 2:为什么我在 XIAO ESP32C3 的串口监视器中看不到任何内容?
XIAO ESP32C3 串口功能与一般 Arduino 硬件不太一致,直接使用 Serial1 可能会导致 USB 串口无法工作。相关应用案例,请前往 XIAO ESP32C3 的串口章节 了解详情。
常见问题 3:是否可以使用其他芯片代替 XIAO ESP32-C3 来使用该库?
是的,确实可以使用其他芯片代替 XIAO ESP32-C3 来使用该库。只需确保连接正确的 RX/TX 引脚或两个 GPIO 引脚,并将波特率设置为 115200
。
确认使用哪种方法,软件或硬件,例如如果您有一个只有一个串口的 Arduino Uno R3
,您可以按如下方式实现:
#include "Arduino.h"
#include <humanstaticLite.h>
#include <SoftwareSerial.h>
// 选择任意两个可以与 SoftwareSerial 一起用于 RX 和 TX 的引脚
#define RX_Pin A2
#define TX_Pin A3
SoftwareSerial mySerial = SoftwareSerial(RX_Pin, TX_Pin);
// 我们将使用软件串口
HumanStaticLite radar = HumanStaticLite(&mySerial);
void setup() {
// 将您的设置代码放在这里,只运行一次:
Serial.begin(115200);
mySerial.begin(115200);
}
void loop() {
// 您的代码在这里
}
资源
技术支持与产品讨论
感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。