[i=s] 本帖最后由 KrOik 于 2025-10-27 00:36 编辑 [/i]
项目介绍
1.1 系统背景
该灯控系统是一个基于ESP32-C3superMini微控制器和RD-03D毫米波雷达的智能物联网检测系统。该系统结合了由安信可提供的24GHz毫米波雷达硬件方案、WiFi无线通信和MQTT物联网协议,为智能家居、安防监控、人体感应等应用场景提供高精度、实时的目标检测解决方案。
简单来说,这是为了方便我在宿舍非接触式的,更加智能化的控制台灯的解决方案。即实现人走灯灭,人来灯亮。通过构建请求,集成校园网登录验证,确保网络连接。同时,确保极低复刻成本和极简单的电路方案。
物料速览:
esp32c3superMini——7.01r小批量叠券
单路6A继电器模块——2.8r包邮
美纹纸,杜邦线/细电线——几毛钱
Rd-03d雷达模块:参加安信可论坛活动赠送——0r
现在双十一活动立减:安信可官方淘宝店链接:https://s.tb.cn/c.0D8PiB
Rd-03/03D也参与本次活动!立减15%,包邮!其他非活动商品每满200-20,速速选购吧!
如何使用?
1.配齐物料
2.电气连接
3.烧录代码
4.部署并配置参数
5.enjoy
代码:https://easylink.cc/pfczzg
使用PlatFormIO平台,framework = arduino。
演示视频:https://easylink.cc/vvb75c
安装:
1.引脚连接:
- 雷达模块 (Radar UART) :
- RX (接收): GPIO20
- TX (发送): GPIO21
- 继电器 (Relay) :
- 连接到: GPIO5
- 指示灯 (LED) :
- 连接到: GPIO2

2.安装到外壳:

将雷达用美纹纸贴住,贴在底部


开发板和继电器一并用美纹纸贴好

完成
此时,只需要接处电线和供电即可
MQTT演示:

这里MQTT服务器不做特别推荐指名,可以自行选择。
同时,因为时间关系,没有做出更多的联动。
1.2 Rd-03d模块介绍
搭载矽典微 S5KM312CL 芯片,采用 FMCW(调频连续波)技术,支持一发两收天线设计,可同时检测/跟踪 3 个目标
用户群体:
- 嵌入式开发工程师:需要快速构建雷达检测应用的开发者
- 物联网系统集成商:寻求可靠雷达检测解决方案的集成商
- 智能家居厂商:需要人体感应功能的设备制造商
- 安防监控企业:需要智能检测技术的安防公司
技术背景要求:
- 具备C语言编程基础
- 了解ESP32开发环境
- 熟悉物联网通信协议
- 具备基础的电子电路知识
2. 推荐使用场景
2.1 智能家居人体感应
应用描述:
在智能家居环境中,系统可通过雷达精确检测房间内人员的存在状态、移动轨迹及微动(如静止时的呼吸动作),实现智能照明的精准调控,或联动边缘设备上的监控系统完成场景化联动。
技术实现:
- 雷达检测范围:0.5-8 米(最远探测距离),方位角覆盖 ±60°,俯仰角 ±30°
- 检测精度:距离 ±0.15 米,距离分辨率 0.75 米
- 响应时间:支持 50ms-1s 可调上报周期(默认配置下 < 200ms)
- 功能特性:支持存在检测(Rd-03d_V2可识别静止人体),通过 UART 接口与主控通信,支持继电器多路设备联动
2.2 办公室会议室管理
应用描述:
在办公环境中,系统可通过雷达实时监测会议室人员数量、位置分布及使用状态,结合算法实现智能预约管理与设备自动控制,提升会议室使用效率。
技术实现:
- 多目标检测:同时跟踪最多 3 个目标,输出各目标的距离、角度、速度信息
- 人数统计:基于多目标聚类算法,结合目标运动轨迹实现人数估算
- 状态上报:通过 UART 转 MQTT 协议实时上报会议室占用状态(空闲 / 有人)
- 设备联动:支持控制空调、投影仪、照明等设备,联动逻辑基于目标存在状态触发
2.3 安防监控区域警戒
应用描述:
在安防监控场景中,系统依托毫米波雷达全天候工作特性,实现 24 小时不间断区域监控,精准识别异常入侵行为并触发报警,不受光线、天气及非金属遮挡影响。
技术实现:
- 全天候检测:工作在 24GHz ISM 频段,不受强光、黑暗、雨雪等环境影响,可穿透玻璃、衣物等非金属障碍物
- 目标分析:支持目标速度、距离、角度信息采集,区分正常通行(如人员正常走动)与异常入侵(如快速闯入、翻越)
- 多级报警:可通过配置工具设置检测区域(ROI),基于目标是否进入警戒区域及运动速度设置报警等级
- 联动控制:触发报警时,通过主控联动摄像头录像、声光警报器等设备
2.4 老人居家安全监护
应用描述:
在养老护理场景中,系统通过雷达非接触式监测老人的日常活动轨迹,及时发现风险并报警,保护老人居家安全。
技术实现:
- 活动监测:实时跟踪老人活动轨迹(基于距离、角度变化),记录活动区域与频率
- 异常识别:通过目标高度(或角度/位置)变化(跌倒时距离突变)、长时间静止(超过预设阈值,如 30 分钟无移动且无微动)识别异常状态
- 紧急报警:异常情况触发时,通过主控向家属或护理人员发送报警信息(支持 WiFi/BLE 联动)
3. 项目特色
3.1 高精度毫米波雷达技术
技术优势:
- 24GHz工作频率:提供毫米级的距离测量精度
- 多维度检测:同时获取距离、角度、速度三维信息
- 环境适应性强:不受光线、温度、湿度影响
- 穿透能力:可穿透薄壁、玻璃等非金属材料
创新点:
// RadarGate::Target
struct Target {
int16_t x;
int16_t y;
int16_t speed; // cm/s
uint16_t pix_mm; // pixel distance in mm
bool valid;
float angle_deg; // atan2(x, y)
uint16_t distance_mm; // prefer pix_mm, else Euclid mm
uint16_t euclid_mm; // sqrt(x^2 + y^2) in mm
};
// 噪声抑制与目标跟踪在 RadarGate::updateRelay 中实现:
// - 趋势证据(TREND_STEP_MM/TREND_WINDOW_MS)
// - 异常跳变剔除(OUTLIER_JUMP_MM)
// - 最近邻重关联(TRACK_RELINK_MM)与粘滞跟踪(TRACK_STICK_MS)
3.2 模块化软件架构设计
架构优势:
- 分层设计:硬件抽象层、驱动层、服务层、应用层清晰分离
- 模块解耦:各模块职责单一,接口标准化
- 可扩展性:支持功能模块的灵活添加和替换
- 可维护性:遵循华为编程规范,代码质量高
模块结构:
系统架构层次:
├── 应用层 (Application Layer)
│ ├── 雷达数据处理任务
│ ├── MQTT通信任务
│ └── 设备控制任务
├── 服务层 (Service Layer)
│ ├── 雷达管理服务
│ ├── 网络通信服务
│ └── 设备控制服务
├── 驱动层 (Driver Layer)
│ ├── UART驱动
│ ├── GPIO驱动
│ └── WiFi驱动
└── 硬件层 (Hardware Layer)
├── ESP32-C3微控制器
├── RD-03D雷达模块
└── 外围设备接口
3.3 实时物联网通信能力
通信特点:
- WiFi连接管理:自动重连、信号强度监测、校园网登录
- MQTT over TLS:端口
8883;主机/用户名/密码通过占位符配置;断线重连;主题精简为 rdv5/hello 与 rdv5/heartbeat。
- 数据格式标准化:JSON格式数据,便于系统集成
- 稳定心跳:默认
30s 间隔(HEARTBEAT_INTERVAL_MS)
通信协议:
{
"ts_s": 123456,
"ip": "192.168.1.20",
"wifi": true,
"net": true,
"presence": false,
"relay": false,
"inside_gate": false,
"exit": false,
"invalid": false,
"tracked": true,
"dist_mm": 840,
"ang_deg": -12.3,
"spd_cms": -18
}
3.4 智能设备联动控制
控制特点:
- 多设备支持:继电器、LED等多种设备
- 逻辑可配置:支持复杂的联动逻辑配置
- 安全保护:时间限制、故障检测
- 状态反馈:实时设备状态监控和反馈
控制逻辑:
- 继电器控制引脚:
RELAY_PIN = 5
- 角度门控:
ANGLE_GATE_ENABLED、扇区 [ANGLE_GATE_MIN_DEG, ANGLE_GATE_MAX_DEG] 与强制关断区
- 距离迟滞:
DIST_HYST_MM,最大检测距离 DETECT_MAX_MM
- 存在保持:
INSIDE_STICK_MS
- 退出证据计数:
EXIT_EVIDENCE_N / EXIT_EVIDENCE_WINDOW_MS
- 判定节奏:
DECISION_INTERVAL_MS
- 状态查询接口:
presenceState()、relayState()
4. 功能模块
4.1 系统管理模块 (System Management)
4.1.1 协作式调度 (Cooperative Scheduling)
主要功能:
- 基于Arduino
loop()函数的协作式调度
- 模块化
loopStep() 函数的顺序执行
- 确保各模块的周期性更新和状态管理
子功能模块:
- 主循环调度器:在
loop() 函数中依次调用各模块的 loopStep() 方法
- 模块状态管理:各模块内部维护自身状态和定时器,实现非阻塞操作
- 事件驱动机制:通过状态机和回调函数处理异步事件
- 资源共享管理:通过全局对象或单例模式共享系统资源
4.1.2 状态与异常报告 (Status & Anomaly Reporting)
主要功能:
- 通过串口输出系统运行状态和调试信息
- 网络连接(WiFi、MQTT)的自动重试机制
- LED 指示灯提供关键状态反馈
- 通过 MQTT 心跳包报告设备状态和异常标志
子功能模块:
- 串口日志输出:用于实时监控和调试,包含模块状态、雷达数据等
- 连接重试器:针对 WiFi 和 MQTT 连接失败进行周期性重试
- LED 状态指示:通过 LED 闪烁模式指示网络连接、登录重试等状态
- MQTT 状态报告:定期发布心跳包,包含设备运行状态、雷达检测状态和网络连通性
4.2 硬件驱动模块 (Hardware Drivers)
4.2.1 UART驱动 (UART Driver)
主要功能:
- 高速串口通信(256000波特率),使用GPIO20 (RX) / GPIO21 (TX)
- 数据发送和接收缓冲管理
- 流控制和错误检测
- 中断驱动的异步通信
子功能模块:
- 缓冲区管理:环形缓冲区实现高效数据传输
- 协议解析:雷达数据帧的实时解析
- 错误检测:校验和验证、帧格式检查
- 性能优化:DMA传输、中断优化
GPIO 驱动
- 主功能:控制继电器(GPIO5)、LED 指示灯(GPIO2)等外设。
- 子功能:
- 引脚初始化与模式设置。
- 数字信号输出控制(高/低电平)。
- (可选)中断处理。
4.3 网络通信模块 (Network Communication)
4.3.1 WiFi管理器 (WiFi Manager)
主要功能:
- WiFi连接和断开管理
- 自动重连和状态监控
- 信号强度检测和网络诊断
- 校园网自动登录功能,通过
CampusLogin 类处理认证
子功能模块:
- 连接管理器:WiFi连接状态管理和自动重连
- 外网连通性检查:定期请求
CHECK_URL 判断是否需认证
- 认证管理器:支持WPA/WPA2/企业级认证,实现校园网自动登录和重试机制
- 诊断工具:网络连接诊断和故障排除
MQTT 客户端
- 主功能:负责与 MQTT 代理建立安全连接,并发布设备状态和雷达数据。
- 子功能:
- 基于 TLS 的安全连接(
WiFiClientSecure + Digicert Global Root G2)。
- 自动重连机制。
- 缓冲区大小:
512 字节。
- 心跳间隔:
30s;重连间隔:15s。
- 发布 "hello" 消息:包含
clientId、设备 ip、rssi、uptime_s、presence、relay。
- 定期发布 "heartbeat" 消息:包含
ts_s、设备 ip、wifi/net 连通性、presence/relay、inside_gate/exit/invalid、tracked 以及 dist_mm/ang_deg/spd_cms。
- 客户端 ID 自动生成(形如
esp32c3rd03-XXXXYYYY)。
4.4 雷达数据处理模块 (Radar Data Processing)
数据解析器
- 主功能:从雷达模块接收的原始 UART 数据流中解析出有效的雷达帧,并提取目标信息。
- 子功能:
- UART 参数:
UART1(GPIO20 RX / GPIO21 TX),波特率 256000。
- 帧头和帧尾识别:识别
0xAA 0xFF 0x03 0x00 作为帧头和 0x55 0xCC 作为帧尾。
- 载荷提取:从有效帧中提取 24 字节的载荷数据。
- 目标数据解析:将载荷数据解析为最多 3 个目标,每个目标包含 X 坐标、Y 坐标、速度、像素距离等信息。
- 数据校验:确保接收到的数据帧完整且格式正确。
目标检测器(Target Detector)
- 主要功能:基于雷达数据实现目标存在性判定与运动趋势分析,控制继电器输出。
- 子功能:
- 角度门控:可编译开关
ANGLE_GATE_ENABLED 控制(默认关闭不做角度过滤);启用时仅处理 ANGLE_GATE_MIN_DEG(-30°)至 ANGLE_GATE_MAX_DEG(4.9°)范围;强制关断扇区仅在启用角度门控时生效 [ANGLE_FORCE_OFF_MIN_DEG, ANGLE_FORCE_OFF_MAX_DEG](8°–13°)。
- 目标跟踪:维持最近目标的位置、距离、角度和速度信息,
TRACK_STICK_MS(800ms)保持连续性,TRACK_RELINK_MM(500mm)最近邻重关联。
- 距离与范围:最大检测距离
DETECT_MAX_MM(1600mm),边界迟滞 DIST_HYST_MM(120mm)。
- 存在保持:在
INSIDE_STICK_MS(2000ms)窗口内出现过门内目标则保持存在为 ON。
- 趋势检测:在
TREND_WINDOW_MS(1200ms)内以步长 TREND_STEP_MM(80mm)累计证据,满足 TREND_EVIDENCE_N(4次)判为靠近/远离;OUTLIER_JUMP_MM(1000mm)以上的单次跳变忽略。
- 退出判据:远离速度阈值
EXIT_AWAY_SPEED_CMS(10 cm/s,默认负向);离开证据累计 EXIT_EVIDENCE_N(3次)于 EXIT_EVIDENCE_WINDOW_MS(800ms)窗口。
- 判定节奏:
DECISION_INTERVAL_MS(1500ms)定步更新门内状态。
4.5 设备控制模块 (Device Control)
继电器控制器(Relay Controller)
- 主要功能:根据目标检测器的判定结果,控制继电器的开关状态。
- 子功能:
- 引脚定义:继电器控制引脚为
RELAY_PIN (GPIO5)。
- 初始化:在
RadarGate::begin() 中将 RELAY_PIN 配置为输出模式,并初始化为 LOW(关闭)。
- 状态更新:在
RadarGate::updateRelay() 中,根据 presenceOn_ 状态决定 desiredRelay 状态,并引入 RELAY_HYST_MS(50ms)的滞后时间,防止继电器频繁切换。
- 物理控制:通过
digitalWrite(RELAY_PIN, relayOn_ ? HIGH : LOW) 实现继电器的物理开关。
LED控制器(LED Controller)
- 主要功能:通过板载 LED 指示设备的不同运行状态,如网络连接、登录重试等。
- 子功能:
- 引脚定义:LED 控制引脚为
LED_PIN (GPIO2)。
- 初始化:在
CampusLogin::begin() 中将 LED_PIN 配置为输出模式,并初始化为 LOW(关闭)。
- 状态指示:
ledOn() 和 ledOff():控制 LED 的亮灭。
blink(int times, int delayMs):实现 LED 闪烁功能,用于指示特定事件。
- 运行状态反馈:
- 在
CampusLogin::loopStep() 中,当处于网络登录重试周期时,LED 会以 blink(3, 200) 闪烁(3 次,每次 200ms 间隔)。
- 正常运行时,LED 会周期性地短闪烁
blink(1, 80)(1 次,80ms 间隔),表示系统正常。
4.6 工具支持模块 (Utility Support)
Logger (日志记录器)
- 主要功能:通过串口输出调试信息和系统状态,便于开发和监控。
- 子功能:
- 串口初始化:在
setup() 函数中通过 Serial.begin(115200) 初始化串口通信,波特率为 115200。
- 调试信息输出:
Serial.print() 和 Serial.println():广泛用于输出各类调试信息,例如雷达解析器的启动信息、WiFi 连接状态、IP 地址、网络连通性、校园网登录重试信息等。
Serial.printf():用于格式化输出,例如打印系统运行时间 printUptime() 和 IP 地址。
- 原始帧日志:通过
LOG_RAW_FRAMES 宏控制是否打印原始雷达数据帧,方便底层调试。
- 状态报告:在
RadarGate::loopStep() 中,每 REPORT_INTERVAL_MS(1500ms)通过串口输出一次详细的系统状态报告,包括继电器状态、存在状态、最后一帧时间、WiFi 状态、IP、网络连通性、下次检查时间、登录重试信息、门内状态、离开证据、无效检测、跟踪目标信息等。
5. 系统架构
5.1 整体架构图
graph TB
subgraph "外部设备层"
A1[RD-03D雷达模块]
A2[继电器模块]
A3[LED指示灯]
A4[MQTT服务器]
end
subgraph "ESP32-C3核心层"
B1[ESP32-C3微控制器]
B2[WiFi模块]
B3[UART接口]
B4[GPIO接口]
B5[RadarGate模块]
B6[CampusLogin模块]
B7[MqttClient模块]
end
A1 -- UART --> B3
B3 -- 数据 --> B5
A2 -- GPIO --> B4
A3 -- GPIO --> B4
B4 -- 控制 --> B5
B5 -- 控制 --> A2
B5 -- 控制 --> A3
B1 -- WiFi --> B2
B2 -- 网络 --> B6
B6 -- 认证 --> B2
B2 -- 网络 --> B7
B7 -- MQTT协议 --> A4
B5 -- 数据 --> B7
B6 -- 状态 --> B7
B1 -- 调度 --> B5
B1 -- 调度 --> B6
B1 -- 调度 --> B7
5.2 模块交互图
sequenceDiagram
participant R as 雷达模块
participant RG as RadarGate模块
participant CL as CampusLogin模块
participant MC as MqttClient模块
R->>RG: 发送雷达数据 (UART)
RG->>RG: 数据解析与目标检测
RG->>RG: 继电器与LED控制
RG->>MC: 提供雷达数据与状态
CL->>CL: WiFi连接与校园网认证
CL->>MC: 提供网络连接状态
MC->>MC: MQTT连接管理
MC->>MC: 发布"hello"与"heartbeat"消息
MC->>A4: 发布MQTT消息
Note over R,MC: 完整的数据处理与发布流程
5.3 数据流程图
graph LR
subgraph "外部输入"
A[雷达原始数据] --> RG_RAW[RadarGate: 接收原始数据]
end
subgraph "RadarGate模块"
RG_RAW --> RG_PARSE{数据帧解析与验证}
RG_PARSE -->|有效| RG_COORD[坐标计算]
RG_PARSE -->|无效| RG_DISCARD[丢弃数据]
RG_COORD --> RG_DETECT[目标检测]
RG_DETECT --> RG_TRACK{检测到目标?}
RG_TRACK -->|是| RG_EVIDENCE[趋势证据与抑噪]
RG_TRACK -->|否| RG_CLEAR[清除跟踪]
RG_EVIDENCE --> RG_STATE[更新目标状态]
RG_STATE --> RG_CONTROL[继电器/LED控制逻辑]
RG_STATE --> RG_MQTT_DATA[提供雷达数据给MQTT]
end
subgraph "CampusLogin模块"
CL_INIT[CampusLogin: 初始化] --> CL_WIFI[WiFi连接管理]
CL_WIFI --> CL_AUTH[校园网认证]
CL_AUTH --> CL_STATUS[提供网络状态给MQTT]
end
subgraph "MqttClient模块"
MC_INIT[MqttClient: 初始化] --> MC_CONNECT[MQTT连接管理]
RG_MQTT_DATA --> MC_PUBLISH_RADAR[发布雷达数据]
CL_STATUS --> MC_PUBLISH_STATUS[发布网络状态]
MC_PUBLISH_RADAR --> MQTT_SERVER[MQTT服务器]
MC_PUBLISH_STATUS --> MQTT_SERVER
MC_CONNECT --> MQTT_SERVER
end
subgraph "外部输出"
RG_CONTROL --> RELAY[继电器控制]
RG_CONTROL --> LED[LED指示]
end
RG_DISCARD --> RG_RAW
RG_CLEAR --> RG_RAW
5.4 任务调度架构
- 主要功能:系统采用 Arduino 框架的
loop() 函数进行任务调度,通过顺序调用各个模块的 loopStep() 方法实现循环执行。
- 调度机制:
loop() 函数:Arduino 程序的入口点,在 setup() 函数执行完毕后无限循环。
- 模块
loopStep():RadarGate、CampusLogin 和 MqttClient 等模块各自实现 loopStep() 方法,在该方法中处理各自的逻辑,例如雷达数据读取、WiFi 状态检查、MQTT 消息处理等。
- 顺序执行:各个模块的
loopStep() 方法在 loop() 函数中按顺序调用,形成一个简单的循环调度。
- 非阻塞设计:各个
loopStep() 方法内部应采用非阻塞设计,避免长时间占用 CPU,以确保系统的响应性。
6. 技术选型
6.1 硬件平台对比分析
| 对比项目 |
ESP32-C3 |
ESP32-S3 |
STM32F4 |
Arduino Uno |
| 处理器架构 |
RISC-V 32位 |
Xtensa 32位 |
ARM Cortex-M4 |
AVR 8位 |
| 主频 |
160MHz |
240MHz |
168MHz |
16MHz |
| 内存 |
400KB SRAM |
512KB SRAM |
192KB SRAM |
2KB SRAM |
| Flash |
4MB |
8MB |
1MB |
32KB |
| WiFi |
✅ 802.11n |
✅ 802.11n |
❌ |
❌ |
| 蓝牙 |
✅ BLE 5.0 |
✅ BLE 5.0 |
❌ |
❌ |
| GPIO数量 |
22个 |
45个 |
82个 |
14个 |
| UART数量 |
2个 |
3个 |
6个 |
1个 |
| 开发生态 |
优秀 |
优秀 |
良好 |
一般 |
| 成本 |
低 |
中 |
中 |
低 |
| 功耗 |
极低 |
低 |
中 |
低 |
选择ESP32-C3的理由:
- 成本效益最优:在满足性能需求的前提下成本最低
- 集成度高:内置WiFi和蓝牙,减少外围器件
- 开发便利:ESP-IDF框架成熟,社区支持好
- 功耗优势:支持多种低功耗模式
- RISC-V架构:开源指令集,未来发展潜力大
6.2 开发框架对比
| 框架 |
ESP-IDF |
Arduino |
MicroPython |
Rust |
| 开发语言 |
C/C++ |
C/C++ |
Python |
Rust |
| 性能 |
优秀 |
良好 |
一般 |
优秀 |
| 实时性 |
优秀 |
良好 |
差 |
优秀 |
| 内存占用 |
低 |
中 |
高 |
低 |
| 开发效率 |
中 |
高 |
很高 |
中 |
| 生态支持 |
优秀 |
优秀 |
良好 |
一般 |
| 调试能力 |
优秀 |
良好 |
一般 |
优秀 |
选择Arduino的理由:
- 开发效率高:Arduino框架提供了简洁易用的API和丰富的库,大大简化了开发流程。
- 生态系统成熟:拥有庞大的社区支持和海量的开源库,便于快速开发和问题解决。
- 易于上手:对于快速原型开发和教育目的,Arduino框架的学习曲线更为平缓。
- 满足项目需求:对于本项目而言,Arduino框架的性能和实时性已足够满足需求,无需ESP-IDF的复杂性。
- 兼容性好:与ESP32-C3硬件平台兼容良好,可以充分利用其硬件资源。
6.3 通信协议选择
6.3.1 雷达通信协议
UART vs SPI vs I2C对比:
| 协议 |
传输速度 |
线路数量 |
距离 |
复杂度 |
适用性 |
| UART |
256Kbps |
2线 |
长 |
低 |
✅ 最适合 |
| SPI |
10Mbps+ |
4线 |
短 |
中 |
过度设计 |
| I2C |
400Kbps |
2线 |
短 |
中 |
速度不足 |
选择UART的理由:
- RD-03D雷达模块原生支持UART接口
- 传输速度满足实时性要求
- 接线简单,抗干扰能力强
- 支持长距离传输
6.3.2 网络通信协议
WiFi vs LoRa vs 4G对比:
| 协议 |
传输速度 |
功耗 |
成本 |
覆盖范围 |
部署难度 |
| WiFi |
54Mbps+ |
中 |
低 |
室内 |
✅ 简单 |
| LoRa |
50Kbps |
极低 |
中 |
广域 |
复杂 |
| 4G |
100Mbps+ |
高 |
高 |
广域 |
中等 |
MQTT vs HTTP vs CoAP对比:
| 协议 |
开销 |
实时性 |
QoS |
复杂度 |
生态 |
| MQTT |
低 |
高 |
支持 |
中 |
✅ 优秀 |
| HTTP |
高 |
低 |
不支持 |
低 |
优秀 |
| CoAP |
低 |
高 |
支持 |
高 |
一般 |
项目通信栈:WiFiClientSecure + PubSubClient,MQTT over TLS(端口 8883),主题精简为 rdv5/hello 与 rdv5/heartbeat。
6.4 算法技术选择
6.4.1 滤波算法对比
| 算法 |
计算复杂度 |
滤波效果 |
实时性 |
内存占用 |
适用场景 |
| 卡尔曼滤波 |
中 |
优秀 |
好 |
中 |
目标跟踪 |
| 移动平均 |
低 |
一般 |
优秀 |
低 |
简单降噪 |
| 中值滤波 |
中 |
良好 |
好 |
低 |
脉冲噪声 |
| 低通滤波 |
低 |
良好 |
优秀 |
低 |
高频噪声 |
实际上,为了防止跳变和意外判断,这里用的是多个判断条件以确保正常触发
项目实际采用的抑噪与判据策略:
- 跳变滤除:单帧距离突变超过
OUTLIER_JUMP_MM 视为异常,忽略该证据。
- 距离迟滞:
DIST_HYST_MM 抑制边界抖动,避免频繁触发/关闭。
- 趋势证据:在窗口
TREND_WINDOW_MS 内累积单步变化 TREND_STEP_MM,形成“进入/退出”判据。
- 粘滞保持:在
INSIDE_STICK_MS 内最近出现过门内目标,保持存在状态为 ON。
实现参考:src/radar_gate.cpp 中 RadarGate::updateRelay 与相关常量。
6.4.2 目标检测算法
基于阈值 vs 基于聚类 vs 基于机器学习:
| 算法类型 |
准确率 |
计算量 |
内存需求 |
实现难度 |
适用性 |
| 阈值检测 |
中 |
极低 |
极低 |
简单 |
✅ 实时应用 |
| 聚类算法 |
高 |
低 |
低 |
中等 |
多目标 |
| 机器学习 |
很高 |
很高 |
很高 |
复杂 |
离线分析 |
项目实际采用的目标检测算法:
本项目主要采用了基于阈值的检测。并结合了简单的聚类思想。
8. 工作流程
8.1 系统启动流程
flowchart TD
A[系统上电] --> B[初始化Serial]
B --> C[初始化RadarGate]
C --> D[初始化CampusLogin]
D --> E[初始化MqttClient]
E --> F[建立模块依赖]
F -->|gGate.attachCampus| G[关联校园网模块]
G -->|gMqtt.attachGate| H[关联雷达模块]
H -->|gMqtt.attachCampus| I[关联校园网模块]
I --> J[系统就绪]
J --> K[循环执行任务]
K --> L[RadarGate.loopStep]
L --> M[CampusLogin.loopStep]
M --> N[MqttClient.loopStep]
N --> K
B --> O{初始化失败?}
O -->|是| P[错误指示]
P --> Q[系统重启]
Q --> A
8.2 雷达数据处理流程
flowchart TD
A[UART接收循环] --> B[读取数据到缓冲区]
B --> C{缓冲区有完整帧?}
C -->|否| D[等待更多数据]
C -->|是| E[提取数据帧]
E --> F[帧头验证]
F --> G{帧头正确?}
G -->|否| H[丢弃数据]
G -->|是| I[帧尾验证]
I --> J{帧尾正确?}
J -->|否| K[记录错误]
J -->|是| L[解析原始目标数据]
L --> M[计算欧氏距离和角度]
M --> N[噪声抑制与趋势证据统计]
N --> O[更新最新目标状态]
O --> P{检测到有效目标?}
P -->|否| Q[清除跟踪状态]
P -->|是| R[目标跟踪与趋势分析]
R --> S[更新继电器控制决策]
S --> T[更新调试信息]
Q --> S
D --> A
H --> A
K --> A
S --> A
T --> A
8.3 设备控制流程
flowchart TD
A[读取雷达目标数据] --> B{存在有效目标?}
B -->|否| C[清除跟踪状态]
B -->|是| D[角度门控验证]
D -->|无效| C
D -->|有效| E[目标跟踪与趋势分析]
E --> F{趋势证据满足?}
F -->|是| G[更新继电器控制决策]
F -->|否| H[保持当前状态]
G --> I[应用 hysteresis 延迟]
I --> J[更新继电器状态]
C --> H
H --> A
J --> A
9. 配置说明
本节对齐项目源码中的配置参数,便于部署与调试。
9.1 串口与雷达
- 雷达串口:
UART1(GPIO20 RX / GPIO21 TX),256000 波特率,SERIAL_8N1。
- 原始帧打印:
LOG_RAW_FRAMES 设为 1 时输出 RAW: <header|payload|tail> 调试信息,默认 0。
9.2 网络与 MQTT
- 连接栈:
WiFiClientSecure + PubSubClient(TLS)。
- 根证书:
emqx_ca.h 中 EMQX_CA_CERT_PEM。
- 服务器参数(
src/mqtt_client.h):
kHost = "你的sever连接地址"
kPort = 8883(MQTT over TLS)一般情况
kUser = "esp32c3rd03"
kPass = "你的认证密码"
- 主题:
rdv5/hello(保留)、rdv5/heartbeat(非保留)。
- 心跳与重连(
src/mqtt_client.h):
RECONNECT_INTERVAL_MS = 15000(15s)
HEARTBEAT_INTERVAL_MS = 30000(30s)
- 缓冲区:
mqtt_.setBufferSize(512)。
- 心跳负载字段来源:
MqttClient::publishHeartbeat + RadarGate::debug()。
9.3 雷达判定参数(src/radar_gate.cpp)
- 距离范围与迟滞:
DETECT_MIN_MM = 2
DETECT_MAX_MM = 1600
DIST_HYST_MM = 120
- 角度门控(可关):
ANGLE_GATE_ENABLED(默认 0 关闭)
ANGLE_GATE_MIN_DEG = -30.0f
ANGLE_GATE_MAX_DEG = 4.9f
- 强制关断区:
ANGLE_FORCE_OFF_MIN_DEG = 8.0f,ANGLE_FORCE_OFF_MAX_DEG = 13.0f
- 趋势与证据:
TREND_STEP_MM = 80
TREND_EVIDENCE_N = 4
TREND_WINDOW_MS = 1200
EXIT_EVIDENCE_N = 3
EXIT_EVIDENCE_WINDOW_MS = 800
- 目标追踪与保持:
TRACK_STICK_MS = 800
TRACK_RELINK_MM = 500
- 远离速度阈值:
EXIT_AWAY_SPEED_CMS = 10(SPEED_AWAY_NEGATIVE = 1 表示“远离”为负速度)
- 判定节奏与帧活跃:
DECISION_INTERVAL_MS = 1500
FRAME_ACTIVE_MS = 500
9.4 设备控制
- 继电器引脚与迟滞:
RELAY_PIN = 5
RELAY_HYST_MS = 50
- 存在保持:
INSIDE_STICK_MS = 2000(2s 内出现过门内目标则维持 ON)。
11. 创新设计
11.1 技术难点与挑战
11.1.1 雷达数据处理挑战
挑战描述:
RD-03D雷达输出的原始数据字段需要进行解析,需要在资源受限的ESP32-C3平台上实现高效的数据处理算法,因为物料并非Rd-03d_V2,没有人体存在检测固件功能,所以如何判断开关灯条件,以及平衡响应时间,成了很大挑战。
技术难点:
- 实时性要求:雷达数据需要在100ms内完成处理和响应
- 内存限制:ESP32-C3只有400KB SRAM,需要优化内存使用
- 计算能力:160MHz单核处理器需要高效的算法实现
- 噪声过滤:环境干扰和设备噪声影响检测精度
解决方案:
本项目采用多维度判据结合时间窗口与迟滞机制,以在资源受限的MCU平台上实现鲁棒的雷达数据处理和决策。具体包括:
- 离群点跳变过滤 (Outlier Jump Filtering):通过设置
OUTLIER_JUMP_MM 参数,过滤掉短时间内距离变化过大的目标点,避免瞬时干扰造成误判。
- 距离迟滞 (Distance Hysteresis):引入
DIST_HYST_MM 参数,在目标距离变化时提供一个缓冲区域,减少继电器频繁开关,提高稳定性。
- 趋势证据积累 (Trend Evidence Accumulation):通过
TREND_WINDOW_MS 和 TREND_STEP_MM 参数,在一定时间窗口内积累目标距离变化的趋势证据(上升或下降),用于判断目标的进入或离开意图。
- 粘滞存在保持 (Sticky Presence Holding):通过
INSIDE_STICK_MS 参数,在目标离开门控区域后,仍保持一段时间的“存在”状态,以提升用户体验,避免继电器过早关闭。
- 角度门控 (Angle Gating):利用
ANGLE_GATE_MIN_DEG 和 ANGLE_GATE_MAX_DEG 定义有效检测角度范围,只处理在该角度范围内的目标,排除无关区域的干扰。
- 强制关闭区域 (Angle Force-Off Zones):通过
ANGLE_FORCE_OFF_MIN_DEG 和 ANGLE_FORCE_OFF_MAX_DEG 定义强制关闭区域,当目标进入这些区域时,即使在门控区域内也强制关闭继电器,用于特殊场景控制。
这些机制共同作用于 RadarGate::updateRelay 函数中,形成一套稳定、抗干扰的决策逻辑。
11.2 系统架构创新
11.2.1 事件驱动架构
创新点:
本项目采用 Arduino 风格的单线程事件循环(loop() 函数),而非复杂的多线程或事件驱动框架。这种设计在资源受限的 ESP32-C3 平台上具有以下优势:
- 简化并发管理:避免了多线程带来的同步、互斥等复杂问题,降低了开发难度和出错概率。
- 资源占用低:无需额外的操作系统或调度器开销,内存和CPU占用更少。
- 实时性与响应:通过将各个模块(
RadarGate、CampusLogin、MqttClient)的 loopStep() 函数集成到主循环中,确保每个模块都能在固定节奏内得到执行,实现非阻塞的协作。
- 模块化与可维护性:每个模块负责自身的状态管理和逻辑推进,通过
setup() 函数进行初始化和依赖绑定,职责清晰,易于理解和维护。
主循环在 src/main.cpp 的 loop() 函数中依次调用各模块的 loopStep() 方法,确保系统以统一的节奏运行,并及时响应外部事件(如雷达数据、网络状态变化等)。
13. 配置参数说明
本章节详细说明ESP32-C3雷达联动系统中所有可配置参数的定义、用途和修改影响。
13.1 硬件与GPIO配置
| 参数名称 |
所在文件 |
参数说明 |
修改影响 |
LED_PIN |
src/campus_login.h |
指示LED连接的GPIO引脚。 |
更改LED指示灯的物理连接。 |
RELAY_PIN |
src/radar_gate.cpp |
继电器控制连接的GPIO引脚。 |
更改继电器的物理连接。 |
13.2 WiFi/网络配置
| 参数名称 |
所在文件 |
参数说明 |
修改影响 |
CONNECT_TIMEOUT_MS |
src/campus_login.h |
WiFi连接尝试的超时时间(毫秒)。 |
影响设备等待WiFi连接成功的最长时间。 |
CHECK_TIMEOUT_MS |
src/campus_login.h |
网络连通性检查的超时时间(毫秒)。 |
影响设备等待网络检查响应的最长时间。 |
CHECK_INTERVAL_MS |
src/campus_login.h |
网络连通性检查的间隔时间(毫秒)。 |
影响设备检查网络状态的频率。 |
LONG_RETRY_INTERVAL_MS |
src/campus_login.h |
WiFi连接失败后,长时间重试的间隔时间(毫秒)。 |
影响设备在长时间连接失败后再次尝试连接的频率。 |
RETRY_INTERVAL_MS |
src/campus_login.h |
WiFi连接失败后,短时间重试的间隔时间(毫秒)。 |
影响设备在短时间连接失败后再次尝试连接的频率。 |
13.3 MQTT配置
| 参数名称 |
所在文件 |
参数说明 |
修改影响 |
RECONNECT_INTERVAL_MS |
src/mqtt_client.h |
MQTT客户端尝试重新连接MQTT服务器的间隔时间(毫秒)。 |
影响MQTT连接断开后,客户端尝试恢复连接的频率。 |
HEARTBEAT_INTERVAL_MS |
src/mqtt_client.h |
MQTT客户端发送心跳消息以保持连接的间隔时间(毫秒)。 |
影响MQTT连接的活跃度维护和网络流量。 |
13.4 雷达检测与决策参数
| 参数名称 |
所在文件 |
参数说明 |
修改影响 |
DETECT_MIN_MM |
src/radar_gate.cpp |
雷达检测的最小有效距离(毫米)。 |
影响雷达忽略近距离目标的能力。 |
DETECT_MAX_MM |
src/radar_gate.cpp |
雷达检测的最大有效距离(毫米)。 |
影响雷达检测范围的上限。 |
RELAY_HYST_MS |
src/radar_gate.cpp |
继电器状态切换的滞后时间(毫秒),用于防止继电器频繁开关。 |
影响继电器响应检测结果的平滑度。 |
INSIDE_STICK_MS |
src/radar_gate.cpp |
当目标在门内时,继电器保持ON状态的粘滞时间(毫秒)。 |
确保在目标短暂离开检测区域后,继电器仍能保持ON状态。 |
FRAME_ACTIVE_MS |
src/radar_gate.cpp |
雷达帧被认为是“活跃”的时间窗口(毫秒)。 |
影响系统对雷达数据流的实时性判断。 |
EXIT_EVIDENCE_WINDOW_MS |
src/radar_gate.cpp |
用于判断目标是否离开的证据积累时间窗口(毫秒)。 |
影响系统确认目标离开检测区域所需的时间。 |
TRACK_STICK_MS |
src/radar_gate.cpp |
跟踪目标保持“粘滞”状态的时间(毫秒)。 |
影响系统在目标短暂消失后继续跟踪的能力。 |
ANGLE_GATE_MIN_DEG |
src/radar_gate.cpp |
角度门限的最小角度(度)。 |
限制雷达检测的有效角度范围。 |
ANGLE_GATE_MAX_DEG |
src/radar_gate.cpp |
角度门限的最大角度(度)。 |
限制雷达检测的有效角度范围。 |
ANGLE_FORCE_OFF_MIN_DEG |
src/radar_gate.cpp |
强制关闭区域的最小角度(度)。 |
定义一个角度范围,在此范围内检测到目标将强制关闭继电器。 |
ANGLE_FORCE_OFF_MAX_DEG |
src/radar_gate.cpp |
强制关闭区域的最大角度(度)。 |
定义一个角度范围,在此范围内检测到目标将强制关闭继电器。 |
ANGLE_GATE_ENABLED |
src/radar_gate.cpp |
控制角度门限功能是否启用(0为禁用,1为启用)。 |
启用或禁用基于角度的检测过滤。 |
TREND_WINDOW_MS |
src/radar_gate.cpp |
用于积累目标移动趋势证据的时间窗口(毫秒)。 |
影响系统判断目标移动方向和意图的灵敏度。 |
DECISION_INTERVAL_MS |
src/radar_gate.cpp |
系统进行继电器决策判断的节奏间隔(毫秒)。 |
影响继电器状态更新的频率。 |
REPORT_INTERVAL_MS |
src/radar_gate.h |
系统向MQTT服务器报告状态和数据的间隔时间(毫秒)。 |
影响数据上报的频率和网络负载。 |
13.5 配置参数修改指南
13.5.1 修改步骤
- 定位参数:根据上述表格找到需要修改的参数及其所在文件。
- 备份配置:修改前备份原始配置文件。
- 修改参数:使用文本编辑器修改对应的宏定义值或常量值。
- 重新编译:执行
pio run 重新编译项目。
- 烧录测试:烧录新固件并测试功能是否正常。
13.5.2 注意事项
- 代码约定:请注意,本项目的配置参数主要通过C++文件中的
static const 变量或宏定义 (#define) 来实现。
- 内存限制:ESP32-C3内存有限,增大缓冲区和队列大小时需注意内存使用。
- 引脚冲突:修改GPIO引脚时需确保引脚未被其他功能占用。
- 网络配置:修改WiFi和MQTT参数时需确保网络环境支持,确保上级服务器正常联通。
- 雷达特性:调整雷达检测参数时,请充分理解雷达模块的性能和环境因素,并以实际输出,现实情况进行调整。
可以参考规格书:https://docs.ai-thinker.com/