1. 项目概述:老人健康监测与定位系统的核心价值
这个基于STM32F103ZET6和SIM800C的方案,本质上解决的是独居老人安全监护的痛点问题。我在社区养老服务项目中实测发现,传统的手环类设备存在两个致命缺陷:一是依赖智能手机作为中继,而很多老人根本不用智能机;二是定位精度差,室内场景经常漂移数百米。我们这个方案直接通过GSM网络上传数据,不需要中间设备,且通过多传感器数据融合将室内定位误差控制在50米内。
硬件选型上,STM32F103ZET6作为Cortex-M3内核的经典MCU,其72MHz主频和512KB Flash完全满足实时处理多传感器数据的需求。而SIM800C模块的GPRS+GPS双模特性,既解决了数据传输问题,又提供了基本的定位功能。整套系统的BOM成本可以控制在200元以内,比市面同类产品便宜60%以上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件架构设计解析
2.1 核心控制器电路设计
STM32F103ZET6的最小系统设计有几个关键点:
- 复位电路采用10kΩ上拉电阻+100nF电容的组合,实测发现加入104滤波电容可有效避免误复位
- 晶振电路选用8MHz无源晶振时,负载电容建议22pF(官方手册推荐值),布线时要尽量靠近芯片
- 在VBAT引脚接3V纽扣电池时,一定要串接1N4148二极管防止反灌电流
电源部分特别容易出问题:
c复制// 典型LDO选型对比
AMS1117-3.3:成本低但静态电流大(约5mA)
TPS79633:静态电流仅1μA但价格高3倍
我们最终选择XC6206P332MR,它在静态电流(2μA)和价格之间取得了平衡。实际布线时要注意,所有模拟电源引脚(VDDA、VREF+等)必须通过π型滤波器(10Ω+2×10μF)供电。
2.2 SIM800C模块接口设计
SIM800C的硬件设计有三大陷阱:
- 电源必须能提供2A峰值电流:我们采用TDK的4.7μF+100μF MLCC组合作为去耦电容
- 天线接口阻抗匹配:使用50Ω的IPEX座子时,PCB走线宽度需要根据板厚计算(1.6mm板厚约2.8mm线宽)
- 开机时序控制:必须严格按照datasheet的时序要求,PWRKEY拉低至少1秒
原理图中容易忽略的细节:
- 模块的VDD_EXT引脚要给STM32提供唤醒信号
- SIM卡座的ESD保护建议选用TPD4E05U06(实测比普通TVS管更可靠)
- 网络状态指示灯建议接在SYNC引脚而非NETLIGHT,后者在GPRS传输时会持续闪烁
3. 传感器网络设计
3.1 健康监测传感器选型
心率检测我们测试了三种方案:
code复制| 传感器类型 | 精度 | 功耗 | 价格 |
|------------|------|------|------|
| MAX30102 | ±2bpm| 6mA | ¥35 |
| PulseSensor| ±5bpm| 1mA | ¥15 |
| 光电对管DIY| ±10bpm| 0.5mA| ¥3 |
最终选择MAX30102,因其集成PPG和血氧检测功能。实际使用中发现,老年人皮肤松弛会导致信号不稳定,解决方法是在传感器背面加3mm厚EVA泡棉增加贴合压力。
跌倒检测采用MPU6050时,要注意:
- 采样率至少设置到100Hz才能捕捉快速跌倒动作
- 算法中需要融合加速度和角速度数据(推荐Mahony互补滤波)
- 安装位置应靠近人体重心(腰部最佳)
3.2 定位增强方案
单纯依赖SIM800C的GPS在室内基本失效,我们增加了:
- LORA信标定位:在房间布置4个信标节点,通过RSSI测距
- 运动轨迹推算:通过MPU6050数据做航位推算(DR)
- WiFi指纹辅助:扫描周边AP的MAC和信号强度
实测数据显示定位精度提升明显:
code复制| 场景 | 纯GPS误差 | 融合定位误差 |
|------------|-----------|--------------|
| 室外开阔地 | 15m | 8m |
| 室内近窗 | 无法定位 | 25m |
| 室内深处 | 无法定位 | 45m |
4. 软件架构与关键算法
4.1 嵌入式端程序设计
采用RT-Thread实时系统,任务划分如下:
code复制任务优先级:
1. 看门狗喂狗(优先级0)
2. 跌倒检测算法(优先级3)
3. 数据采集(优先级5)
4. GPRS通信(优先级7)
心率算法采用改进的峰值检测法:
c复制#define SAMPLE_RATE 100 // Hz
#define BUFFER_SIZE 200
float detectHeartRate(float* ppgData) {
static float lastPeak = 0;
float threshold = 0.6 * maxAmplitude(ppgData);
int peakCount = 0;
for(int i=1; i<BUFFER_SIZE-1; i++) {
if(ppgData[i]>threshold && ppgData[i]>ppgData[i-1] && ppgData[i]>ppgData[i+1]) {
if(lastPeak == 0 || (i-lastPeak) > SAMPLE_RATE*0.3) {
peakCount++;
lastPeak = i;
}
}
}
return (peakCount * SAMPLE_RATE * 60) / BUFFER_SIZE;
}
4.2 云端通信协议设计
为节省流量采用自定义二进制协议:
code复制报文格式:
[头标志0xAA][长度][命令字][数据][CRC16]
示例跌倒报警报文:
AA 0A 01 01 23 45 67 89 AB CD EF 12 34 56 78 90 AB CD
实测表明,相比JSON格式可节省70%流量。SIM800C的TCP/IP栈需要特殊配置:
at复制AT+SAPBR=3,1,"Contype","GPRS"
AT+SAPBR=3,1,"APN","CMNET"
AT+SAPBR=1,1
AT+HTTPINIT
5. 电源管理与低功耗设计
5.1 电源架构优化
系统采用双电源设计:
- 主电源:3.7V锂电通过TPS61088升压至5V
- 备份电源:CR2032纽扣电池直接供电VBAT
功耗实测数据:
code复制| 工作模式 | 电流消耗 | 续航时间 |
|----------------|----------|----------|
| 正常监测 | 18mA | 3天 |
| 低功耗模式 | 2.5mA | 3周 |
| 仅定位模式 | 45mA | 8小时 |
5.2 低功耗策略
关键优化点:
- SIM800C采用DRX模式,将寻呼周期设为5.12秒
- STM32进入Stop模式时,关闭所有外设时钟
- 传感器采用轮询机制而非中断唤醒
代码实现示例:
c复制void enterLowPowerMode() {
HAL_ADC_DeInit(&hadc1);
HAL_UART_DeInit(&huart1);
__HAL_RCC_GPIOA_CLK_DISABLE();
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后需要重新初始化时钟
SystemClock_Config();
}
6. 常见问题与解决方案
6.1 硬件调试问题
- SIM800C无法注册网络:
- 检查天线阻抗匹配(用网分测SWR应<1.5)
- 确认SIM卡已开通GPRS功能
- 尝试AT+COPS=0自动选网
- MAX30102数据不稳定:
- 确保供电电压≥3.3V(最好3.6V)
- 加装光学遮光结构
- 调整LED电流(推荐红光7mA,IR 11mA)
6.2 软件异常处理
- 内存泄漏检测:
c复制void checkHeap() {
static int minHeap = __HEAP_SIZE;
int currHeap = xPortGetFreeHeapSize();
if(currHeap < minHeap) {
minHeap = currHeap;
printf("Warning: Heap down to %d\n", minHeap);
}
}
- 看门狗复位分析:
- 在备份寄存器记录复位原因
- 关键任务执行时间要短于看门狗超时时间(建议1.5倍余量)
7. 生产测试方案
7.1 自动化测试夹具设计
我们开发了基于Python的测试工装:
python复制import serial
import time
def test_gsm_module(port):
ser = serial.Serial(port, 115200, timeout=1)
ser.write(b'AT\r\n')
response = ser.read(100)
if b'OK' not in response:
raise Exception("GSM模块无响应")
# 测试GPS
ser.write(b'AT+CGPS=1,1\r\n')
time.sleep(5)
gps_data = ser.read(500)
if b'+CGPSINFO:' not in gps_data:
raise Exception("GPS启动失败")
7.2 老化测试方案
环境应力筛选(ESS)参数:
- 温度循环:-20℃~60℃,5次循环
- 振动测试:5Hz~500Hz,0.04g²/Hz
- 通电率:70%(模拟实际使用场景)
8. 实际部署经验
在养老院部署时发现几个关键点:
- 设备佩戴位置:手腕检测心率最准,但腰部更适合跌倒检测
- 充电频率:建议护理人员每两天集中充电一次
- 信号死角:电梯、地下室要额外部署LORA中继
一个意外收获是,通过长期心率变异分析,我们成功预警了3例潜在心脏问题。这提示我们可以加入更多健康分析算法。
