1. 项目背景与核心功能
去年用ESP32-S3做了一款简易健康手环原型机,这次是系列开发的第二篇实战记录。相比前代产品,这次重点升级了运动状态识别算法和低功耗管理模块,实测待机时间从72小时提升到了120小时。这个手环项目最吸引我的地方在于,用不到百元的硬件成本就能实现市面上千元级穿戴设备80%的基础功能。
核心监测功能包括:
- 实时心率检测(采用PPG光学传感器)
- 血氧饱和度监测(夜间模式可用)
- 计步与运动距离计算
- 跌倒检测(针对老年用户)
- 睡眠质量分析(新增深睡/浅睡识别)
2. 硬件选型与关键电路设计
2.1 主控芯片方案对比
最终选择ESP32-S3-WROOM-1-N16R8模组,主要基于三点考量:
- 双核240MHz主频满足实时信号处理需求
- 内置2.4GHz WiFi和BLE5.0双模无线
- 超低功耗模式电流仅5μA(RTC保持运行)
重要提示:购买时注意选择"R"版本(带PSRAM),运动识别算法需要8MB额外内存支持。
2.2 传感器阵列配置
| 传感器 | 型号 | 采样率 | 接口类型 | 功耗 |
|---|---|---|---|---|
| 心率血氧 | MAX30102 | 100Hz | I2C | 0.8mA@50Hz |
| 加速度计 | LIS3DH | 200Hz | SPI | 2μA@1Hz |
| 气压计 | BMP280 | 1Hz | I2C | 3.6μA |
电路设计有个坑要注意:MAX30102的LED驱动需要单独供电(3.3V直接供电会导致采样噪声增大),最佳方案是用MOSFET做恒流驱动。
3. 低功耗架构实现
3.1 电源管理方案
采用TPS62743降压转换器(效率93% @100μA负载)配合双锂电池设计:
- 主电池:602030锂聚合物电池(300mAh)
- 备份电池:纽扣电池CR2032(用于RTC保持)
实测功耗数据:
- 全功能模式:18mA
- 仅心率监测:3.2mA
- 深度睡眠:8μA
3.2 任务调度策略
使用FreeRTOS创建了三个优先级任务:
- 传感器数据采集(优先级5)
- 无线通信(优先级3)
- 用户界面刷新(优先级1)
关键技巧:在vApplicationIdleHook()中动态调整CPU频率,空闲时自动降频到80MHz。
4. 运动识别算法优化
4.1 计步算法改进
旧版简单阈值法误判率高达15%,新版采用三重校验:
- 加速度幅值阈值(>1.5g)
- 周期性检测(FFT频域分析)
- 步态模式匹配(DTW算法)
cpp复制// 伪代码示例
void stepDetection(float accel[3]) {
static float buffer[50];
// 更新滑动窗口
memmove(buffer, buffer+1, 49*sizeof(float));
buffer[49] = sqrt(accel[0]*accel[0] + accel[1]*accel[1]);
// 频域分析
arm_rfft_fast_instance_f32 fft;
arm_rfft_fast_init_f32(&fft, 50);
arm_rfft_fast_f32(&fft, buffer, fftOutput, 0);
// 决策逻辑
if(peakDetect(buffer) && dominantFreq(1.5, 3.0)) {
stepCount++;
}
}
4.2 跌倒检测实现
基于LIS3DH的突发加速度检测:
- 设置自由落体中断(阈值>3g)
- 触发后立即启动100Hz高频采样
- 使用SVM分类器判断姿态变化
实测效果:从坐到站立动作误报率<3%,真实跌倒识别率92%。
5. 无线数据传输方案
5.1 BLE协议栈配置
采用NimBLE协议栈而非Bluedroid,内存占用减少40%。关键GATT服务设计:
| 服务UUID | 特性 | 权限 |
|---|---|---|
| 0x1816 | 心率 | 通知 |
| 0x1826 | 运动量 | 读/通知 |
| 0x183A | 血氧 | 加密读 |
注意:ESP32的BLE广播包默认只有31字节,需要精简数据字段才能同时广播心率+步数。
5.2 离线数据同步机制
开发了混合同步策略:
- 实时模式:BLE持续连接传输
- 节能模式:每15分钟同步一次
- 应急模式:本地存储24小时数据
使用SPIFFS文件系统存储历史数据,采用环形缓冲区管理(8MB空间可存7天详细数据)。
6. 实际测试中的问题排查
6.1 心率信号干扰问题
初期测试发现运动时心率数据漂移严重,通过以下改进解决:
- 增加光学传感器贴合检测(检测反射信号强度)
- 开发运动伪影消除算法(参考论文《Peak Tracking Algorithm for PPG》)
- 优化LED驱动电流(20mA→15mA)
6.2 电池续航异常
有个硬件坑特别值得分享:纽扣电池座选型不当导致接触电阻过大(实测1.2Ω),更换为镀金弹片式电池座后RTC备份电流从12μA降到0.5μA。
7. 外壳设计与穿戴体验
采用3D打印钛合金外壳(0.8mm厚度),重量控制在18g以内。关键设计点:
- 曲面底壳提升传感器贴合度
- 磁吸充电接口(防止汗水腐蚀)
- 双侧按键防水设计(IP67等级)
实测数据:静止心率检测误差±2bpm,血氧检测误差±1.5%(与医疗级指夹式血氧仪对比)。
这个项目最让我意外的是,简单的加速度计经过算法优化后,竟能实现接近专业运动手环的识别准确率。下一步计划加入ECG功能,正在评估ADS1293模拟前端芯片的集成方案。
