发帖
3 1 0

【电子DIY作品】不到10元的Rd-03d灯控系统???

KrOik
中级会员

1

主题

2

回帖

206

积分

中级会员

积分
206
电子DIY 266 3 2025-10-25 23:13:16
[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

image.png

2.安装到外壳:

24b03d71a9dfdc3fcdafa79d0a57721.jpg

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

d153704238db76e0a3e5beca62eb6ea.jpg

69aee5b39653ce5a477562b598b8bdd.jpg
开发板和继电器一并用美纹纸贴好

030664bfa2fe3479205ffc712a5869e.jpg
完成

此时,只需要接处电线和供电即可

MQTT演示:
image.png
这里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/hellordv5/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、设备 iprssiuptime_spresencerelay
    • 定期发布 "heartbeat" 消息:包含 ts_s、设备 ipwifi/net 连通性、presence/relayinside_gate/exit/invalidtracked 以及 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()RadarGateCampusLoginMqttClient 等模块各自实现 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的理由:

  1. 成本效益最优:在满足性能需求的前提下成本最低
  2. 集成度高:内置WiFi和蓝牙,减少外围器件
  3. 开发便利:ESP-IDF框架成熟,社区支持好
  4. 功耗优势:支持多种低功耗模式
  5. RISC-V架构:开源指令集,未来发展潜力大

6.2 开发框架对比

框架 ESP-IDF Arduino MicroPython Rust
开发语言 C/C++ C/C++ Python Rust
性能 优秀 良好 一般 优秀
实时性 优秀 良好 优秀
内存占用
开发效率 很高
生态支持 优秀 优秀 良好 一般
调试能力 优秀 良好 一般 优秀

选择Arduino的理由:

  1. 开发效率高:Arduino框架提供了简洁易用的API和丰富的库,大大简化了开发流程。
  2. 生态系统成熟:拥有庞大的社区支持和海量的开源库,便于快速开发和问题解决。
  3. 易于上手:对于快速原型开发和教育目的,Arduino框架的学习曲线更为平缓。
  4. 满足项目需求:对于本项目而言,Arduino框架的性能和实时性已足够满足需求,无需ESP-IDF的复杂性。
  5. 兼容性好:与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/hellordv5/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.cppRadarGate::updateRelay 与相关常量。

6.4.2 目标检测算法

基于阈值 vs 基于聚类 vs 基于机器学习:

算法类型 准确率 计算量 内存需求 实现难度 适用性
阈值检测 极低 极低 简单 ✅ 实时应用
聚类算法 中等 多目标
机器学习 很高 很高 很高 复杂 离线分析

项目实际采用的目标检测算法:

本项目主要采用了基于阈值的检测。并结合了简单的聚类思想。

  • 基于阈值的检测 (Threshold-based Detection)

    • 应用场景:用于雷达原始数据中目标的初步筛选和存在性判断,例如通过信号强度、距离、速度等阈值来判断是否存在有效目标。
    • 选择理由:实现简单,计算效率极高,能够满足实时性要求,适用于对目标存在与否进行快速判定的场景。
    • 实现参考:在雷达数据处理模块中,通过配置参数如 MIN_DETECTION_CONFIDENCETARGET_MIN_SIZE 等进行初步筛选。

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 串口与雷达

  • 雷达串口:UART1GPIO20 RX / GPIO21 TX),256000 波特率,SERIAL_8N1
  • 原始帧打印:LOG_RAW_FRAMES 设为 1 时输出 RAW: <header|payload|tail> 调试信息,默认 0

9.2 网络与 MQTT

  • 连接栈:WiFiClientSecure + PubSubClient(TLS)。
  • 根证书:emqx_ca.hEMQX_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.0fANGLE_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 = 10SPEED_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,没有人体存在检测固件功能,所以如何判断开关灯条件,以及平衡响应时间,成了很大挑战。

技术难点:

  1. 实时性要求:雷达数据需要在100ms内完成处理和响应
  2. 内存限制:ESP32-C3只有400KB SRAM,需要优化内存使用
  3. 计算能力:160MHz单核处理器需要高效的算法实现
  4. 噪声过滤:环境干扰和设备噪声影响检测精度

解决方案

本项目采用多维度判据结合时间窗口与迟滞机制,以在资源受限的MCU平台上实现鲁棒的雷达数据处理和决策。具体包括:

  1. 离群点跳变过滤 (Outlier Jump Filtering):通过设置 OUTLIER_JUMP_MM 参数,过滤掉短时间内距离变化过大的目标点,避免瞬时干扰造成误判。
  2. 距离迟滞 (Distance Hysteresis):引入 DIST_HYST_MM 参数,在目标距离变化时提供一个缓冲区域,减少继电器频繁开关,提高稳定性。
  3. 趋势证据积累 (Trend Evidence Accumulation):通过 TREND_WINDOW_MSTREND_STEP_MM 参数,在一定时间窗口内积累目标距离变化的趋势证据(上升或下降),用于判断目标的进入或离开意图。
  4. 粘滞存在保持 (Sticky Presence Holding):通过 INSIDE_STICK_MS 参数,在目标离开门控区域后,仍保持一段时间的“存在”状态,以提升用户体验,避免继电器过早关闭。
  5. 角度门控 (Angle Gating):利用 ANGLE_GATE_MIN_DEGANGLE_GATE_MAX_DEG 定义有效检测角度范围,只处理在该角度范围内的目标,排除无关区域的干扰。
  6. 强制关闭区域 (Angle Force-Off Zones):通过 ANGLE_FORCE_OFF_MIN_DEGANGLE_FORCE_OFF_MAX_DEG 定义强制关闭区域,当目标进入这些区域时,即使在门控区域内也强制关闭继电器,用于特殊场景控制。

这些机制共同作用于 RadarGate::updateRelay 函数中,形成一套稳定、抗干扰的决策逻辑。

11.2 系统架构创新

11.2.1 事件驱动架构

创新点:

本项目采用 Arduino 风格的单线程事件循环(loop() 函数),而非复杂的多线程或事件驱动框架。这种设计在资源受限的 ESP32-C3 平台上具有以下优势:

  1. 简化并发管理:避免了多线程带来的同步、互斥等复杂问题,降低了开发难度和出错概率。
  2. 资源占用低:无需额外的操作系统或调度器开销,内存和CPU占用更少。
  3. 实时性与响应:通过将各个模块(RadarGateCampusLoginMqttClient)的 loopStep() 函数集成到主循环中,确保每个模块都能在固定节奏内得到执行,实现非阻塞的协作。
  4. 模块化与可维护性:每个模块负责自身的状态管理和逻辑推进,通过 setup() 函数进行初始化和依赖绑定,职责清晰,易于理解和维护。

主循环在 src/main.cpploop() 函数中依次调用各模块的 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 修改步骤

  1. 定位参数:根据上述表格找到需要修改的参数及其所在文件。
  2. 备份配置:修改前备份原始配置文件。
  3. 修改参数:使用文本编辑器修改对应的宏定义值或常量值。
  4. 重新编译:执行 pio run 重新编译项目。
  5. 烧录测试:烧录新固件并测试功能是否正常。

13.5.2 注意事项

  • 代码约定:请注意,本项目的配置参数主要通过C++文件中的 static const 变量或宏定义 (#define) 来实现。
  • 内存限制:ESP32-C3内存有限,增大缓冲区和队列大小时需注意内存使用。
  • 引脚冲突:修改GPIO引脚时需确保引脚未被其他功能占用。
  • 网络配置:修改WiFi和MQTT参数时需确保网络环境支持,确保上级服务器正常联通。
  • 雷达特性:调整雷达检测参数时,请充分理解雷达模块的性能和环境因素,并以实际输出,现实情况进行调整。
    可以参考规格书:https://docs.ai-thinker.com/

──── 1人觉得很赞 ────

使用道具 举报

2025-10-27 17:10:18
怎么没有实际控制效果图以及视频呢
2025-10-29 06:17:06
演示视频:https://easylink.cc/vvb75c
在物料速览下面
2025-10-29 09:28:49
KrOik 发表于 2025-10-29 06:17
演示视频:https://easylink.cc/vvb75c
在物料速览下面

好的,这次算完整的DIY作品。下次记得要多多呈现实际控制效果图与视频。
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 30101 个
  • 话题数: 44217 篇