# 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`