30浏览
查看: 30|回复: 0

[入门教程] DFRobot C4002 毫米波人体存在传感器接口协议整理

[复制链接]
本帖最后由 神一样的老师 于 2026-5-23 09:50 编辑

1. 模块简介


DFRobot C4002 是一款基于 24GHz FMCW 技术的毫米波雷达模块,面向智能家居中的人体存在检测场景。相比传统 PIR 传感器,它不仅能检测运动人体,还能检测静止或微动人体,并支持运动距离、速度、方向、环境光等数据输出。


典型能力如下:


项目参数
工作电压DC 3.6V ~ 5.5V
检测对象运动人体、静止/微动人体
最大检测距离运动约 11m,静止/微动约 10m
探测角度120° x 120°
通信接口UART、OUT 电平输出
工作频率24GHz ~ 24.25GHz
光照检测0 ~ 50 lux
工作温度-20℃ ~ 85℃



该模块适合用于:


  • 智能灯光人体存在检测
  • 房间无人节能控制
  • Home Assistant 智能家居接入
  • 静态人体存在感知
  • 非接触式运动方向/速度检测



2. 引脚说明


C4002 模块提供 5 个主要引脚:


引脚功能
VIN电源输入,DC 3.6V ~ 5.5V
GND电源地
RX传感器串口接收端
TX传感器串口发送端
OUT可配置电平输出



UART 接线时要交叉连接:


C4002主控
RXTX
TXRX
VIN5V 或符合范围的电源
GNDGND



官方示例默认串口波特率为 115200


3. 接口协议整理


C4002 同时支持两类接口:


  • OUT 电平接口:用于快速判断是否检测到目标,适合直接驱动 IO 判断。
  • UART 串口协议:用于读取完整检测数据,例如目标状态、距离、能量、速度、方向、光照、距离门配置等。



3.1 OUT 输出模式


OUT 引脚的输出逻辑可以通过串口配置,主要有 3 种模式:


模式含义
eOutpinMode1仅检测到运动目标时输出高电平
eOutpinMode2仅检测到存在/静止目标时输出高电平
eOutpinMode3检测到运动或存在目标时输出高电平



如果只需要“有人/无人”判断,建议使用 eOutpinMode3


3.2 UART 数据帧格式


从 DFRobot Arduino 库可以看出,C4002 串口帧格式如下:


字段长度说明
帧头4 字节固定为 FA F5 AA A5
帧长度2 字节小端格式,表示整帧长度
保留位1 字节固定为 00
帧类型1 字节请求、响应或通知
数据区N 字节命令字、状态码、数据长度、数据内容
校验和2 字节小端格式,前面所有字节累加和



帧长度计算方式:


  1. frame_len = data_len + 10
复制代码



其中 data_len 是数据区长度,额外 10 字节包括:


  1. 4 字节帧头 + 2 字节长度 + 1 字节保留位 + 1 字节帧类型 + 2 字节校验
复制代码



3.3 帧类型


帧类型说明
写请求0x00主控向模块写入配置
读请求0x01主控读取模块配置或数据
写响应0x02模块对写请求的响应
读响应0x03模块对读请求的响应
通知帧0x04模块主动上报检测结果或校准状态



3.4 数据区格式


数据区一般由以下字段组成:


字段长度说明
CMD1 字节命令字
RESP1 字节请求时通常为 0x00,响应时为状态码
DATA_LEN2 字节数据区内部长度,小端格式
DATAN 字节命令参数或返回数据



响应码常见含义如下:


响应码含义
0x01成功
0x02命令不存在
0x03校验或认证错误
0x04资源忙
0x05参数错误
0x06数据长度异常
0x07内部错误



4. 常用命令字整理


命令功能
CMD_CONFIG_OUT_MODE0xA0设置 OUT 输出模式
CMD_SET_LED_MODE0xA1设置运行 LED / 输出 LED
CMD_ENVIRNMENT_CALIBRATION0x60启动环境底噪校准
CMD_SET_DETECT_RANGE0x86设置检测距离范围
CMD_SET_REPORT_PERIOD0x83设置上报周期
CMD_SET_LIGHT_THRESHOLD0x88设置环境光阈值
CMD_SET_DISTANCE_DOOR0x62配置距离门使能
CMD_SET_DISTANCE_DOOR_THRESHOLD0x63设置距离门阈值
CMD_GET_AND_SET_RESOLUTION_MODE0x66获取/设置距离分辨率
CMD_SET_BAUDRATE0x21设置串口波特率
CMD_TARGET_DISAPPEAR_DELAY_TIME0x84设置目标消失延时
CMD_LOCK_TIME0x85设置锁定时间
CMD_THRESHOLD_GROUP0x87设置灵敏度分组
CMD_FACTORY_RESET0x80恢复出厂设置
CMD_GET_VERSION0x82获取版本信息



5. Arduino 编程方法


官方提供了 DFRobot_C4002 库,推荐直接使用库进行开发,而不是手写底层 UART 帧。


5.1 安装库


有两种方式:


  • 在 Arduino IDE 的库管理器中搜索 DFRobot_C4002 安装;
  • 从 GitHub/Gitee 下载库文件,放入 Arduino 的 libraries 目录。



5.2 创建传感器对象


UNO / ESP8266 使用软串口:


  1. #include "DFRobot_C4002.h"
  2. SoftwareSerial mySerial(4, 5);   // RX, TX
  3. DFRobot_C4002 c4002(&mySerial, 115200);
复制代码



ESP32 使用硬串口:


  1. #include "DFRobot_C4002.h"
  2. DFRobot_C4002 c4002(&Serial1, 115200, D2, D3);
复制代码



Leonardo、Mega2560 等带 Serial1 的主控:


  1. #include "DFRobot_C4002.h"
  2. DFRobot_C4002 c4002(&Serial1, 115200);
复制代码



5.3 初始化模块


  1. void setup() {
  2.   Serial.begin(115200);
  3.   while (c4002.begin() != true) {
  4.     Serial.println("C4002 begin failed!");
  5.     delay(1000);
  6.   }
  7.   Serial.println("C4002 begin success!");
  8. }
复制代码



如果初始化失败,优先检查:


  • TX/RX 是否接反;
  • 模块供电是否正常;
  • 波特率是否为 115200
  • 主控串口引脚是否正确。



6. 常用配置方法


6.1 设置 LED 状态


  1. c4002.setRunLedState(eLedOff);
  2. c4002.setOutLedState(eLedOff);
复制代码



可选参数:


  1. eLedOff
  2. eLedOn
复制代码



6.2 设置距离分辨率


  1. c4002.setResolutionMode(eResolution80Cm);
复制代码



支持两种模式:


模式距离门分辨率距离门数量最大范围
eResolution80Cm80cm15 个约 11.6m
eResolution20Cm20cm25 个约 4.9m



如果需要较远检测范围,使用 80cm 模式;如果需要更细距离划分,使用 20cm 模式。


6.3 设置检测范围


  1. uint16_t closest = 0;
  2. uint16_t farthest = 1100;
  3. c4002.setDetectRange(closest, farthest);
复制代码



单位为 cm,范围为 0 ~ 1100cm


例如只检测 1m 到 4m:


  1. c4002.setDetectRange(100, 400);
复制代码



6.4 设置环境光阈值


  1. c4002.setLightThresh(0);
复制代码



参数范围为 0 ~ 50 lux


  • 设置为 0:不受环境光限制,始终进行目标检测;
  • 设置为非 0:只有光照低于阈值时才触发目标检测。



这个功能适合智能灯场景,例如只在光线较暗且有人时开灯。


6.5 设置上报周期


  1. c4002.setReportPeriod(10);
复制代码



单位为 0.1s


参数实际周期
10.1s
101s
505s



6.6 设置目标消失延时


  1. c4002.setTargetDisappearDelay(1);
复制代码



单位为秒,范围为 0 ~ 65535s


该参数用于避免人体短暂丢失时立即判定无人。智能灯应用中可以设置为 10~60 秒。


6.7 配置距离门


  1. uint8_t gateState[15] = {
  2.   C4002_ENABLE, C4002_ENABLE, C4002_ENABLE, C4002_ENABLE, C4002_ENABLE,
  3.   C4002_ENABLE, C4002_ENABLE, C4002_ENABLE, C4002_ENABLE, C4002_ENABLE,
  4.   C4002_ENABLE, C4002_ENABLE, C4002_ENABLE, C4002_ENABLE, C4002_ENABLE
  5. };
  6. c4002.configureGate(eMotionDistGate, gateState);
  7. c4002.configureGate(ePresenceDistGate, gateState);
复制代码



距离门类型:


类型说明
eMotionDistGate运动目标距离门
ePresenceDistGate静止/存在目标距离门



距离门数组中的值:


  1. C4002_ENABLE   // 使能
  2. C4002_DISABLE  // 禁用
复制代码



7. 读取检测结果


C4002 会通过通知帧上报检测结果。使用库时,只需要调用:


  1. sRetResult_t retResult = c4002.getNoteInfo();
复制代码



noteType == eResult 时,表示收到检测结果。


7.1 读取目标状态


  1. eTargetState_t targetState = c4002.getTargetState();
  2. if (targetState == eNoTarget) {
  3.   Serial.println("No Target");
  4. } else if (targetState == ePresence) {
  5.   Serial.println("Static Presence");
  6. } else if (targetState == eMotion) {
  7.   Serial.println("Motion");
  8. }
复制代码



目标状态:


状态含义
eNoTarget无目标
ePresence检测到静止/微动目标
eMotion检测到运动目标



7.2 读取环境光


  1. float light = c4002.getLightIntensity();
  2. Serial.print("Light: ");
  3. Serial.print(light);
  4. Serial.println(" lux");
复制代码



7.3 读取静止/存在目标信息


  1. sPresenceTarget_t presenceTarget = c4002.getPresenceTargetInfo();
  2. Serial.print("Presence distance: ");
  3. Serial.print(presenceTarget.distance);
  4. Serial.println(" m");
  5. Serial.print("Presence energy: ");
  6. Serial.println(presenceTarget.energy);
复制代码



返回数据:


字段含义
distance目标距离,单位 m
energy目标能量,范围 0~99



7.4 读取运动目标信息


  1. sMotionTarget_t motionTarget = c4002.getMotionTargetInfo();
  2. Serial.print("Motion distance: ");
  3. Serial.print(motionTarget.distance);
  4. Serial.println(" m");
  5. Serial.print("Motion speed: ");
  6. Serial.print(motionTarget.speed);
  7. Serial.println(" m/s");
  8. Serial.print("Motion energy: ");
  9. Serial.println(motionTarget.energy);
  10. Serial.print("Motion direction: ");
  11. if (motionTarget.direction == eAway) {
  12.   Serial.println("Away");
  13. } else if (motionTarget.direction == eApproaching) {
  14.   Serial.println("Approaching");
  15. } else {
  16.   Serial.println("No Direction");
  17. }
复制代码



运动方向:


枚举含义
eAway远离
eNoDirection无方向
eApproaching靠近



8. 完整示例:读取所有检测结果


  1. #include "DFRobot_C4002.h"
  2. #if defined(ESP8266) || defined(ARDUINO_AVR_UNO)
  3. SoftwareSerial mySerial(4, 5);
  4. DFRobot_C4002 c4002(&mySerial, 115200);
  5. #elif defined(ESP32)
  6. DFRobot_C4002 c4002(&Serial1, 115200, D2, D3);
  7. #else
  8. DFRobot_C4002 c4002(&Serial1, 115200);
  9. #endif
  10. void setup() {
  11.   Serial.begin(115200);
  12.   while (c4002.begin() != true) {
  13.     Serial.println("C4002 begin failed!");
  14.     delay(1000);
  15.   }
  16.   Serial.println("C4002 begin success!");
  17.   c4002.setRunLedState(eLedOff);
  18.   c4002.setOutLedState(eLedOff);
  19.   c4002.setResolutionMode(eResolution80Cm);
  20.   c4002.setDetectRange(0, 1100);
  21.   c4002.setLightThresh(0);
  22.   c4002.setTargetDisappearDelay(1);
  23.   c4002.setReportPeriod(10);
  24. }
  25. void loop() {
  26.   sRetResult_t retResult = c4002.getNoteInfo();
  27.   if (retResult.noteType == eResult) {
  28.     Serial.println("------- C4002 Result -------");
  29.     float light = c4002.getLightIntensity();
  30.     Serial.print("Light: ");
  31.     Serial.print(light);
  32.     Serial.println(" lux");
  33.     eTargetState_t state = c4002.getTargetState();
  34.     Serial.print("Target state: ");
  35.     if (state == eNoTarget) {
  36.       Serial.println("No Target");
  37.     } else if (state == ePresence) {
  38.       Serial.println("Static Presence");
  39.     } else if (state == eMotion) {
  40.       Serial.println("Motion");
  41.     }
  42.     sPresenceTarget_t presence = c4002.getPresenceTargetInfo();
  43.     Serial.print("Presence distance: ");
  44.     Serial.print(presence.distance);
  45.     Serial.println(" m");
  46.     Serial.print("Presence energy: ");
  47.     Serial.println(presence.energy);
  48.     sMotionTarget_t motion = c4002.getMotionTargetInfo();
  49.     Serial.print("Motion distance: ");
  50.     Serial.print(motion.distance);
  51.     Serial.println(" m");
  52.     Serial.print("Motion speed: ");
  53.     Serial.print(motion.speed);
  54.     Serial.println(" m/s");
  55.     Serial.print("Motion energy: ");
  56.     Serial.println(motion.energy);
  57.     Serial.print("Motion direction: ");
  58.     if (motion.direction == eAway) {
  59.       Serial.println("Away");
  60.     } else if (motion.direction == eApproaching) {
  61.       Serial.println("Approaching");
  62.     } else {
  63.       Serial.println("No Direction");
  64.     }
  65.     Serial.println("----------------------------");
  66.   }
  67.   delay(50);
  68. }
复制代码



9. 环境底噪校准


C4002 支持环境底噪采集,用于过滤窗帘、空调、绿植等环境干扰。


官方示例流程:


  • 上传环境校准程序;
  • 程序启动后 10 秒内离开检测区域;
  • 等待约 30 秒完成底噪采集;
  • 通过串口查看运动/存在距离门阈值。



启动校准:


  1. c4002.startEnvCalibration(10, 30);
复制代码



含义:


参数说明
10延迟 10 秒后开始校准
30校准持续 30 秒



读取校准状态:


  1. sRetResult_t retResult = c4002.getNoteInfo();
  2. if (retResult.noteType == eCalibration) {
  3.   Serial.print("Calibration countdown: ");
  4.   Serial.print(retResult.calibCountdown);
  5.   Serial.println(" s");
  6. }
复制代码



如果环境底噪阈值过高,需要检查附近是否存在持续运动或强干扰源。官方 FAQ 中提到,阈值高于 50 时环境可能存在较大干扰,达到 99 时可能导致传感器异常输出。


10. 开发建议


10.1 智能灯场景


推荐配置:


  1. c4002.setOutPinMode(eOutpinMode3);
  2. c4002.setTargetDisappearDelay(30);
  3. c4002.setLightThresh(20);
复制代码



含义:


  • 运动或静止人体都认为“有人”;
  • 人离开后延时 30 秒再判定无人;
  • 环境光低于 20 lux 时才触发。



10.2 小空间检测


例如卫生间、书房等空间,可以缩小检测距离:


  1. c4002.setDetectRange(0, 300);
复制代码



这样可以减少墙外、门外人员造成的误触发。


10.3 大空间检测


客厅等空间可以使用最大检测距离:


  1. c4002.setResolutionMode(eResolution80Cm);
  2. c4002.setDetectRange(0, 1100);
复制代码



11. 总结


C4002 的使用可以分成两个层次:


  • 简单应用:直接使用 OUT 引脚判断有人/无人;
  • 完整应用:通过 UART 读取目标状态、距离、速度、方向、能量、光照等数据。



如果使用 Arduino、ESP32 或树莓派,推荐直接使用官方 DFRobot_C4002 库。该库已经封装了底层串口帧、校验和、命令字和数据解析,开发者只需要调用对应 API 即可完成检测范围、距离门、光照阈值、上报周期、环境校准等配置。


参考资料:




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail