19 KiB
19 KiB
title, subtitle, version, date, author, project, branch, git-head
| title | subtitle | version | date | author | project | branch | git-head |
|---|---|---|---|---|---|---|---|
| 五劳无感康养监测系统 — 研发过程性材料 | 过程记录 · 版本演进 · 关键问题修复 | V1.0(框架版,待补充图/视频) | 2026-08-26 | 杨志佳 | Healthv2.0 | main | 7845836 |
五劳无感康养监测系统
研发过程性材料
本文档说明
- 用途:面向甲方的研发过程性材料(验收/结项参考)。
- 形式:简要版,约 5–10 页(Word A4)。
- 状态:本版本为框架,各章节预留了图位、视频位与文字占位符。研发人员自行补图/视频/详细说明。
- 图位标记:
[📷 图片占位 — 描述]— 替换为。- 视频位标记:
[🎬 视频占位 — 描述]— 替换为 Word 中插入的视频;Markdown 阶段可保留占位符。- 代码/日志贴图位:
[🖥 屏幕截图位 — 描述]。- 未提交/进行中标记:⏳ 标识。
目录
- 项目概述
- 系统架构与硬件组成
- 关键功能演示(视频位)
- 软件模块划分
- 版本演进(Git 历史)
- 关键 Bug 修复过程(案例)
- 测试与验证记录
- 当前已交付功能 / 待办
1. 项目概述
1.1 项目定位
【📝 占位 200–300 字。内容方向:】
- 项目背景与甲方需求(一句话总结)
- 设备形态:卫生间/卧室/客厅/阳台/厨房,挂壁式
- "无感监测"理念:零穿戴、零接触、隐私优先(雷达不上传原始波形)
1.2 核心能力一览
| 维度 | 能力 |
|---|---|
| 生命安全 | 跌倒检测、生命体征异常(心率/呼吸) |
| 环境安全 | 水浸、 温湿度异常 |
| 设备自检 | 雷达超时、 DHT11 故障 |
| 通信 | MQTT V0.08 协议、WiFi 配网、蓝牙配网 |
| 联动 | 本地蜂鸣 + 远程告警、双向告警恢复 |
| 显示 | OLED 多页显示(环境 / 体征 / 状态 / 报警) |
1.3 技术指标(关键参数)
【📝 占位:列出关键阈值——心率 50–120 bpm、呼吸 10–26 次/分、温度 5–45℃、湿度 15–90% RH、上报周期 1s/60s 心跳、报警响应延迟 ≤ 20s】
1.4 项目实物图
【📷 图片占位 — 整机实物照片:外壳 + OLED 显示 + 雷达天线位 + 接线端子】
2. 系统架构与硬件组成
2.1 总体架构(ASCII)
┌───────────────────────────┐
│ 云端 MQTT 服务 │
│ 202.110.234.102:8000 │
└─────────────┬─────────────┘
│ (WiFi, MQTT V0.08)
│
┌──────────────────────┴──────────────────────┐
│ 五劳无感康养监测终端 (本设备) │
│ │
│ ┌─────────┐ ┌─────────┐ ┌──────────┐ │
│ │ R60AFD1 │ │ DHT11 │ │ 水浸传感 │ │
│ │ 60G雷达 │ │ 温湿度 │ │ GPIO45 │ │
│ └────┬────┘ └────┬────┘ └────┬─────┘ │
│ │UART2 │GPIO4 │GPIO45 │
│ ┌────┴────────────┴─────────────┴──────┐ │
│ │ ESP32-S3 (双核) │ │
│ │ │ │
│ │ 核心0: 雷达解析任务 (10ms) │ │
│ │ 核心1: 主循环 / WiFi / MQTT / 报警 │ │
│ └───┬─────┬─────┬─────┬─────┬─────┬───┘ │
│ │ │ │ │ │ │ │
│ 蜂鸣 LED OLED 按钮 WiFi NTP │
│ GPIO21 GPIO9 I2C×2 3键 2.4G 阿里云 │
└──────────────────────────────────────────────┘
2.2 硬件清单
| 模块 | 型号 | 接口 | 备注 |
|---|---|---|---|
| MCU | ESP32-S3-DevKitC-1 | — | 双核 240MHz, 8MB Flash, PSRAM |
| 雷达 | R60AFD1 60GHz 毫米波 | UART2 (GPIO17/1, 115200) | 跌倒/姿态精准型;卫生间用 |
| 温湿度 | DHT11 | GPIO4 | 单总线,2s 一次 |
| 水浸 | 单数字引脚 | GPIO45 (INPUT_PULLUP) | LOW=有水 |
| 蜂鸣器 | 有源蜂鸣器 | GPIO21 | PWM 预留,实际用 digitalWrite |
| 报警 LED | 红 | GPIO9 | 按报警类型节奏闪烁 |
| WiFi LED | 蓝 | GPIO8 | 状态指示 |
| OLED | SSD1306 128×64 | I2C (GPIO15/16) | 多页显示 |
| 配网按钮 | 微型轻触 | GPIO0 / GPIO14 | 长按 3s |
| 解除按钮 | 微型轻触 | GPIO13 | 一键全解 |
| 翻页按钮 | 微型轻触 | GPIO46 | OLED 页面切换 |
2.3 接线图与实物
- 【📷 图片占位 — 接线示意图(杜邦线 / 端子排)】
- 【📷 图片占位 — PCB / 内部布局】
- 【📷 图片占位 — 卫生间安装实景(雷达顶装)】
2.4 引脚定义速查
| 功能 | GPIO | 说明 |
|---|---|---|
| 雷达 RX | 17 | 接雷达 TX |
| 雷达 TX | 1 | 接雷达 RX (调试用) |
| 雷达 GPIO1/2 | 2 / 11 | 活跃/有人指示 |
| DHT11 | 4 | 数据线 |
| 水浸 | 45 | INPUT_PULLUP |
| 蜂鸣器 | 21 | OUTPUT |
| LED 报警 | 9 | OUTPUT |
| LED WiFi | 8 | OUTPUT |
| OLED SDA/SCL | 15 / 16 | I2C |
| 按钮:配网 | 0 / 14 | 长按 3s |
| 按钮:解除 | 13 | 单击 |
| 按钮:翻页 | 46 | 单击 |
3. 关键功能演示(视频位)
每条功能一句要点 + 一个演示视频。视频由研发自拍。
| # | 功能 | 要点 | 视频 |
|---|---|---|---|
| 3.1 | 上电自检与启动 | 串口日志显示 "系统就绪" | 【🎬 启动序列】 |
| 3.2 | WiFi 配网(按键 / 远程 / 蓝牙) | 三种配网方式演示 | 【🎬 三种配网】 |
| 3.3 | OLED 多页切换 | 翻页按钮循环:环境/体征/状态/报警 | 【🎬 OLED 翻页】 |
| 3.4 | MQTT 上下行 | 串口 + 服务端抓包联动 | 【🎬 MQTT 报文】 |
| 3.5 | 跌倒报警触发与解除 | 跌倒模拟 → 蜂鸣急促 → 一键解除 | 【🎬 跌倒报警】 |
| 3.6 | 心率/呼吸异常报警 | 阈值内/外对比 | 【🎬 体征异常】 |
| 3.7 | 水浸报警 | 模拟浸水(棉签沾水) | 【🎬 水浸报警】 |
| 3.8 | 远程告警联动 | 服务端下发 → 设备蜂鸣 | 【🎬 远程告警】 |
| 3.9 | 远程告警恢复 | 服务端下发 → 蜂鸣停止 + 重武装 | 【🎬 远程恢复】 |
4. 软件模块划分
4.1 模块清单
| 模块 | 文件 | 职责 |
|---|---|---|
| 配置中心 | include/config.h |
全局宏、阈值、引脚、MQTT 默认参数 |
| 雷达 | src/radar_manager.cpp |
UART 逐字节解析 + 防抖 |
| 传感器 | src/sensor_manager.cpp |
DHT11 + 水浸采集、防抖 |
| 报警 | src/alarm_manager.cpp |
优先级管理、蜂鸣、LED |
| MQTT | src/mqtt_manager.cpp |
连接、订阅、上报、心跳 |
| WiFi | src/wifi_manager.cpp |
连接、配网、WiFiManager |
| 按钮 | src/button_manager.cpp |
去抖、单击/长按分发 |
| OLED | src/display_manager.cpp |
多页渲染 |
| 主程序 | src/main.cpp |
主循环 + 本地报警判定 |
4.2 主循环流程(ASCII)
┌─────────────────────────────────┐
│ loop() 核心1 │
│ 按钮 → WiFi → MQTT → 传感器 │
│ → 本地报警检查 → 报警模块更新 │
│ → 遥测上报 → OLED → 10ms delay │
└──────────────┬──────────────────┘
│ 双核
┌──────────────┴──────────────────┐
│ radarTask() 核心0 │
│ 10ms 周期: UART 字节流解析 │
│ → 防抖 → 数据更新 │
└─────────────────────────────────┘
4.3 报警优先级
| 优先级 | 类型 | 蜂鸣模式 | LED 闪烁 |
|---|---|---|---|
| ★★★★★ 1 | 跌倒 | 急促连续哔(200/200ms) | 200ms |
| ★★★★★ 2 | 心率/呼吸异常 | 5连急哔 + 停顿 | 500ms |
| ★★★ 3 | 水浸 | 3连哔 + 停顿 | 300ms |
| ★★ 4 | 温湿度异常 | 2声长停 | 800ms |
| ★ 5 | 传感器故障 | 单声长哔 | 1000ms |
【🖥 屏幕截图位 — 串口日志演示报警触发】
5. 版本演进(Git 历史)
5.1 演进时间线
2026-07-22 init ───────────┐
▼
2026-07-31 v1.0: 按钮去抖+配网美化+水浸离线+LED独立任务+
报警全拓展+有人才检测 ──┐
2026-08-06 版本1.2 ─────────────────────┤
2026-08-12 蓝牙配网 ─┐ │
├ 修补 bug ┤ 配网完整化 │
├ 配编号 ┤ │
├ 多设备烧 ┤ │
└ 清理 ai/ ┘─────────────────┤
│
2026-08-14 阈值重整 + 跌倒时间消抖 ← 关键里程碑
2026-08-17 MQTT 重连修复 + 防抖层加入 + resident 字段还原
2026-08-18 跌倒 2 帧防抖 + 开机误报修复 ◀── 当前 HEAD (7845836)
⏳ 进行中: 蜂鸣静音开关(MUTE_VITAL_BUZZER)
5.2 关键 Commit 列表
| SHA | 日期 | 类型 | 标题 | 影响 |
|---|---|---|---|---|
49e3abb |
07-22 | feat | init | 项目初始骨架 |
69e927c |
07-31 | feat | 按钮去抖+配网美化+水浸离线+LED独立任务+报警全拓展+有人才检测 | v1.0 主要能力奠定 |
2ce4ac0 |
08-06 | — | 版本1.2 | 阶段化归档 |
93112dc |
08-12 | feat | 增加蓝牙配网功能 | 配网多端支持 |
08a055b |
08-12 | fix | 修补蓝牙配网bug | — |
36f5a28 |
08-12 | feat | 增加蓝牙配网设备编号 | — |
cc3ba5a |
08-12 | feat | 增加多设备烧录 | 量产支撑 |
8facb8b |
08-12 | chore | 忽略 ai/sessions/ | 仓库瘦身 |
577eafd |
08-14 | init | init | 重整基线 |
9a4b5cf |
08-14 | fix/feat | 跌倒时间消抖 + 修复误触发报警 | 误报收敛第一阶段 |
b960682 |
08-17 | fix | MQTT 断线重连 + 报警阈值修改 | 稳定性提升 |
03129c9 |
08-17 | fix/feat | resident 字段还原 + 增加防抖 | 误报收敛第二阶段 |
7845836 |
08-18 | feat/fix | 跌倒 2 帧防抖 + 修复开机错误跌倒报警 | 当前 HEAD |
5.3 各版本能力差异
| 阶段 | 新增能力 | 已删除/替换 |
|---|---|---|
| v1.0 | 4 类报警 → 7 类报警;LED 独立任务;有人才检测;离线水浸 | — |
| v1.2 | 蓝牙配网多端、多设备烧录 | — |
| v1.3 | 跌倒时间消抖、阈值下调、远程断线修复 | 部分阈值放宽 |
| v1.4 | 防抖层(运动 3 帧、presence 8 帧) | resident 误判修复 |
| v1.5(当前) | 跌倒 2 帧防抖 + 开机误报修复 | — |
| ⏳ 进行中 | 蜂鸣静音开关(MUTE_VITAL_BUZZER) | 临时测试用,正常模式仍全开 |
6. 关键 Bug 修复过程(案例)
挑选 3–4 个最有代表性的真实案例,甲方最能感知的修复优先。
6.1 案例:跌倒开机误报
- 现象:设备上电后即触发蜂鸣 + 上报 fall=1。
- 根因:R60AFD1 雷达上电自检约 15–30s,期内
data[3]的 fall 位为随机值。 - 修复(双层防御):
- L1 时间跳过:
checkLocalAlarms()中millis() > 30000才进入跌倒判定。 - L2 数据防抖:
_filterFall()连续 2 帧 fall=true 才置位。
- L1 时间跳过:
- 验证:实测快速坐下不报警;唯一跌倒模拟仍触发。
- 变更文件:
main.cpp(30s 跳过)、radar_manager.cpp/_filterFall(2 帧去抖)。
【🖥 屏幕截图位 — 开机 30s 内的串口日志 + 修复后日志对比】
【🎬 视频位 — 修复前后跌倒模拟对比】
6.2 案例:跌倒信号抖动 → 报警反复
- 现象:跌倒持续中偶尔清掉,10s 后又触发,反复。
- 根因:原 FALL_DETECT_MS 较紧,AFD1 fall 位信号不稳。
- 修复:
- 检测阶段:
FALL_DETECT_MS = 10000(持续 10s 才触发)。 - 清除阶段:
FALL_CLEAR_MS = 18000(消失 18s 后才解除,防止误清)。
- 检测阶段:
- 变更文件:
main.cpp第 70–77 行宏定义、第 354–369 行清除逻辑。
【🖥 屏幕截图位 — 修复前后误报序列对比】
6.3 案例:MQTT 告警阈值调整(误报收敛)
- 现象:心率偶发飙到 130+ 触发报警,用户无感。
- 根因:原阈值过严,睡眠翻身等场景会让雷达瞬时给出异常心率。
- 修复:
- 心率放宽 → 50–120 bpm;呼吸 10–26 次/分。
- 持续 20s 异常才触发,恢复 15s 才解除。
- 副作用:阈值放宽后,需要配合"VITAL_LOST_MS = 60s 生命体征丢失判定"做兜底。
- 变更文件:
config.h、main.cpp。
6.4 案例:resident 字段误判(一波三折)
- 现象:在床监测时人未离床,resident 出现 0/1 跳变。
- 根因:睡眠帧
data[3]的 bit 含义在 ABD1 与 AFD1 上不同;最初误把 ABD1 的 bit0 当 fall。 - 修复:
- ABD1:只取
bit1为 resident,bit0 视为睡眠标志。 - AFD1:bit0=fall、bit1=resident,二者都报 fall=true 时计数。
- ABD1:只取
- 教训:协议文档不严谨导致两次还原(一次"fix"反而误伤,又一次"fix"放开)。
- 变更文件:
radar_manager.cpp/_extractSleep,include/radar_manager.h。
【📷 图片占位 — 协议字段对比截图(AFD1 vs ABD1)】
6.5 案例 ⏳ 进行中:蜂鸣静音开关
- 当前状态:未提交(修改
alarm_manager.h/.cpp)。 - 背景:测试环境心率/呼吸异常频率高,希望保留状态/MQTT/LED 但屏蔽蜂鸣(避免误响)。
- 方案:
- 新增编译期宏
MUTE_VITAL_BUZZER = 1(默认测试模式)。 - 新增
_shouldBuzz(t):心率/呼吸返回 false,其余返回 true。 triggerLocal/clearLocal蜂鸣开/关前过该判断。
- 新增编译期宏
- 安全约束:跌倒/水浸仍必须响(保障人身安全),代码内注释硬性声明。
- 预计提交:测试通过后改回
0重烧,正式版恢复全蜂鸣。
7. 测试与验证记录
【📝 占位:以下各项填实际测试结果】
7.1 测试环境
| 项 | 内容 |
|---|---|
| 固件版本 | v1.5(7845836) + ⏳ MUTE_VITAL_BUZZER |
| 设备编号 | 【编号】 |
| 安装位置 | 【卫生间/卧室/客厅…】 |
| 测试时间 | 【起~止】 |
7.2 测试用例与结果
| 编号 | 用例 | 期望 | 实际 | 通过 |
|---|---|---|---|---|
| TC-01 | 上电启动 30s 内不报警 | 30s 内无任何报警 | 【粘贴】 | ✅/❌ |
| TC-02 | 跌倒模拟触发 | 10s 内报 fall=1 | 【粘贴】 | ✅/❌ |
| TC-03 | 快速坐下不报警 | 坐下不报 fall | 【粘贴】 | ✅/❌ |
| TC-04 | 心率 50bpm 持续 20s 触发 | 触发报警 | 【粘贴】 | ✅/❌ |
| TC-05 | 心率恢复 15s 解除 | 解除报警 | 【粘贴】 | ✅/❌ |
| TC-06 | 水浸触发(棉签沾水) | 触发报警 | 【粘贴】 | ✅/❌ |
| TC-07 | 远程告警下发 | 蜂鸣 + LED | 【粘贴】 | ✅/❌ |
| TC-08 | 远程告警恢复 | 蜂鸣停止 | 【粘贴】 | ✅/❌ |
| TC-09 | MQTT 断线恢复 | 60s 内重连 | 【粘贴】 | ✅/❌ |
| TC-10 | 配网 3 种方式 | 全部成功 | 【粘贴】 | ✅/❌ |
7.3 跑分 / 性能数据
【📝 占位:上报周期实测、内存占用、CPU 占用、MQTT 流量统计】
【🖥 屏幕截图位 — 性能面板】
8. 当前已交付功能 / 待办
8.1 ✅ 已交付能力
- 7 类报警:跌倒 / 水浸 / 心率异常 / 呼吸异常 / 温度异常 / 湿度异常 / 传感器故障
- 优先级蜂鸣 + LED 分级闪烁
- 双核并行:核心 0 雷达 + 核心 1 主循环
- MQTT V0.08 双向告警(含恢复)
- 三种配网:按键 / 远程 / 蓝牙
- OLED 多页显示
- OTA-ready 分区表(默认 8MB)
- 多设备烧录(upload_port 可配)
8.2 ⏳ 进行中 / 待办
- ⏳ 提交 MUTE_VITAL_BUZZER 静音开关(测试用,正常版应改回 0)
- 🕒 水浸「沾水不报警」根因待查 — 数字引脚 + INPUT_PULLUP 默认 HIGH(干),需要确认
env_type=bathroom与水浸硬件接入;需用户提供浴室实机串口日志 - 📋 文档:完整协议 V0.08 公开
- 🛠 生产固件打包脚本
8.3 已知限制
| 项 | 限制 | 影响 |
|---|---|---|
| R60AFD1 | 不发心跳/呼吸数据 | 心率呼吸类报警仅 ABD1 上有效 |
| OLED 128×64 | 多行不可同屏 | 需要翻页 |
| WiFi | 2.4G only | — |
| MQTT | 仅支持一台设备一对一下发 | 多设备需扩展 |
附录 A:仓库与构建信息
- 仓库:(公司内 Git 服务器)
- 当前分支:
main - HEAD Commit:
7845836(feat:增加跌倒防抖帧 / fix:修复开机错误跌倒报警。) - 构建系统:PlatformIO + Arduino Framework
- 板型:
esp32-s3-devkitc-1 - Flash 分区:
default_8MB.csv - LittleFS:用于 WiFi / MQTT / 设备配置持久化
- 第三方依赖(来自
platformio.ini):knolleary/PubSubClient@^2.8bblanchon/ArduinoJson@^7.1.0adafruit/DHT sensor library@^1.4.6adafruit/Adafruit Unified Sensor@^1.1.14olikraus/U8g2@^2.35.30
附录 B:变更与构建命令
# 烧录
pio run -t upload --upload-port COM19
# 监视
pio device monitor --port COM19 --baud 115200
# 清理
pio run -t clean
# 查看当前 git 差异(含未提交)
git diff HEAD
# 查看已提交历史
git log --oneline --graph --all
文档结束
填图/视频小贴士
- 每条
【📷 图片占位】改成,图片统一放docs/images/。- 每条
【🎬 视频占位】在 Markdown 阶段可用占位说明;转 Word 时手动插入"插入 → 联机视频"或本地 MP4。- 每条
【🖥 屏幕截图位】直接贴图,建议 1200×800 左右。- 所有"⏳ 进行中"项,转交前请与甲方确认是否纳入正式交付范围。