这个基于STM32F103C8T6的心率血氧手环项目,是我去年带领学生团队完成的一个综合性嵌入式系统设计。相比市面上常见的健康手环,我们特别强化了安全防护功能,加入了GPS定位和跌倒检测模块,使得产品特别适合老年人和户外工作者使用。
整个系统架构非常清晰:以STM32作为主控核心,通过I2C总线连接MAX30102光学传感器采集心率血氧数据,ADXL345三轴加速度计负责运动监测和跌倒判断,DS18B20数字温度传感器测量体温,同时集成GPS模块提供位置服务。数据显示采用128×64分辨率的OLED屏,通过蓝牙4.0模块与手机APP保持数据同步。
特别说明:在传感器选型时,我们对比了市面上常见的几种方案。MAX30102虽然价格略高,但其集成了红光和红外光LED,可以同时测量心率和血氧,大大简化了电路设计。这也是专业医疗设备常用的方案。
主控选用STM32F103C8T6这款经典芯片,主要看中其丰富的外设接口和适中的功耗。我们设计了双电源方案:3.7V锂电池经过AMS1117-3.3V稳压后为数字电路供电,传感器部分则单独增加了LC滤波网络,确保信号采集的稳定性。
传感器接口部分有几个关键点需要注意:
作为可穿戴设备,功耗控制至关重要。我们采取了以下措施:
实测下来,500mAh的电池可以支持约72小时连续工作,完全满足日常使用需求。
MAX30102的数据采集最为复杂,需要处理光学信号中的运动伪影。我们的做法是:
c复制// 伪代码示例
void MAX30102_IRQ_Handler() {
readFIFO(raw_data);
applyDC_filter(raw_data); // 去除直流分量
butterworth_filter(5Hz); // 5Hz低通滤波
detect_peaks(); // 寻找脉搏波峰值
calculate_HR_SPO2(); // 计算心率和血氧
}
对于ADXL345的加速度数据,我们开发了专门的计步算法:
跌倒判断是项目的难点之一。经过多次测试,我们最终采用的方案是:
c复制#define FALL_THRESHOLD 2.5 // g值阈值
int detect_fall(float accel[3]) {
float resultant = sqrt(accel[0]*accel[0] +
accel[1]*accel[1] +
accel[2]*accel[2]);
if(resultant > FALL_THRESHOLD) {
start_fall_detection_timer();
return 1;
}
return 0;
}
在PCB布局时特别注意了以下几点:
外壳采用3D打印设计,内部做了防震处理,确保跌落时不会损坏内部元件。
经过两周的实测,主要性能指标如下:
| 功能模块 | 测量范围 | 精度 | 响应时间 |
|---|---|---|---|
| 心率监测 | 30-200bpm | ±2bpm | 1s |
| 血氧监测 | 70%-100% | ±2% | 2s |
| 体温测量 | 32-42℃ | ±0.5℃ | 3s |
| GPS定位 | - | ±10m | ≤10s |
| 跌倒检测 | - | 95%准确率 | 500ms |
蓝牙传输距离在开阔场地可达15米,完全满足日常使用需求。
MAX30102数据不稳定
GPS首次定位慢
低功耗模式下蓝牙连接不稳定
这个项目最让我自豪的是将医疗级监测功能集成到了消费级设备中。特别是在跌倒检测算法上,我们通过大量真人测试优化参数,最终准确率达到了95%以上。后续我们还计划加入ECG监测功能,让健康监测更加全面。