1. 项目概述
这个基于STM32单片机的智能手环项目,是我去年为一个健康监测设备公司开发的方案原型。整套系统实现了心率、血氧、体温和步数的实时监测与异常报警功能,采用模块化设计思路,硬件成本控制在200元以内,非常适合作为穿戴设备的入门开发项目。
核心功能模块包括:
- MAX30102光学传感器采集心率和血氧数据
- DS18B20数字温度传感器测量体温
- ADXL345三轴加速度计实现步数统计
- OLED显示屏展示实时数据
- 蜂鸣器和LED组成声光报警系统
整套方案从传感器选型到PCB设计都经过多次迭代优化,实测心率监测误差控制在±3bpm以内,血氧精度达到±2%,完全满足日常健康监测需求。下面我将从硬件设计、软件实现和调试经验三个维度详细拆解这个项目。
2. 硬件设计详解
2.1 核心器件选型
STM32F103C8T6最小系统
- 选择理由:72MHz主频的Cortex-M3内核,64KB Flash+20KB RAM,完全满足多传感器数据处理需求
- 成本优势:约8元/片,远低于F4系列
- 特别注意:需外接8MHz晶振和32.768kHz RTC晶振
MAX30102传感器模块
- 工作原理:利用红光(660nm)和红外光(880nm)通过PPG光电容积法测量
- 关键参数:
- 采样率可达3.2kHz
- 16位ADC分辨率
- 集成环境光消除电路
- 硬件连接:I2C接口(SCL:PB6, SDA:PB7)
DS18B20温度传感器
- 单总线协议,测量范围-55℃~+125℃
- 精度±0.5℃(0℃~70℃范围)
- 寄生供电模式节省IO口
ADXL345加速度计
- 测量范围±16g
- 13位分辨率
- 支持I2C/SPI接口
- 低功耗模式仅23μA
2.2 电路设计要点
电源管理电路
c复制// 典型供电方案
USB 5V → AMS1117-3.3 → 3.3V系统供电
│
└─ TPS7A4700 → 1.8V(MAX30102专用)
PCB布局技巧
- MAX30102必须远离MCU和其他高频器件
- 光电传感器区域预留开窗位置
- 加速度计尽量靠近板卡中心
- 所有模拟信号走线做包地处理
重要提示:MAX30102的LED驱动部分需要单独铺铜,避免数字噪声干扰
3. 软件实现解析
3.1 系统架构设计
mermaid复制graph TD
A[传感器驱动层] --> B[数据处理层]
B --> C[业务逻辑层]
C --> D[人机交互层]
多任务调度方案
- 采用时间片轮询方式
- 关键任务周期:
- 心率血氧采样:100ms
- 温度采集:1s
- 步数计算:50ms
- 显示刷新:200ms
3.2 核心算法实现
心率计算算法
c复制// 基于动态阈值的峰值检测
float calculateHR(uint32_t *ppg_data, uint16_t len) {
static float threshold = 0.6;
uint16_t peak_count = 0;
float mean = get_mean(ppg_data, len);
for(int i=1; i<len-1; i++) {
if(ppg_data[i]>ppg_data[i-1] &&
ppg_data[i]>ppg_data[i+1] &&
ppg_data[i] > mean*threshold) {
peak_count++;
threshold = 0.4*ppg_data[i]/mean + 0.6*threshold;
}
}
return (peak_count * 60000.0) / len; // 转换为bpm
}
步数检测逻辑
- 三轴加速度数据合成矢量幅值:
c复制float magnitude = sqrt(x*x + y*y + z*z); - 滑动窗口均值滤波(窗口大小N=5)
- 过零检测结合峰值判断
4. 调试经验与优化
4.1 常见问题排查
MAX30102数据不稳定
- 现象:心率值跳动过大
- 解决方案:
- 检查手指接触是否良好
- 增加软件滤波(推荐IIR低通滤波)
- 调整LED电流(典型值7mA)
- 确保采样率设置正确(建议400Hz)
ADXL345计步不准
- 可能原因:
- 佩戴位置不固定
- 运动模式识别阈值设置不当
- 优化方法:
c复制// 动态阈值调整算法 if(magnitude > 1.2*threshold) { step_count++; threshold = 0.3*magnitude + 0.7*threshold; }
4.2 功耗优化技巧
- 传感器间歇工作模式:
- MAX30102:采样间隔可设置为250ms
- ADXL345:启用自动休眠功能
- MCU低功耗配置:
c复制
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); - 显示优化:OLED局部刷新代替全屏刷新
5. 项目进阶方向
- 蓝牙数据传输:添加HC-05模块实现手机APP连接
- 运动模式识别:基于加速度计数据区分行走/跑步
- 睡眠监测:结合心率变异性(HRV)分析睡眠质量
- 防水设计:改用IP67等级外壳和防水按键
实际开发中发现,MAX30102在运动状态下的数据稳定性是需要重点解决的问题。我的经验是结合加速度数据进行运动补偿,采用以下公式修正心率值:
code复制HR_corrected = HR_raw - k * motion_level
其中k为运动补偿系数,需要通过实验校准(典型值0.2-0.5)。这个方案将运动时的心率误差从原来的±10bpm降低到±5bpm以内。