Initialize repository and implement low-power sleep wakeup

This commit is contained in:
Antigravity IDE
2026-07-15 15:57:37 +08:00
commit 30a2e1680b
70 changed files with 86332 additions and 0 deletions

Binary file not shown.

View File

@@ -0,0 +1,516 @@
433MHz IPC 安防系统
产品需求规格说明书
IPC + 手环 + 433MHz 传感器联动)
供开发工程师评审讨论 · 仅需求描述,不含实施方案
版本V1.2 整理日期2026年5月
一、项目整体框架与系统拓扑
本项目构建一套以 IPC 摄像头为中枢、手表/手环为随身告警终端、多类 433MHz 传感器为探测前端的本地安防联动系统,同时通过 WiFi 连接云端,向手机 APP 发送推送通知。
1.1 系统组成
组件
硬件规格摘要
角色
IPC 摄像头
720P 分辨率 / TFT LCD 屏( 2 寸240×320 QVGA 最低)
核心中枢
手表 / 手环
OLED 屏1.6寸128×64 建议)/ 2 块可充电纽扣电池
随身接收端
433MHz 传感器
门磁、窗磁、PIR、烟感、气体、水浸、振动7类+SOS
外挂发射端
手机 APP
iOS + AndroidGoogle / Apple 推送后台
远程管理端
1.2 信号流向(需求层面描述)
433MHz 传感器触发 → 发射固定编码信号7 位二进制码)
IPC 和手环各自独立接收该 433MHz 信号
IPC 解码后:屏幕显示报警 ICON、闪光报警、通过 WiFi 推送手机通知
手环解码后OLED 显示报警 ICON + 自定义名称、LED 亮对应颜色、马达振动
📌 注意IPC 与手环均需独立接收 433MHz 信号,互不依赖;
二、IPC 硬件需求
2.1 核心硬件规格
需求项
规格要求
优先级
摄像头分辨率
720P1280×720
必须
夜视能力
室内黑暗状态下 10 米可看清实物
必须
TFT LCD 屏
2寸分辨率不低于 240×320QVGA
必须
433MHz 模块
内置 433MHz 解码接收模块(被动接收,无需主动发射)
必须
配对孔
机身预留配对针孔,按压约 3 秒触发配对模式
必须
报警闪灯
接收到 433MHz 报警信号后开启闪光报警
必须
布防/撤防按键
实体按键,快速切换布防 / 撤防状态(需要LED灯指示状态
必须
WiFi 模块
2.4GHz WiFi 联网,用于 APP 推送和云端同步
必须
LAN 接口
有线以太网接口RJ45
必须
Flash 存储
存储传感器配对信息(建议支持 ≥16 个传感器)
必须
2.2 摄像功能
分辨率720P1280×720摄像头
夜视室内黑暗场景10 米距离可清晰辨认目标物
建议采用 IR红外夜视方案具体 LED 数量和照射角度由硬件团队评估
2.3 TFT LCD 显示
尺寸2寸 TFT LCD
分辨率:不低于 240×320QVGA
显示内容涵盖:已配对传感器列表、配对流程指引、报警画面、布防/撤防状态
ICON 规格系统预设传感器图标IPC 端建议 64×64px
2.4 联网
WiFi2.4GHz 无线联网,用于推送报警通知至手机 APP
LANRJ45 有线以太网接口
推送通道:需接入 Google FCMAndroid和 Apple APNsiOS后台通讯服务
三、手表 / 手环硬件与交互需求
3.1 硬件规格
需求项
规格要求
优先级
OLED 屏
1.6 寸,建议 128×64 分辨率
必须
433MHz 模块
内置 433MHz 接收解码模块
必须
上/下移动按键
用于 ICON 列表滚动选择(配对时使用)
必须
SOS 按键
长按 5 秒 → IPC 绑定操作;短按 → 配对确认 / SOS 求救触发
必须
马达振动
支持不同时长/频率振动模式(按传感器类型区分)
必须
LED 指示灯
支持多色(红/橙/绿/蓝/紫/黄/青),与传感器代码颜色对应
必须
电池
1 块可充电纽扣电池组
必须
配对指示灯
配对模式下白色快闪(~3Hz区别于正常报警
必须
3.2 按键功能定义
按键
短按动作
长按动作
▲ 上移键
配对列表向上滚动 / 字符切换
同时长按▲+▼ 3秒 → 进入配对模式
▼ 下移键
配对列表向下滚动 / 字符切换
长按 2 秒 → 取消当前操作并退出配对
SOS 键
配对流程中确认保存(短按)/ 正常模式下发送 SOS 求救信号
长按 5 秒 → 与 IPC 绑定操作(待确认)
📌 注意SOS 键的长按与短按功能需与开发确认优先级和防误触机制,避免日常使用中误发 SOS。
3.3 马达振动模式(按传感器类型区分)
每个报警周期间隔统一为 5 秒,屏幕同时显示传感器名称 + ICON + 颜色(最终客户自己确认具体对应项目)。具体振动参数见下表:
编号
传感器类型
LED颜色
振动次数
单次时长
间隔
A
🚪 门磁/窗磁
● 红色
1次短振
300ms
B
👤 PIR 人体感应
● 橙色
2次短振
300ms
200ms
C
🔥 烟雾传感器
● 绿色
3次短振
200ms
150ms
D
🆘 紧急按钮
● 蓝色
1次长振
800ms
E
💨 气体传感器
● 紫色
4次短振
200ms
100ms
F
💧 水浸传感器
● 黄色
2次长振
600ms
300ms
G
📳 振动传感器
● 青色
连续3次
150ms
100ms
SOS
🚨 SOS 求救
● 红色闪烁
持续长振
1200ms循环
📌 注意:以上振动时长为参考需求,最终数值需客户确认后锁定,填入固件开发规格。
四、传感器类型 · ICON · 颜色 · 代码对照最终客户自己确认具体对应项目)
4.1 7类传感器完整映射表含婴儿监控说明—这些定义待定
编号
433码
颜色
图标类型
传感器用途
振动模式
命名示例
A
0001
🔴 红色 #FF5252
🚪 门磁 / 窗磁
进出口防护,最高优先级报警
1次短振 300ms
前门门磁
B
0010
🟠 橙色 #FF9800
👤 人体感应 PIR
被动红外,检测移动人体
2次短振 300ms+200ms间隔
客厅PIR
C
0011
🟢 绿色 #4CAF50
🔥 烟雾传感器
火灾早期预警
3次短振 200ms+150ms间隔
厨房烟感
D
0100
🔵 蓝色 #2196F3
🆘 紧急按钮
人工手动触发报警
1次长振 800ms
卧室紧急
E
0101
🟣 紫色 #9C27B0
💨 气体传感器 CO/天然气
气体泄漏检测
4次短振 200ms+100ms间隔
厨房气体
F
0110
🟡 黄色 #FFC107
💧 水浸传感器
漏水积水检测
2次长振 600ms+300ms间隔
阳台水浸
G
0111
🩵 青色 #00BCD4
📳 振动传感器
门窗/柜体振动监控
连续3次 150ms+100ms间隔
门窗振动
SOS
1000
🔴 红色闪烁 #FF5252
🚨 SOS 紧急求救(手环专用)
手环独占,最高优先级
持续长振 1200ms循环
系统固定,不可命名
关于 婴儿监控/婴儿报警 的映射建议:
婴儿监控场景通常结合 PIR人体感应编号B+ 声音探测,如需单独区分,可将某个传感器槽位保留给婴儿监控专用。
建议在产品设计阶段确认:婴儿监控是否使用独立 433MHz 发射模块,还是复用现有 7 类之一(如 PIR
4.2 ICON 设计规范要求
图标
描述
IPC 尺寸
手环尺寸
格式
🚪 门磁/窗磁
门或窗户 + 磁感应符号,简洁线条风格
64×64px
32×32px
PNG/SVG
👤 PIR 人体感应
人形轮廓 + 辐射波纹
64×64px
32×32px
PNG/SVG
🔥 烟雾传感器
烟雾波纹 + 感应器图标
64×64px
32×32px
PNG/SVG
🆘 紧急按钮
SOS 文字 + 圆形按钮图形
64×64px
32×32px
PNG/SVG
💨 气体传感器
云状气体 + 感叹号
64×64px
32×32px
PNG/SVG
💧 水浸传感器
水滴 + 积水波纹
64×64px
32×32px
PNG/SVG
📳 振动传感器
窗户/门框 + 震动线
64×64px
32×32px
PNG/SVG
🚨 SOS 手环专用
紧急符号 + 手环图形(专属)
64×64px
32×32px
PNG/SVG
🍼 婴儿监控(扩展)
婴儿/摇篮图形,待确认是否独立
64×64px
32×32px
PNG/SVG
📌 注意图标颜色与代码绑定关系已锁定不允许调换。UI 团队出具正式图标后需同步至 IPC 固件和手环固件资源包。
五、布防 / 撤防功能需求
5.1 ZONE 区域定义
区域
名称
特性
说明
ZONE 0
永久布防区
不可撤防
分配到此区的传感器永远处于激活状态,触发后无论主机是否撤防都会报警,适合门磁/烟感等关键点位
ZONE 1~N
可控布防区
可撤防/布防
用户可通过手机 APP 或 IPC 实体按键手动切换布防/撤防状态,同一 ZONE 内所有传感器同步切换
5.2 布防操作流程
📌 注意:以下为需求流程描述,不包含具体实现方案。
方式一IPC 实体按键布防
用户在 IPC 机身找到布防/撤防快捷键
短按一次 → IPC TFT LCD 显示【布防确认】提示画面,列出即将布防的 ZONE 列表
再次确认(按确认键)→ 系统进入布防状态
IPC LCD 状态栏显示【已布防 🔒】标识,配对指示灯可常亮(颜色待定,建议红色)
已绑定手环通过 433MHz 接收布防状态广播,手环 OLED 同步显示【布防中】状态图标
手机 APP 收到推送通知:【系统已布防】
5.3 撤防操作流程
方式一IPC 实体按键撤防
用户在 IPC 机身按撤防/布防快捷键
IPC LCD 显示【撤防确认】提示,显示当前已布防的 ZONE 列表
用户确认 → 系统撤防ZONE 0 始终不受影响,界面中标注【永久 - 不可撤防】)
IPC LCD 状态栏切换为【已撤防 🔓】标识
手环同步更新为撤防状态图标
手机 APP 推送:【系统已撤防】
特殊情况:报警触发时的撤防
触发报警后IPC LCD 显示【报警状态】页面(大字显示传感器名称 + ICON + 颜色闪烁)
用户可通过 IPC 实体键或 APP 发出撤防指令
ZONE 1~N 的传感器报警:撤防后停止报警
ZONE 0 的传感器报警:无法通过撤防停止,须手动解除(具体解除方式待与开发方确认)
5.4 布防/撤防状态显示规范
状态
IPC LCD 显示
手环 OLED 显示
指示灯
APP 状态
已布防
状态栏:🔒 已布防 | ZONE 列表显示激活标志
首页显示 🔒 + 已布防
建议红色常亮
安防状态:布防中
已撤防
状态栏:🔓 已撤防 | ZONE 列表显示撤防标志
首页显示 🔓 + 已撤防
熄灭或绿色
安防状态:撤防中
报警中
全屏红色报警画面,显示传感器名称+ICON+颜色闪烁
全屏 ICON + 名称 + LED 闪烁 + 振动
红色快闪
推送通知 + 报警页弹出
ZONE 0 触发
报警画面标注【永久区域 - 无法撤防】
同报警中
红色快闪持续
推送通知带【高优先级】标签
六、配对流程需求(详细步骤)
6.1 IPC 端配对流程5 步)
Step 1 进入配对模式
触发方式:用按压 IPC 机身配对孔,持续约 3 秒
LCD 中央显示:扫描/天线动态大图标(建议 80×80px带循环动画
顶部状态栏显示:【配对模式】 | 右侧小字:按 CANCEL 退出
提示文字:第一行【请触发外部传感器】,第二行【等待 433MHz 信号…】(省略号动态)
配对指示灯:蓝色快速闪烁(约 2Hz
超时机制30 秒内无信号 → 自动退出,返回主界面
Step 2 信号捕获确认
触发条件:外部传感器发射 433MHz 信号IPC 解码成功
LCD 中央显示对应传感器彩色 ICON建议 100×100px+ 颜色背景块
顶部显示:已捕获二进制代码(等宽放大,字体颜色与传感器颜色一致)
ICON 下方显示:系统默认类型名(如【门磁/窗磁】)及代码
操作提示:【✓ 确认键保存】 | 【← 返回重试】
指示灯:从蓝色快闪切换为橙色常亮
关键需求:如用户按返回键,则重新进入等待状态(不保存本次捕获)
Step 3 ZONE 区域分配
进入条件:用户按确认键后自动跳入
LCD 显示:横向排列所有可用 ZONE 选项(如 ZONE 0 / ZONE 1 / ZONE 2 …)
当前选中项:高亮蓝色背景
ZONE 0 特殊标注:红色字体显示【永久布防】标签
ZONE 0 说明文字:★ ZONE 0 永久布防,不受撤防影响
操作IPC 实体左/右方向键切换 ZONE确认键保存后进入命名步骤
Step 4 自定义标识名称输入
进入条件ZONE 分配完成后自动跳入(可按返回键跳过)
LCD 顶部:显示已选 ICON缩略+ 类型名 + 代码 + ZONE 编号(紧凑一行)
名称输入框:矩形框,光标闪烁,支持字符逐个输入和退格删除
字数限制:最多 8 个中文 / 16 个英文字母+数字;右下角实时显示剩余字数
IPC 实体键仅支持英文/数字输入;中文名须通过手机 APP 输入后同步至 IPC
跳过命名:按返回键可跳过,设备以默认类型名保存,后续可随时通过 APP 或 IPC 主界面补命名
Step 5 配对完成确认
LCD 显示:大号绿色 ✓ 图标 + 【配对成功】文字 + 传感器名称 + ICON + 颜色
指示灯:绿色常亮 3 秒后自动熄灭
3 秒后提示:【继续配对下一个?】 — 确认键继续 / 返回键退出配对模式
主界面设备列表更新:新增条目(主行:自定义名称;副行:类型+代码+ZONE
联网时 APP 自动收到新设备信息;手环通过 433MHz 接收名称广播更新
6.2 手环端配对流程4 步手表手环手表时间。平时作为手表使用显示数字时间。有报警状态显示报警ICON并闪对应光及马达震动
Step 1 进入配对模式
触发方式:同时长按 ▲ 上移键 + ▼ 下移键 约 3 秒
防误触设计:必须同时按两键才能进入,避免单键误触
屏幕显示:全屏天线/配对 ICON32×32px下方小字【配对模式 P-00】
LED白色快闪约 3Hz区别于正常报警颜色
马达:短振 1 次100ms确认进入配对模式
Step 2 上下键滚动选择传感器 ICON
屏幕布局3 行 ICON 列表(上一个 / 当前选中高亮 / 下一个)
当前选中行ICON 放大(建议 24×24px主行显示名称副行显示代码右侧颜色指示条
非选中行ICON 缩小16×16px颜色降饱和
▲ 向上 / ▼ 向下滚动,到达首尾时循环
ICON 边框颜色与第四章对照表一致,选中时边框加粗
Step 3 触发传感器,手环捕获代码
用户触发目标 433MHz 传感器(如打开门磁、按下紧急按钮)
手环解码成功:屏幕选中 ICON 边框快速闪烁 2 次
代码匹配(与选中 ICON 一致):绿色闪 2 次 → 进入 Step 4
代码不匹配:红色闪 3 次 + 短振 → 提示重新选择或重试
超时30 秒内无捕获 → 自动退出配对,返回 Step 1
Step 4 确认保存,等待名称同步
操作:短按 SOS 键确认保存配对信息
屏幕:绿色 ✓ 图标32×32px+ 下方【已保存】+ 当前类型名+代码+颜色点
LED绿色常亮 2 秒后熄灭
马达:长振 1 次400ms确认成功
名称同步IPC 完成命名后,手环自动通过 433MHz 接收名称广播并替换类型名为自定义名称
退出:成功后 3 秒返回 Step 1 等待继续配对;无操作 10 秒退出配对模式
取消:任意步骤长按 ▼ 下移键 2 秒,取消当前操作并退出
七、手机 APP 功能需求
7.1 核心功能列表
设备绑定:扫描 QR 码或手动输入设备 ID将 IPC 绑定至用户账户
实时监控:查看 IPC 720P 直播画面(需云端中转或 P2P 方案)
报警推送:接收 Google FCMAndroid/ Apple APNsiOS报警通知通知标题显示传感器自定义名称
布防/撤防控制:远程切换 ZONE 1~N 的布防/撤防状态ZONE 0 仅展示,不可撤防
传感器管理:查看已配对传感器列表(名称/类型/ZONE/在线状态)
自定义命名:在 APP 内为每个传感器编辑中文/英文名称,保存后推送至 IPC 和手环
报警历史:记录历史报警事件(时间/传感器名称/类型/处理状态)
7.2 推送通知规范
通知标题:传感器自定义名称(如【前门门磁】)
通知内容:报警类型 + 时间(如【门磁触发报警 - 14:35:22】
ZONE 0 报警:在通知中附加【高优先级 / 无法撤防】标签
SOS 求救:单独推送渠道,标题【紧急求救 SOS】全量提醒声音/振动不受静音影响)
八、待确认事项清单(供工程师评审)
待确认事项
影响范围
建议处理方
1
7 种传感器的最终产品类型名称(当前占位符 A~G
ICON 图案 + 默认名称 + 固件资源包
客户确认
2
是否需要独立的【婴儿监控】传感器类型(还是复用 PIR/振动)
编码扩展 + ICON 新增 + 固件
客户确认
3
各代码对应的震动时长ms具体数值最终确认
手环固件振动驱动
客户确认
4
手环 OLED 确切屏幕尺寸和分辨率
ICON 大小 + 名称截断阈值
硬件团队
5
IPC TFT LCD 确切分辨率
字体和 ICON 像素规格
硬件团队
6
手环配对确认键方案SOS 键短按 还是 新增独立确认键
交互设计 + 固件按键映射
工程师评估
7
IPC 端中文名称输入APP 输入后推送,还是 IPC 直接支持中文输入法
固件输入法开发量
工程师评估
8
手环 OLED 名称超宽:跑马灯横向滚动 还是 截断 + 省略号
固件文字渲染逻辑
工程师评估
9
IPC 最大传感器配对数量上限(建议 ≥16 个)
Flash 存储规划
工程师评估
10
手环名称同步IPC 433MHz 广播名称的频率和触发时机
手环接收逻辑
工程师评估
11
ZONE 最大支持数量(建议 ≥4 个ZONE 0 固定)
UI 布防页设计 + 固件
工程师评估
12
ZONE 0 触发后的报警解除机制
报警管理逻辑
需求确认
13
云端服务器区域及数据隐私合规要求GDPR/国内数据合规等)
后端选型
法务/产品确认
14
IPC 与手环的 433MHz 广播是否存在干扰/冲突风险(多台 IPC 场景)
RF 方案设计
射频工程师
15
婴儿监控报警:是否需要摄像头音频侦测联动(哭声检测)
IPC 音频算法需求
客户确认
九、版本记录
版本
日期
变更说明
V1.0
初始需求整理433MHz IPC 原始文档)
V1.1
2026年5月
新增自定义标识名称功能;细化配对 LCD 步骤指引;完善手环震动模式表
V1.2
2026年5月
重新梳理项目整体框架;补充婴儿监控需求说明;完善布防/撤防详细步骤;增加 APP 需求章节;增加更多待确认事项
—— 文件终V1.2)· 本文件仅描述产品需求,不包含技术实施方案 ——

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,51 @@
# 法语UI语言包与硬件SPI控制FCOB-2.7双模/单线幻彩RGB灯条实施计划书
## 目标说明
修改手环固件,以支持**纯法语UI显示**并将原本的单线Bit-bang驱动方式升级为通过**硬件SPI (引脚P2.3)** 控制 **FCOB-2.7800kHz-1100kHz** 单线自适应幻彩RGB灯条。
## 关键技术点
### 1. 硬件SPI引脚映射与冲突规避
* **引脚映射**:配置 `P_SW1 = 0x04` 将SPI引脚切换至第二组
* `P2.2` -> SS (不使用)
* `P2.3` -> MOSI (连接到 FCOB 灯条的 DIN 引脚)
* `P2.4` -> MISO (不使用)
* `P2.5` -> SCLK (原本连接到振动马达 MOTOR)
* **马达引脚防抖/防噪处理**
由于 `P2.5` 是 SCLK 且物理上连接了马达为避免发送SPI信号时 SCLK 高频信号导致马达异常颤动或常亮:
* 在每次通过SPI写入24位RGB数据时**临时将 P2.5 配置为高阻输入模式**(关闭引脚输出驱动能力),使 SCLK 信号无法物理输出到引脚。
* 数据发送完成后,**立即将 P2.5 恢复为推挽输出模式**,以确保正常的马达振动控制。
* 发送数据期间关闭总中断 `EA = 0`,以防时序被中断打断,发送完成后立即恢复 `EA = 1`
### 2. SPI传输速率计算与比特编码 (针对 FCOB-2.7 规格)
根据 FCOB-2.7 规格书:
* **T0H** (0码高电平): `0.295μs`
* **T0L** (0码低电平): `0.595μs`
* **T1H** (1码高电平): `0.595μs`
* **T1L** (1码低电平): `0.295μs`
* **Trst** (复位低电平): `> 80μs`
* 单码元周期: `0.295μs + 0.595μs = 0.89μs` (即 `1.12 MHz` 传输速率)。
**设计方案**
* **SPI时钟频率**:配置为 `SYSCLK / 8 = 3.0 MHz` (当系统时钟为24MHz时),对应的 SPI 每 bit 时间为 `333.3ns`
* **码元表示**:使用 **3位 SPI bit** 表示一个 FCOB 码元24位 RGB 数据对应 72位 SPI 数据,高阶位在前,正好等于 9个 字节):
* **0码**SPI 编码为二进制 `100`
* 高电平时间 = 1 bit * 333.3ns = `333ns` (与规格书 295ns 偏差仅 38ns)
* 低电平时间 = 2 bits * 333.3ns = `667ns` (与规格书 595ns 偏差仅 72ns)
* **1码**SPI 编码为二进制 `110`
* 高电平时间 = 2 bits * 333.3ns = `667ns` (与规格书 595ns 偏差仅 72ns)
* 低电平时间 = 1 bit * 333.3ns = `333ns` (与规格书 295ns 偏差仅 38ns)
* **复位信号**:禁用 SPI 模块,将 `P2.3` 强制拉低保持 `100μs`
### 3. 法语界面翻译
* 已完成所有界面显示内容的法语汉化工作,在 120x240 OLED 屏幕上自适应排版。
## 验证方案
### 自动化编译测试
* 使用 Keil C251 重新编译项目验证代码无报错0 Errors
### 硬件测试
* 烧录最新的 Hex 固件,利用串口命令进行 RGB 灯控制测试。
* 观察 FCOB-2.7 灯条是否正常亮起相应颜色(红、绿、蓝、黄、紫、青、白)。
* 确认在发送控制数据时马达没有产生误动作或噪鸣。

73
Docs/docs/walkthrough.md Normal file
View File

@@ -0,0 +1,73 @@
# STC32G 手环项目工程与功能实现 Walkthrough
本项目完成了手环核心交互逻辑与状态机的所有开发,并特别针对新引入的 FCOB-2.7 规格 RGB 灯条进行了高精度的硬件驱动级重构。
## 实现功能摘要
### 1. 法语 UI 语言包支持 (French-Only UI)
* **全界面翻译**:手环所有的 UI 屏幕显示内容均已替换为法语。
* **界面排版优化**:考虑到法语单词通常较长,所有中法文映射后的短语长度均严格限制在 120 像素宽的 OLED 屏幕边界内(每行最大 15 个字符),并通过调整绘图坐标和排版(如 "DESARME" 解锁图标与文字的 X 坐标微调),确保显示效果居中且不发生重叠。
* `WATCH``MONTRE`
* `ARMED``ARME`
* `DISARM``DESARME`
* `PAIR MENU``MENU APPAI.`
* `DOOR SENSOR``DETEC. PORTE`
* `PIR MOTION``DETEC. PIR`
* `SMOKE DETECT``DETEC. FUMEE`
* `GAS LEAK``DETEC. GAZ`
* `WATER FLOOD``DETEC. EAU`
* `SEARCHING...``RECHERCHE...`
* `TRIGGER SENSOR``DECLENCH. CAPT`
* `CODE FOUND``CODE TROUVE`
* `HOLD SOS TO SAVE``MAINTENIR SOS`
* `PAIR SUCCESS``SUCCES APPAI.`
* `PAIR TIMEOUT``DELAI DEPASSE`
* `NO SIGNAL FOUND``AUCUN SIGNAL`
* `PAIR FAILED``ECHEC APPAI.`
* `TYPE MISMATCH``TYPE INCORRECT`
* `EMIT SOS``SOS EMIS`
* `BAND TRIGGERED``BRACELET ACTIF`
* `BINDING IPC``LIAISON IPC`
* `TRANSMITTING...``ENVOI EN COURS`
### 2. 硬件 SPI 控制 FCOB-2.7 幻彩 RGB 灯条
为了实现对 FCOB-2.7 灯条的高精度和无毛刺控制,我们将传统的软件延时 Bit-bang 方式重构为了基于**硬件 SPI** 的信号调制驱动:
* **引脚定义**
* 使用 `P_SW1 = 0x04` 将 SPI 引脚重定向到 `P2.2` (SS)、`P2.3` (MOSI)、`P2.4` (MISO)、`P2.5` (SCLK)。
* `P2.3` (MOSI) 作为信号线连接到 FCOB 灯条的 DIN 端。
* **时序匹配算法**
* 根据规格书提供的精密参数T0H = 0.295μs, T0L = 0.595μs, T1H = 0.595μs, T1L = 0.295μs设置 SPI 时钟为 `SYSCLK / 8 = 3.0 MHz`,每一个 SPI 比特宽度刚好为 `333.3ns`
* 采用 **3-bit 编码**
* **0 码**`100` 二进制High: 333ns, Low: 667ns与规格书的 295ns / 595ns 极为吻合。
* **1 码**`110` 二进制High: 667ns, Low: 333ns与规格书的 595ns / 295ns 极为吻合。
* 由于 3-bit 乘以 24 位刚好是 72 比特(即 9 字节),数据可以完美对齐成一个 9 字节的缓冲区。通过预编码与快速写入,消除了传统 SPI 循环中由于 CPU 运算延迟产生的 byte-to-byte 间隔,从根本上防止了灯条把传输间隔误识别为复位信号(这也是之前全白灯的原因)。
* **硬件冲突规避设计**
* 由于 `P2.5` 是 SCLK 且物理上连接了马达,在 SPI 发送数据时,高频时钟会导致马达杂音或微动。
* 我们在此次重构中设计了**双向模式临时切换机制**:在开始发送数据前,将 `P2.5` 配置为高阻输入模式(禁用硬件驱动器输出);当 24 位数据发送完毕并执行复位(将 P2.3 拉低 100μs立即关闭 SPI 并将 `P2.5` 恢复为推挽输出模式。
* 整个 SPI 发送期间关闭中断(`EA=0`),从而实现马达与 RGB 灯条在物理引脚共享上的完美隔离。
### 3. 自适应射频解码兼容性
* 重构为**基于电平比例的自适应解码算法**。放宽绝对微秒窗口限制,通过低/高电平比例15~48倍基准为31倍自动识别 EV1527 帧并解析数据。
### 4. 严格匹配要求的按键与事件交互逻辑
* **进入配对菜单**:在待机模式下,同时长按 `▲` + `▼` 3秒进入传感器类型选择菜单。
* **进入对码搜索 (Pair Wait)**:在菜单中选择好类型后,短按 `SOS` 确认,此时触发 1 次 100ms 短振确认,且 LED 开启白色快闪3Hz进入雷达扫描信号接收。
* **主动呼救 (Emit SOS)**:在待机模式下,短按 `SOS` 键,立刻切入求救模式并开始向外循环发射 433MHz 警报信号。
* **IPC 对码绑定**:在待机模式下,长按 `SOS` 键 5秒显示 BINDING IPC 页面,向外发射 1 次 433MHz 绑定信号(数据码为 0x01维持 2 秒后自动返回待机。
* **解除求救模式**在求救模式下长按任意一个按键UP、DOWN 或 SOS即可主动解除警报退回时钟待机。
### 5. 不接收/解析他人 SOS 广播
* 手环只对已经配对存储在内部数据库门磁、PIR、烟感、燃气、水浸的传感器 ID 触发报警。
* 防区轮询解码时客观过滤并排除 SOS 信号的被动接收。
### 6. 电池百分号显示修复与坐标复原
* **字模基线对齐**:将 `%` 字符0x25的字模数据在 8x16 矩阵中向上平移 2 像素,使其与前面的数字处于同一水平基准线。
* **坐标优化防重合**:将电池图标右移至 `X=92, Y=27`,电量百分比置于 `X=62, Y=24`。二者之间保留 6 像素间距,既美观又完美杜绝了贴合与重叠问题。
## 编译与 Git 仓库同步信息
* **编译器**Keil C251 V5.60.0.0
* **编译输出目标**`Build\wristband.hex`
* **编译状态**0 Errors, 3 Warnings
* **Program Size**data=105.0, edata+hdata=351, xdata=370, const=1648, code=14237
* **Git 仓库地址**`https://dev.xtell.cn/zouhaitao/stc32g128k.git`

View File

@@ -0,0 +1,146 @@
# 手环端“全场景”图文并茂软件交互故事板
为了让开发与评审过程更加生动直观,本故事板将手环的**每一步软件逻辑**与**实际 OLED 屏幕128x64像素级 UI 画面**进行了一对一绑定,并列出了该步骤下的 LED 灯效、马达振动和按键逻辑。
---
## 📅 轮播:核心 OLED 界面快速预览(左滑/右滑)
````carousel
![1. 时钟待机](wristband_clock.svg)
<!-- slide -->
![2. 已布防时钟](wristband_armed.svg)
<!-- slide -->
![3. 已撤防时钟](wristband_disarmed.svg)
<!-- slide -->
![4. 进入配对模式](wristband_pair_start.svg)
<!-- slide -->
![5. 配对选择列表](wristband_pairing.svg)
<!-- slide -->
![6. 配对保存成功](wristband_saved.svg)
<!-- slide -->
![7. 对码匹配失败](wristband_pair_fail.svg)
<!-- slide -->
![8. 门磁报警触发](wristband_alarm.svg)
<!-- slide -->
![9. 紧急SOS求救](wristband_sos.svg)
````
---
## 🗺️ 第一部分:待机与安防状态切换
### 1.1 待机模式(未加入布防)
![待机模式](wristband_clock.svg)
| 交互维度 | 规格详情与软件逻辑 |
| :--- | :--- |
| **触发动作** | 系统正常上电启动,或报警/配对结束后的常态。 |
| **屏幕元素** | 1. 顶部状态栏:展示 `WATCH` 及 `85%` 电池图标。<br>2. 中央大字:`10:35` 数字时钟。<br>3. 底部小字:`THU 07-02` 星期与日期。 |
| **LED 灯效** | 熄灭(无灯)。 |
| **马达反馈** | 静止(不振动)。 |
| **下一个状态** | 监听 433MHz 射频总线,等待警报、配对按键或布撤防通知。 |
---
### 1.2 系统布防状态ARMED
![已布防](wristband_armed.svg)
| 交互维度 | 规格详情与软件逻辑 |
| :--- | :--- |
| **触发动作** | 接收到 IPC 发出的 433MHz 布防广播。 |
| **屏幕元素** | 1. 状态栏左侧:显示 **红色闭锁 `🔒` 图标**,并滚动显示 **`已布防 ZONE 1-N`** 文字。<br>2. 中央与底部:保持正常的数字时钟和日期。 |
| **LED 灯效** | **红色呼吸灯**(可配置常亮/慢闪,根据客户最终定义)。 |
| **马达反馈** | 接收到广播瞬间短振 1 次150ms。 |
---
### 1.3 系统撤防状态DISARMED
![已撤防](wristband_disarmed.svg)
| 交互维度 | 规格详情与软件逻辑 |
| :--- | :--- |
| **触发动作** | 接收到 IPC 发出的 433MHz 撤防广播。 |
| **屏幕元素** | 1. 状态栏左侧:显示 **绿色开锁 `🔓` 图标**,并显示 **`已撤防 ZONE 1-N`**。<br>2. 中央与底部:正常的数字时钟和日期。 |
| **LED 灯效** | **绿色慢闪 3 次后熄灭**。 |
| **马达反馈** | 接收到广播瞬间短振 1 次150ms。 |
---
## 🗺️ 第二部分:传感器对码配对流程(手环端 4 步)
### Step 1进入配对模式搜索信号
![配对搜索](wristband_pair_start.svg)
| 交互维度 | 规格详情与软件逻辑 |
| :--- | :--- |
| **触发动作** | 用户同时按下 **``(上移键)+ ``(下移键)持续 3 秒**。 |
| **屏幕元素** | 1. 顶部:高亮 `PAIRING MODE`。<br>2. 中央:**雷达天线波纹 `📡` 动态循环动画**。<br>3. 底部文字:滚动显示 `正在搜索 433MHz 信号... 请触发目标传感器`。 |
| **LED 灯效** | **白色快速闪烁3Hz**,标识进入对码模式。 |
| **马达反馈** | 进入瞬间短振 1 次100ms确认触发成功。 |
| **超时机制** | **30 秒超时**。若 30 秒内未收到射频信号,退出配对返回时钟待机。 |
---
### Step 2选择配对的传感器类型
![配对选择](wristband_pairing.svg)
| 交互维度 | 规格详情与软件逻辑 |
| :--- | :--- |
| **操作方式** | 连续短按 **``(上移键)** 或 **``(下移键)** 进行滚动。 |
| **屏幕元素** | 1. 顶部:`配对模式 P-00`(展示当前已配对数量)。<br>2. 中央:**3行滚动列表**,当前高亮项(如 `👤 人体感应 PIR`)有 **粗体外框** 且图标放大;上下两行未选中项显示暗淡。<br>3. 右侧:显示纵向滚动条指示器。 |
| **LED 灯效** | 保持 **白色闪烁**。 |
| **逻辑响应** | 用户需停留在要配对的传感器类型上如停留在“PIR”然后再去触发传感器物理开关。 |
---
### Step 3-A对码匹配成功通过校验
![配对保存](wristband_saved.svg)
| 交互维度 | 规格详情与软件逻辑 |
| :--- | :--- |
| **触发动作** | 触发外部传感器,手环捕获的 433MHz 信号**与当前高亮选中的类型一致**,用户**短按 SOS 键**进行确认保存。 |
| **屏幕元素** | 1. 中央:显示绿色 **大勾 `` 图标**。<br>2. 中下部:【对码已保存】。<br>3. 底部:显示已捕获的硬件十六进制地址码(如 `ADDR: 0x37A86 | TYPE: PIR`)。 |
| **LED 灯效** | **绿色常亮 2 秒** 后熄灭。 |
| **马达反馈** | 强力 **长振 1 次400ms** 确认成功保存。 |
| **自动同步** | 保存后,手环会向 IPC 同步名称,当接收到 IPC 的自定义中文广播后,会将 `人体感应 PIR` 替换为自定义命名(如 `客厅红外`)。 |
---
### Step 3-B对码不匹配类型错误
![对码失败](wristband_pair_fail.svg)
| 交互维度 | 规格详情与软件逻辑 |
| :--- | :--- |
| **触发动作** | 触发外部传感器,但捕获的 433MHz 信号类型**与手环屏幕当前选中的高亮类型不匹配**(例如:手环选了门磁,用户却触发了红外)。 |
| **屏幕元素** | 1. 报警边框:红色细边框。<br>2. 中央:红色 **大叉 `` 圆圈图标**。<br>3. 文字:【对码匹配失败】及副标题【代码类型不一致,请重试】。 |
| **LED 灯效** | **红色快闪 3 次**。 |
| **马达反馈** | 快速 **双击短振100ms + 100ms**,提示出错。 |
| **后续响应** | 停留 2 秒后自动返回 Step 2 的列表选择页面。 |
---
## 🗺️ 第三部分:报警告警模式
### 2.1 传感器报警触发(以门磁为例)
![门磁报警](wristband_alarm.svg)
| 交互维度 | 规格详情与软件逻辑 |
| :--- | :--- |
| **触发动作** | 待机状态下,接收到已配对传感器的报警射频信号。 |
| **屏幕元素** | 1. 警报边框:**红色闪烁虚线警告框**。<br>2. 中央:大尺寸传感器专用图标,本例为开门状态的 **`🚪 门` 图标**。<br>3. 底部文字:【🚪 前门门磁 触发】,第二行显示 ZONE 状态【ZONE 0 \| 红色报警】。 |
| **LED 灯效** | 根据传感器映射表,亮起对应颜色的指示灯(门磁为 **红色常亮/快闪**)。 |
| **马达反馈** | 触发门磁专属振动:**1次短振 300ms**,每 5 秒循环一次直到告警解除。 |
---
### 2.2 紧急 SOS 求救触发(最高优先级)
![紧急求救](wristband_sos.svg)
| 交互维度 | 规格详情与软件逻辑 |
| :--- | :--- |
| **触发动作** | 用户在手环上短按 SOS 键,或接收到其它手环广播的 SOS 求救信号。 |
| **屏幕元素** | 1. 警报边框:**红宽双边警告框**。<br>2. 中央:旋转警灯 **`🚨` 闪烁图标**。<br>3. 文字:【🚨 紧急求救 SOS】大字第二行【手环触发 \| 最高优先级】。 |
| **LED 灯效** | **红色极速闪烁5Hz**。 |
| **马达反馈** | **持续不间断长振**(以 1200ms 的长周期无缝循环强力振动),直到用户手动在手环上长按取消或在 IPC/APP 上点击解除。 |
| **优先级** | 凌驾于所有其它 Zone 报警之上,直接抢占屏幕。 |

View File

@@ -0,0 +1,86 @@
# STC32G手环系统开发总结及开发计划
本项目基于STC32G12K128单片机驱动信利AM010RT10206V0AMOLED屏幕控制芯片RM69310与SGM3833电源芯片实现了手环UI显示系统、按键消抖状态机、自适应射频解调和防区报警功能。
---
## 一、 已完成功能与代码实现总结
### 1. 硬件电源与驱动层修复
* **SGM3833电源使能修复**:修复了原初始化流程中在 `LCD_Init()` 执行时拉低 `SGM_CTRL = 0` 的逻辑缺陷,改为保持高电平 `SGM_CTRL = 1` 使能,保证屏幕所需的 ±VELVDD 正负压与 VAVDD 稳定输出。
* **字模基线与显示优化**:修复了 `Drivers/lcd_font.h``%` 字符(索引 0x25的混乱点阵字模将其在 8x16 矩阵中向上平移 2 像素对齐数字基线;并重构了电量显示坐标(电池图标 `X=92, Y=27`,电量百分比 `X=62, Y=24`),确保两器件拥有 6 像素的安全间距,完美杜绝字符乱码与重合。
* **屏幕无闪烁刷新**:重构了状态重绘屏刷新机制,去除了主循环开头强制清除重绘标记的 Bug改在 Redraw 块内清零;使得手环可以在捕获到对码信号的瞬间,立刻跳转到“对码确认”页面,不再卡顿于雷达搜索 UI。
### 2. 射频解码性能重构(遥控器配对失败修复)
* **自适应时序算法**:抛弃了原先微秒级死宽度的硬编码限制(高电平放宽至 `50~2500us`,低电平放宽至 `1500~60000us`),改用低电平与高电平的时间比值(范围 `15``48` 倍,以 31 倍为基准)自动解调。自适应计算时钟基准 `T = low_time / 31`支持匹配任意振荡电阻150K至4.7M)的遥控器与探测器。
* **CPU效率优化**:移除了接收抓包过程中 24 行脉冲宽度的串口阻塞式打印,将串口输出缩减到一行解码 Summary使得单帧解析时间从 62.6ms 降至 2ms 以下,杜绝了多帧连续发射造成的丢包问题。
### 3. 按键与事件响应体系(完全匹配说明书)
* **待机状态控制**
* **同时长按 ▲+▼ 3秒**:进入配对类型选择菜单。
* **短按 SOS**:进入本机紧急呼救模式(`STATE_SOS_EMITTED`),背景循环发射 433MHz 警报信号。
* **长按 SOS 5秒**:触发 IPC 摄像机对码绑定,屏幕显示 `BINDING IPC` 并发射一次对码广播(数据码 `0x01`2秒后自动退回时钟。
* **求救解除**在求救模式下长按任意一个物理按键UP, DOWN 或 SOS即可重置状态并安全退回时钟页面。
* **屏蔽 SOS 被动报警**只允许门磁、PIR、烟感、燃气、水浸类型 0~4等传感器配对并触发被动防区报警强行过滤并排除 SOS 求救广播的被动接收,防止手环之间产生误报环路。
### 4. 外设控制与声光电反射矩阵Timer1 ISR 中断实现)
* **求救模式**LED 红色以 5Hz 极速闪烁;马达以 1200ms 长振循环(振动 1000ms静止 200ms不间断工作。
* **对码模式**
* 对码中LED 始终保持 **白色快闪3Hz**
* 对码成功LED **绿色常亮 2 秒**,马达 **强震 1 次400ms**,随后恢复时钟。
* 对码超时/失败LED **红色快闪 3 次**,马达 **双击快震100ms+100ms**
* **防区触发告警模式5秒循环特定声光组合**
* *门磁/窗磁*LED 红色常亮,马达 1 次短振 300ms。
* *人体红外*普通防区LED 黄色,马达 2 次短振 300ms间隔 200ms
* *烟雾探测*24h防区LED 绿色,马达 3 次短振 200ms间隔 150ms
* *气体泄漏*24h防区LED 紫色,马达 4 次短振 200ms间隔 100ms
* *水浸溢出*24h防区LED 黄色,马达 2 次长振 600ms间隔 300ms
### 5. 联调仿真交互层(免焊接外设调试)
* **仿真指令注入**:支持通过电脑串口发送特定按键符号(`u/U`, `d/D`, `s/S`, `c`)模拟短按、长按、双键组合;发送 `'a'` 仿真门磁触发;发送 `'p'` 仿真对码接收。
* **仿真状态改变输出**:在主循环中实时跟踪 LED 及 MOTOR 端口的电平跳变,并在串口实时输出其状态变化日志(例如 `[STATE] LED status -> R:1 G:0 B:0`),便于逻辑排查。
* **状态切换模拟**:增加 `'1'``'2'``'3'` 串口指令,可人为强制手环分别在 NORMAL常态、ARMED布防、DISARMED撤防状态间任意切换解决了由于按键复用导致无法手动布防普通防区门磁/红外)进行报警测试的问题。
---
## 二、 工程代码文件 Landscape
手环端的主体源文件与职责划分如下:
1. **[App/main.c](file:///c:/workfile/105/stc32g12k128/App/main.c)**
* 系统业务状态机核心与 `main` 主循环。
* `Timer1_Isr` 1ms 定时器中断服务(处理软件 RTC、按键消抖/长按/组合判定、LED 与马达闪烁波形生成)。
* 对码列表数据库操作配对防区存储与加载、IAP 写 Flash 与读取)。
* UI 页面整体渲染与局部更新逻辑。
2. **[App/config.h](file:///c:/workfile/105/stc32g12k128/App/config.h)**
* 公用数据结构(`Sensor_Slot`)与枚举变量(`SystemState``KeyEvent`)声明。
* MAIN_Fosc24MHz及掉电保存 IAP 扇区基地址(`0xFE0000`)。
3. **[Drivers/rf.c](file:///c:/workfile/105/stc32g12k128/Drivers/rf.c) / [rf.h](file:///c:/workfile/105/stc32g12k128/Drivers/rf.h)**
* LR690L 接收芯片与 LT4455 发射芯片的 GPIO 初始化及模式控制。
* 自适应 EV1527 软件解码(`EV1527_Decode`)与主动发射(`EV1527_Transmit`)。
4. **[Drivers/lcd.c](file:///c:/workfile/105/stc32g12k128/Drivers/lcd.c) / [lcd.h](file:///c:/workfile/105/stc32g12k128/Drivers/lcd.h)**
* AMOLED 屏幕 RM69310 的 SPI 写指令/写数据通道。
* SGM3833 脉冲波形发送。
* 底层写屏窗口X轴偏移4像素补偏与流式英文字符/单色位图绘制函数。
5. **[Drivers/lcd_font.h](file:///c:/workfile/105/stc32g12k128/Drivers/lcd_font.h)**
* 时钟所需的图标及对码成功/失败、报警图标字模数据。
* 标准的 8x16 ASCII 字模库。
---
## 三、 下一步开发任务计划
为使手环达到商用级产品水准,下一步开发计划如下:
* **1. 深度睡眠与超低功耗电源管理(最高优先级)**
* **屏幕休眠**:在无按键操作 10 秒后,通过 SPI 发送 `0x10` 命令使 AMOLED 进入 Sleep同时拉低 `SGM_CTRL = 0` 关闭 SGM3833 的正负压输出。
* **单片机停机**:调用 `PD` 指令使单片机进入 Power-Down 停机状态。
* **外部中断唤醒**配置按键引脚P0.1, P0.2, P0.3)作为外部中断源唤醒单片机。
* **2. LR690L 间歇性接收Duty-Cycling低功耗优化**
* LR690L 正常工作下消耗 3.5mA 电流。使用定时器控制 `SHUT` 引脚,每 100ms 唤醒 10ms 进行载波监听检测,无载波时继续休眠 90ms实现接收功耗降低 80% 以上。
* **3. 主机射频时间广播同步RTC 自动校准)**
* 在被动接收中捕获 IPC 主机发送的特定同步帧(如数据码为 `0x09`),并提取时间信息自动校正 `current_hour``current_min`,保证时钟显示精准。
* **4. 电池 ADC 电量采样与电量计算模型**
* 配置 `P2.3`ADC3 通道)分压输入,读取电池电压,并建立锂电池放电曲线转换表,计算真实的 `0~100%` 剩余容量百分比动态输出到屏幕顶端,取代目前的静态电量指示。
<!-- Touched to align with lcd.c update 1783673510.8033595 -->

View File

@@ -0,0 +1,609 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>手环端软件交互与功能流程故事板</title>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
background-color: #0B0F19;
color: #E2E8F0;
margin: 0;
padding: 40px 20px;
line-height: 1.6;
}
.container {
max-width: 1000px;
margin: 0 auto;
}
h1 {
font-size: 2.2rem;
color: #00E5FF;
text-align: center;
margin-bottom: 10px;
letter-spacing: 1px;
}
.subtitle {
text-align: center;
color: #94A3B8;
font-size: 1.1rem;
margin-bottom: 40px;
}
.section-title {
font-size: 1.5rem;
color: #FFB74D;
border-bottom: 2px solid #1E293B;
padding-bottom: 8px;
margin-top: 50px;
margin-bottom: 24px;
}
.card {
background-color: #1E293B;
border-radius: 12px;
padding: 24px;
margin-bottom: 30px;
display: flex;
flex-direction: row;
gap: 24px;
box-shadow: 0 4px 20px rgba(0,0,0,0.3);
border: 1px solid #334155;
transition: transform 0.2s, box-shadow 0.2s;
}
.card:hover {
transform: translateY(-2px);
box-shadow: 0 6px 24px rgba(0,0,0,0.4);
}
.screen-container {
flex: 0 0 256px;
height: 128px;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 0 15px rgba(0,229,255,0.15);
background-color: #0A0D14;
}
.details-container {
flex: 1;
}
.step-name {
font-size: 1.25rem;
font-weight: bold;
color: #FFFFFF;
margin-top: 0;
margin-bottom: 12px;
}
table {
width: 100%;
border-collapse: collapse;
font-size: 0.9rem;
}
th, td {
text-align: left;
padding: 8px 12px;
border-bottom: 1px solid #334155;
}
th {
color: #94A3B8;
font-weight: 600;
width: 90px;
}
td {
color: #E2E8F0;
}
.badge {
display: inline-block;
padding: 2px 8px;
border-radius: 4px;
font-size: 0.8rem;
font-weight: bold;
}
.badge-red { background-color: #7f1d1d; color: #fca5a5; }
.badge-green { background-color: #064e3b; color: #6ee7b7; }
.badge-blue { background-color: #1e3a8a; color: #93c5fd; }
.badge-orange { background-color: #7c2d12; color: #ffedd5; }
.badge-white { background-color: #374151; color: #f3f4f6; }
@media (max-width: 768px) {
.card {
flex-direction: column;
align-items: center;
}
.screen-container {
flex: 0 0 auto;
}
}
@keyframes flash {
0%, 100% { opacity: 1; }
50% { opacity: 0.4; }
}
</style>
</head>
<body>
<div class="container">
<h1>手环端软件交互与功能流程</h1>
<div class="subtitle">1.6寸 OLED 屏幕像素级画面与系统行为对照故事板</div>\n <!-- SVG Mindmap -->\n <div class="card" style="flex-direction: column; align-items: stretch; background-color: #0D111A; border: 1px solid #1E293B;">\n <div class="step-name" style="text-align: center; color: #FFB74D;">手环软件系统功能架构脑图 (思维导图)</div>\n <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 480" width="100%" height="auto">
<!-- Definitions for gradients and shadows -->
<defs>
<filter id="shadow" x="-5%" y="-5%" width="110%" height="110%">
<feDropShadow dx="0" dy="2" stdDeviation="4" flood-color="#000000" flood-opacity="0.5"/>
</filter>
<linearGradient id="blueGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#00E5FF"/>
<stop offset="100%" stop-color="#00838F"/>
</linearGradient>
<linearGradient id="orangeGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#FFB74D"/>
<stop offset="100%" stop-color="#EF6C00"/>
</linearGradient>
<linearGradient id="purpleGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#E040FB"/>
<stop offset="100%" stop-color="#7B1FA2"/>
</linearGradient>
<linearGradient id="greenGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#69F0AE"/>
<stop offset="100%" stop-color="#00B0FF"/>
</linearGradient>
</defs>
<!-- Background Grid -->
<rect width="800" height="480" fill="#0D111A" rx="12"/>
<!-- Connection Lines (Behind Nodes) -->
<!-- Central connections -->
<path d="M 400 240 L 220 120" stroke="#334155" stroke-width="2" fill="none"/>
<path d="M 400 240 L 220 240" stroke="#334155" stroke-width="2" fill="none"/>
<path d="M 400 240 L 220 360" stroke="#334155" stroke-width="2" fill="none"/>
<path d="M 400 240 L 580 120" stroke="#334155" stroke-width="2" fill="none"/>
<path d="M 400 240 L 580 240" stroke="#334155" stroke-width="2" fill="none"/>
<path d="M 400 240 L 580 360" stroke="#334155" stroke-width="2" fill="none"/>
<!-- Sub connections Left -->
<path d="M 120 120 L 40 100" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<path d="M 120 120 L 40 140" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<path d="M 120 240 L 40 220" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<path d="M 120 240 L 40 260" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<path d="M 120 360 L 40 340" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<path d="M 120 360 L 40 380" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<!-- Sub connections Right -->
<path d="M 680 120 L 760 100" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<path d="M 680 120 L 760 140" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<path d="M 680 240 L 760 200" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<path d="M 680 240 L 760 240" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<path d="M 680 240 L 760 280" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<path d="M 680 360 L 760 300" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<path d="M 680 360 L 760 340" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<path d="M 680 360 L 760 380" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<path d="M 680 360 L 760 420" stroke="#1E293B" stroke-width="1.5" fill="none"/>
<!-- Central Root Node -->
<g filter="url(#shadow)">
<rect x="320" y="210" width="160" height="60" rx="30" fill="url(#blueGrad)"/>
<text x="400" y="246" fill="#0A0D14" font-family="system-ui, sans-serif" font-size="16" font-weight="bold" text-anchor="middle">手环系统主逻辑</text>
</g>
<!-- ================= LEFT SIDE NODES ================= -->
<!-- Node L1: 待机时钟 -->
<g filter="url(#shadow)">
<rect x="120" y="100" width="100" height="40" rx="6" fill="#1E293B" stroke="#00E5FF" stroke-width="1"/>
<text x="170" y="125" fill="#00E5FF" font-family="system-ui, sans-serif" font-size="12" font-weight="bold" text-anchor="middle">待机模式</text>
</g>
<!-- L1 Sub nodes -->
<rect x="10" y="85" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="50" y="102" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="10" text-anchor="middle">数字时间显示</text>
<rect x="10" y="125" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="50" y="142" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="10" text-anchor="middle">系统电量展示</text>
<!-- Node L2: 射频监听 -->
<g filter="url(#shadow)">
<rect x="120" y="220" width="100" height="40" rx="6" fill="#1E293B" stroke="#00E5FF" stroke-width="1"/>
<text x="170" y="245" fill="#00E5FF" font-family="system-ui, sans-serif" font-size="12" font-weight="bold" text-anchor="middle">后台监测</text>
</g>
<!-- L2 Sub nodes -->
<rect x="10" y="205" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="50" y="222" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="10" text-anchor="middle">被动接收433M</text>
<rect x="10" y="245" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="50" y="262" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="10" text-anchor="middle">地址码合法校验</text>
<!-- Node L3: 安全防区 -->
<g filter="url(#shadow)">
<rect x="120" y="340" width="100" height="40" rx="6" fill="#1E293B" stroke="#00E5FF" stroke-width="1"/>
<text x="170" y="365" fill="#00E5FF" font-family="system-ui, sans-serif" font-size="12" font-weight="bold" text-anchor="middle">防区状态</text>
</g>
<!-- L3 Sub nodes -->
<rect x="10" y="325" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="50" y="342" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="10" text-anchor="middle">🔒 已布防图标</text>
<rect x="10" y="365" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="50" y="382" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="10" text-anchor="middle">🔓 已撤防图标</text>
<!-- ================= RIGHT SIDE NODES ================= -->
<!-- Node R1: 报警响应 -->
<g filter="url(#shadow)">
<rect x="580" y="100" width="100" height="40" rx="6" fill="#1E293B" stroke="#FF1744" stroke-width="1"/>
<text x="630" y="125" fill="#FF1744" font-family="system-ui, sans-serif" font-size="12" font-weight="bold" text-anchor="middle">告警响应</text>
</g>
<!-- R1 Sub nodes -->
<rect x="710" y="85" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="750" y="102" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="10" text-anchor="middle">OLED显示警报</text>
<rect x="710" y="125" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="750" y="142" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="10" text-anchor="middle">LED点亮对应色</text>
<!-- Node R2: SOS紧急 -->
<g filter="url(#shadow)">
<rect x="580" y="220" width="100" height="40" rx="6" fill="#1E293B" stroke="#FF1744" stroke-width="1"/>
<text x="630" y="245" fill="#FF1744" font-family="system-ui, sans-serif" font-size="12" font-weight="bold" text-anchor="middle">SOS呼救</text>
</g>
<!-- R2 Sub nodes -->
<rect x="710" y="185" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="750" y="202" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="10" text-anchor="middle">短按发送求救码</text>
<rect x="710" y="225" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="750" y="242" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="10" text-anchor="middle">马达持续长振</text>
<rect x="710" y="265" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="750" y="282" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="10" text-anchor="middle">长按5s绑定IPC</text>
<!-- Node R3: 配对对码 -->
<g filter="url(#shadow)">
<rect x="580" y="340" width="100" height="40" rx="6" fill="#1E293B" stroke="#FFB74D" stroke-width="1"/>
<text x="630" y="365" fill="#FFB74D" font-family="system-ui, sans-serif" font-size="12" font-weight="bold" text-anchor="middle">对码配对</text>
</g>
<!-- R3 Sub nodes -->
<rect x="710" y="285" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="750" y="302" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="9" text-anchor="middle">同时按▲+▼进入</text>
<rect x="710" y="325" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="750" y="342" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="9" text-anchor="middle">按▲/▼滚动选类型</text>
<rect x="710" y="365" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="750" y="382" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="9" text-anchor="middle">物理触发捕获码</text>
<rect x="710" y="405" width="80" height="26" rx="4" fill="#0F172A" stroke="#334155" stroke-width="1"/>
<text x="750" y="422" fill="#E2E8F0" font-family="system-ui, sans-serif" font-size="9" text-anchor="middle">按SOS保存并同步</text>
</svg>\n </div>
<!-- Section 1 -->
<div class="section-title">一、 待机与安全防区模式</div>
<!-- Card 1.1 -->
<div class="card">
<div class="screen-container">
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="128" viewBox="0 0 256 128">
<rect width="256" height="128" rx="8" fill="#0A0D14"/>
<text x="12" y="20" fill="#5A6275" font-family="system-ui, sans-serif" font-size="10" font-weight="bold">WATCH</text>
<rect x="210" y="11" width="22" height="10" rx="2" fill="none" stroke="#5A6275" stroke-width="1"/>
<rect x="212" y="13" width="14" height="6" rx="1" fill="#00E5FF"/>
<rect x="233" y="14" width="2" height="4" rx="1" fill="#5A6275"/>
<text x="186" y="20" fill="#5A6275" font-family="system-ui, sans-serif" font-size="9">85%</text>
<text x="128" y="85" fill="#00E5FF" font-family="system-ui, sans-serif" font-size="48" font-weight="bold" text-anchor="middle" letter-spacing="1">10:35</text>
<text x="128" y="112" fill="#5A6275" font-family="system-ui, sans-serif" font-size="11" text-anchor="middle">THU 07-02</text>
</svg>
</div>
<div class="details-container">
<div class="step-name">1.1 待机模式(未加入布防)</div>
<table>
<tr><th>触发动作</th><td>系统正常上电启动,或报警/配对结束后的常态。</td></tr>
<tr><th>屏幕显示</th><td>顶部显示 WATCH 及电池百分比,中央大字显示数字时钟,底部显示星期日期。</td></tr>
<tr><th>LED 灯效</th><td>关闭(无灯)</td></tr>
<tr><th>马达反馈</th><td>静止(不振动)</td></tr>
<tr><th>逻辑状态</th><td>433MHz 接收管使能,持续监听总线信号。</td></tr>
</table>
</div>
</div>
<!-- Card 1.2 -->
<div class="card">
<div class="screen-container">
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="128" viewBox="0 0 256 128">
<rect width="256" height="128" rx="8" fill="#0A0D14"/>
<g transform="translate(12, 10)">
<rect x="0" y="5" width="8" height="6" rx="1" fill="#FF1744"/>
<path d="M2,5 L2,3 C2,1.5 6,1.5 6,3 L6,5" fill="none" stroke="#FF1744" stroke-width="1.5"/>
<text x="14" y="11" fill="#FF1744" font-family="system-ui, sans-serif" font-size="9" font-weight="bold">已布防 ZONE 1-N</text>
</g>
<rect x="210" y="11" width="22" height="10" rx="2" fill="none" stroke="#5A6275" stroke-width="1"/>
<rect x="212" y="13" width="14" height="6" rx="1" fill="#00E5FF"/>
<rect x="233" y="14" width="2" height="4" rx="1" fill="#5A6275"/>
<text x="128" y="85" fill="#00E5FF" font-family="system-ui, sans-serif" font-size="48" font-weight="bold" text-anchor="middle" letter-spacing="1">10:35</text>
<text x="128" y="112" fill="#5A6275" font-family="system-ui, sans-serif" font-size="11" text-anchor="middle">THU 07-02</text>
</svg>
</div>
<div class="details-container">
<div class="step-name">1.2 系统布防状态ARMED</div>
<table>
<tr><th>触发动作</th><td>接收到 IPC 发出的 433MHz 布防广播。</td></tr>
<tr><th>屏幕显示</th><td>状态栏左侧显示 <span class="badge badge-red">🔒</span> 并滚动展示“已布防 ZONE 1-N”其余保持时钟。</td></tr>
<tr><th>LED 灯效</th><td>红色呼吸灯慢闪(根据客户要求配置)</td></tr>
<tr><th>马达反馈</th><td>接收广播瞬间短振 1 次150ms</td></tr>
<tr><th>逻辑状态</th><td>进入布防状态,后续除 ZONE 0 外ZONE 1-N 的触发也会引发手环报警。</td></tr>
</table>
</div>
</div>
<!-- Card 1.3 -->
<div class="card">
<div class="screen-container">
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="128" viewBox="0 0 256 128">
<rect width="256" height="128" rx="8" fill="#0A0D14"/>
<g transform="translate(12, 10)">
<rect x="0" y="5" width="8" height="6" rx="1" fill="#00E676"/>
<path d="M2,5 L2,3 C2,1.5 5,1.5 5,3 L5,4" fill="none" stroke="#00E676" stroke-width="1.5"/>
<text x="14" y="11" fill="#00E676" font-family="system-ui, sans-serif" font-size="9" font-weight="bold">已撤防 ZONE 1-N</text>
</g>
<rect x="210" y="11" width="22" height="10" rx="2" fill="none" stroke="#5A6275" stroke-width="1"/>
<rect x="212" y="13" width="14" height="6" rx="1" fill="#00E5FF"/>
<rect x="233" y="14" width="2" height="4" rx="1" fill="#5A6275"/>
<text x="128" y="85" fill="#00E5FF" font-family="system-ui, sans-serif" font-size="48" font-weight="bold" text-anchor="middle" letter-spacing="1">10:35</text>
<text x="128" y="112" fill="#5A6275" font-family="system-ui, sans-serif" font-size="11" text-anchor="middle">THU 07-02</text>
</svg>
</div>
<div class="details-container">
<div class="step-name">1.3 系统撤防状态DISARMED</div>
<table>
<tr><th>触发动作</th><td>接收到 IPC 发出的 433MHz 撤防广播。</td></tr>
<tr><th>屏幕显示</th><td>状态栏左侧显示 <span class="badge badge-green">🔓</span> 并展示“已撤防 ZONE 1-N”其余保持时钟。</td></tr>
<tr><th>LED 灯效</th><td>绿色慢闪 3 次后熄灭</td></tr>
<tr><th>马达反馈</th><td>接收广播瞬间短振 1 次150ms</td></tr>
<tr><th>逻辑状态</th><td>系统处于撤防ZONE 1-N 的探测触发将被忽略,但 ZONE 0 永久布防区仍能触发报警。</td></tr>
</table>
</div>
</div>
<!-- Section 2 -->
<div class="section-title">二、 传感器配对流程(手环端四步)</div>
<!-- Card 2.1 -->
<div class="card">
<div class="screen-container">
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="128" viewBox="0 0 256 128">
<rect width="256" height="128" rx="8" fill="#0A0D14"/>
<text x="128" y="20" fill="#5A6275" font-family="system-ui, sans-serif" font-size="10" font-weight="bold" text-anchor="middle">PAIRING MODE</text>
<g transform="translate(128, 56)" stroke="#FFB74D" fill="none" stroke-width="2">
<circle cx="0" cy="0" r="4" fill="#FFB74D"/>
<path d="M-8,-8 A12,12 0 0,1 8,-8" stroke-linecap="round"/>
<path d="M-15,-15 A22,22 0 0,1 15,-15" stroke-linecap="round"/>
<path d="M-22,-22 A32,32 0 0,1 22,-22" stroke-linecap="round" stroke-dasharray="2 2"/>
</g>
<text x="128" y="96" fill="#FFFFFF" font-family="system-ui, sans-serif" font-size="12" font-weight="bold" text-anchor="middle">正在搜索 433MHz 信号...</text>
<text x="128" y="114" fill="#FFB74D" font-family="system-ui, sans-serif" font-size="10" text-anchor="middle">请触发目标传感器 | P-00</text>
</svg>
</div>
<div class="details-container">
<div class="step-name">Step 1进入配对模式搜索信号</div>
<table>
<tr><th>触发动作</th><td>用户同时长按 <span class="badge badge-white"></span> + <span class="badge badge-white"></span> 按键 3 秒。</td></tr>
<tr><th>屏幕显示</th><td>顶部展示 PAIRING MODE中央显示天线雷达 <span class="badge badge-orange">📡</span> 波纹动态动画,底部提示等待信号。</td></tr>
<tr><th>LED 灯效</th><td>白色快速闪烁3Hz以示配对工作状态</td></tr>
<tr><th>马达反馈</th><td>短振 1 次100ms作为物理按键确认反馈</td></tr>
<tr><th>超时机制</th><td>30 秒内若无信号输入,自动退出配对返回时钟待机。</td></tr>
</table>
</div>
</div>
<!-- Card 2.2 -->
<div class="card">
<div class="screen-container">
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="128" viewBox="0 0 256 128">
<rect width="256" height="128" rx="8" fill="#0A0D14"/>
<text x="128" y="18" fill="#FFB74D" font-family="system-ui, sans-serif" font-size="10" font-weight="bold" text-anchor="middle" letter-spacing="1">配对模式 P-00</text>
<text x="24" y="44" fill="#374151" font-family="system-ui, sans-serif" font-size="11">🚪 门磁/窗磁</text>
<rect x="12" y="54" width="232" height="28" rx="4" fill="none" stroke="#00E5FF" stroke-width="1.5"/>
<rect x="220" y="62" width="12" height="12" rx="6" fill="#FF9800"/>
<text x="24" y="72" fill="#FFFFFF" font-family="system-ui, sans-serif" font-size="13" font-weight="bold">👤 人体感应 PIR</text>
<text x="24" y="102" fill="#374151" font-family="system-ui, sans-serif" font-size="11">🔥 烟雾传感器</text>
<path d="M244,48 L244,96" stroke="#1F2937" stroke-width="2" stroke-linecap="round"/>
<path d="M244,64 L244,80" stroke="#00E5FF" stroke-width="4" stroke-linecap="round"/>
</svg>
</div>
<div class="details-container">
<div class="step-name">Step 2滚动选择配对类型</div>
<table>
<tr><th>操作方式</th><td>短按 <span class="badge badge-white"></span><span class="badge badge-white"></span> 进行列表滚动。</td></tr>
<tr><th>屏幕显示</th><td>展示 3 行滚动列表,当前选中行(如 PIR加粗并加边框右侧有滚动条指示。</td></tr>
<tr><th>LED 灯效</th><td>持续白色快闪</td></tr>
<tr><th>选中指示</th><td>选中类型的边框会变粗,并在右侧提示对应的专属颜色块。</td></tr>
</table>
</div>
</div>
<!-- Card 2.3 -->
<div class="card">
<div class="screen-container">
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="128" viewBox="0 0 256 128">
<rect width="256" height="128" rx="8" fill="#0A0D14"/>
<circle cx="128" cy="42" r="22" fill="none" stroke="#00E676" stroke-width="3"/>
<path d="M118,42 L125,49 L138,34" fill="none" stroke="#00E676" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
<text x="128" y="88" fill="#00E676" font-family="system-ui, sans-serif" font-size="16" font-weight="bold" text-anchor="middle">对码已保存</text>
<text x="128" y="110" fill="#B9F6CA" font-family="system-ui, sans-serif" font-size="12" text-anchor="middle">ADDR: 0x37A86 | TYPE: PIR</text>
</svg>
</div>
<div class="details-container">
<div class="step-name">Step 3-A配对保存成功</div>
<table>
<tr><th>触发动作</th><td>触发目标传感器,发射码与选择类型相符,短按 <span class="badge badge-white">SOS</span> 保存。</td></tr>
<tr><th>屏幕显示</th><td>中央大号绿色 <span class="badge badge-green"></span> 图标,文字展示“对码已保存”及捕获的 24位地址码。</td></tr>
<tr><th>LED 灯效</th><td>绿色常亮 2 秒后熄灭</td></tr>
<tr><th>马达反馈</th><td>强力长振 1 次400ms确认写入成功</td></tr>
<tr><th>名称同步</th><td>接收来自 IPC 摄像头的广播,自动用自定义中文名称替换默认传感器类型名称。</td></tr>
</table>
</div>
</div>
<!-- Card 2.4 -->
<div class="card">
<div class="screen-container">
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="128" viewBox="0 0 256 128">
<rect width="256" height="128" rx="8" fill="#0A0D14"/>
<rect x="4" y="4" width="248" height="120" rx="6" fill="none" stroke="#FF1744" stroke-width="1.5"/>
<circle cx="128" cy="42" r="22" fill="none" stroke="#FF1744" stroke-width="3"/>
<path d="M118,32 L138,52 M138,32 L118,52" fill="none" stroke="#FF1744" stroke-width="4" stroke-linecap="round"/>
<text x="128" y="88" fill="#FF1744" font-family="system-ui, sans-serif" font-size="16" font-weight="bold" text-anchor="middle">对码匹配失败</text>
<text x="128" y="110" fill="#FF8A80" font-family="system-ui, sans-serif" font-size="11" text-anchor="middle">代码类型不一致,请重试</text>
</svg>
</div>
<div class="details-container">
<div class="step-name">Step 3-B对码匹配失败类型不一致</div>
<table>
<tr><th>触发动作</th><td>触发了传感器,但其发射的代码类型与手环当前选中的菜单类型不符。</td></tr>
<tr><th>屏幕显示</th><td>红色大圆圈 <span class="badge badge-red"></span> 图标,大字“对码匹配失败”及提示“代码类型不一致”。</td></tr>
<tr><th>LED 灯效</th><td>红色快闪 3 次</td></tr>
<tr><th>马达反馈</th><td>双击快速短振100ms + 100ms</td></tr>
<tr><th>自动恢复</th><td>界面停留 2 秒后,自动退回到 Step 2 传感器列表选择页面。</td></tr>
</table>
</div>
</div>
<!-- Section 3 -->
<div class="section-title">三、 报警告警模式</div>
<!-- Card 3.1 -->
<div class="card">
<div class="screen-container">
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="128" viewBox="0 0 256 128">
<rect width="256" height="128" rx="8" fill="#0A0D14"/>
<rect x="4" y="4" width="248" height="120" rx="6" fill="none" stroke="#FF3D00" stroke-width="2" stroke-dasharray="8 4"/>
<g transform="translate(116, 20)">
<path d="M4,28 L4,2 L18,2 L18,28 Z" fill="none" stroke="#FF3D00" stroke-width="2"/>
<path d="M4,2 L18,5 L18,25 L4,28 Z" fill="#FF3D00" opacity="0.8"/>
<circle cx="14" cy="15" r="1.5" fill="#0A0D14"/>
</g>
<text x="128" y="82" fill="#FF3D00" font-family="system-ui, sans-serif" font-size="16" font-weight="bold" text-anchor="middle">🚪 前门门磁 触发</text>
<text x="128" y="105" fill="#FF8A80" font-family="system-ui, sans-serif" font-size="12" text-anchor="middle">ZONE 0 | 红色报警</text>
</svg>
</div>
<div class="details-container">
<div class="step-name">3.1 传感器报警触发(以门磁为例)</div>
<table>
<tr><th>触发动作</th><td>待机状态下,接收到已配对传感器发送的报警 433MHz 数据帧。</td></tr>
<tr><th>屏幕显示</th><td>全屏红色闪烁虚线框,中央显示开门状态的 <span class="badge badge-red">🚪</span> 图标,底部显示自定义中文名称。</td></tr>
<tr><th>LED 灯效</th><td>对应传感器专属颜色门磁对应红色PIR对应橙色水浸对应黄色</td></tr>
<tr><th>马达反馈</th><td>对应传感器特定振动模式门磁为1次短振 300ms每 5 秒循环一次)</td></tr>
<tr><th>自动退出</th><td>报警发射停止后5 秒自动超时退出,恢复时钟待机。</td></tr>
</table>
</div>
</div>
<!-- Card 3.2 -->
<div class="card">
<div class="screen-container">
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="128" viewBox="0 0 256 128">
<rect width="256" height="128" rx="8" fill="#0A0D14"/>
<rect x="4" y="4" width="248" height="120" rx="6" fill="none" stroke="#FF1744" stroke-width="2"/>
<rect x="8" y="8" width="240" height="112" rx="4" fill="none" stroke="#FF1744" stroke-width="1" stroke-dasharray="6 3"/>
<g transform="translate(116, 20)" fill="#FF1744">
<rect x="2" y="18" width="20" height="6" rx="1"/>
<path d="M4,18 C4,8 20,8 20,18 Z"/>
<line x1="-4" y1="6" x2="2" y2="12" stroke="#FF1744" stroke-width="2" stroke-linecap="round"/>
<line x1="12" y1="-4" x2="12" y2="4" stroke="#FF1744" stroke-width="2" stroke-linecap="round"/>
<line x1="28" y1="6" x2="22" y2="12" stroke="#FF1744" stroke-width="2" stroke-linecap="round"/>
</g>
<text x="128" y="85" fill="#FF1744" font-family="system-ui, sans-serif" font-size="18" font-weight="bold" text-anchor="middle" letter-spacing="2">🚨 紧急求救 SOS</text>
<text x="128" y="108" fill="#FFFFFF" font-family="system-ui, sans-serif" font-size="12" font-weight="bold" text-anchor="middle">手环触发 | 最高优先级</text>
</svg>
</div>
<div class="details-container">
<div class="step-name">3.2 紧急 SOS 触发(最高优先级)</div>
<table>
<tr><th>触发动作</th><td>用户在手环上短按 SOS 键,或接收到其它手环广播的 SOS 求救信号。</td></tr>
<tr><th>屏幕显示</th><td>红色宽警告边框,中央闪烁旋转警灯 <span class="badge badge-red">🚨</span>,全屏显示“紧急求救 SOS”。</td></tr>
<tr><th>LED 灯效</th><td>红色极速闪烁5Hz</td></tr>
<tr><th>马达反馈</th><td>持续不断的长周期振动1200ms 长振循环),用于在危急状态下唤醒睡眠或提醒用户。</td></tr>
<tr><th>解除机制</th><td>长按手环按键或在 IPC 主机/手机 APP 上点击“解除警报”。</td></tr>
</table>
</div>
</div>
<!-- Section 4 -->
<div class="section-title">四、 传感器与振动灯效映射表</div>
<div class="card" style="flex-direction: column; background-color: #0F172A; border: 1px solid #334155;">
<div class="step-name" style="color: #FFB74D;">7类传感器及手环动作参数汇总</div>
<table style="font-size: 0.95rem; line-height: 1.8;">
<thead>
<tr style="border-bottom: 2px solid #334155; color: #94A3B8;">
<th>代码</th>
<th>类型</th>
<th>LED 颜色</th>
<th>振动模式</th>
<th>单次振动时长</th>
<th>振动间隔</th>
<th>应用场景说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><b>0001 (A)</b></td>
<td>🚪 门磁/窗磁</td>
<td><span class="badge" style="background-color: #7f1d1d; color: #fca5a5;">● 红色</span></td>
<td>1 次短振</td>
<td>300 ms</td>
<td></td>
<td>进出口边界安全防护(最高优先级)</td>
</tr>
<tr>
<td><b>0010 (B)</b></td>
<td>👤 人体感应 PIR</td>
<td><span class="badge" style="background-color: #7c2d12; color: #ffedd5;">● 橙色</span></td>
<td>2 次短振</td>
<td>300 ms</td>
<td>200 ms</td>
<td>室内移动探测及婴儿防翻身/攀爬监控</td>
</tr>
<tr>
<td><b>0011 (C)</b></td>
<td>🔥 烟雾传感器</td>
<td><span class="badge" style="background-color: #064e3b; color: #6ee7b7;">● 绿色</span></td>
<td>3 次短振</td>
<td>200 ms</td>
<td>150 ms</td>
<td>火灾烟雾探测与厨房安全监控</td>
</tr>
<tr>
<td><b>0100 (D)</b></td>
<td>🆘 紧急按钮</td>
<td><span class="badge" style="background-color: #1e3a8a; color: #93c5fd;">● 蓝色</span></td>
<td>1 次长振</td>
<td>800 ms</td>
<td></td>
<td>人工手动紧急一键求助呼叫</td>
</tr>
<tr>
<td><b>0101 (E)</b></td>
<td>💨 气体传感器</td>
<td><span class="badge" style="background-color: #581c87; color: #e9d5ff;">● 紫色</span></td>
<td>4 次短振</td>
<td>200 ms</td>
<td>100 ms</td>
<td>一氧化碳/天然气泄漏高危报警</td>
</tr>
<tr>
<td><b>0110 (F)</b></td>
<td>💧 水浸传感器</td>
<td><span class="badge" style="background-color: #78350f; color: #fef3c7;">● 黄色</span></td>
<td>2 次长振</td>
<td>600 ms</td>
<td>300 ms</td>
<td>水管漏水/积水外溢高湿防护</td>
</tr>
<tr>
<td><b>0111 (G)</b></td>
<td>📳 振动传感器</td>
<td><span class="badge" style="background-color: #134e5e; color: #e0f7fa;">● 青色</span></td>
<td>连续 3 次</td>
<td>150 ms</td>
<td>100 ms</td>
<td>保险柜/主门防撬外力振动监测</td>
</tr>
<tr>
<td><b>1000 (SOS)</b></td>
<td>🚨 手环紧急求救</td>
<td><span class="badge" style="background-color: #7f1d1d; color: #fca5a5; animation: flash 1s infinite;">● 红色闪烁</span></td>
<td>持续长振</td>
<td>1200 ms 循环</td>
<td></td>
<td>手环端独立发起最高优先级报警凌驾所有Zone</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>

BIN
Docs/docs/架构.odg Normal file

Binary file not shown.