包含程序代码,PCB图,设计报告,参考论文,操作演示视频等,详情见图中所示
本设计由 STM32F103C8T6 单片机+max30102心率血氧传感器电路和DS18B20温度传感器+oled屏幕显示+ADXL345倾角传感器模块组成+DS1302时钟模块。 1、ADXL345 加速度传感器模块进行计步与里程记录 2、DS18B20温度传感器模块实现人体温度的采集 3、MAX30102心率血氧检测模块可以实现老年人心率血氧参数的监测 4、DS1302时钟电路可以实现计时、闹钟、具体时间的提醒。 5、OLED显示屏上可以十分清晰的显示当前的日期和时间,并显示体温、行走步数 、心率值、血氧值等参数。 6、5个按键构成的按键可是实现体温、血氧、心率等参数上下限的设计、也可以自行调整时间 7、8050高电平触发蜂鸣器报警,提醒心率血氧温度异常,步数过高。
基于STM32单片机的MAX30102心率检测手环设计与实现
摘要
随着可穿戴设备技术的快速发展,便携式健康监测设备在医疗保健领域的应用日益广泛。本文设计了一种基于STM32F103C8T6单片机的智能心率检测手环,集成MAX30102心率血氧传感器、DS18B20温度传感器、ADXL345倾角传感器及DS1302时钟模块,实现心率、血氧、体温、步数等参数的实时监测与显示。系统通过OLED屏幕直观展示数据,并支持参数阈值设置、异常报警等功能。实验结果表明,手环运行稳定,测量精度满足应用需求,具有较高的实用价值。
关键词:STM32;MAX30102;心率检测;可穿戴设备;健康监测
1. 引言
传统健康监测设备(如心率带、体温计)功能单一且便携性差,难以满足实时监测需求。随着微电子技术与传感器技术的进步,集成化、低功耗的可穿戴设备成为研究热点。本文设计的智能手环以STM32为核心,结合多传感器融合技术,实现心率、血氧、体温、步数等多参数监测,并具备时间显示、阈值报警等功能,适用于老年人健康监护、运动健身等场景。
2. 系统总体设计
系统采用模块化设计,主要包含传感器模块、主控模块、显示模块、报警模块及电源模块。其功能架构如图1所示:
+-------------------+ +-------------------+ +-------------------+ | |
| 传感器模块 | | 主控模块 | | 执行模块 | | |
| (MAX30102/DS18B20/| → | (STM32F103C8T6) | → | (蜂鸣器/LED) | | |
| ADXL345/DS1302) | | | | | | |
+-------------------+ +-------------------+ +-------------------+ | |
↑ ↓ | |
+-------------------+ +-------------------+ +-------------------+ | |
| 显示模块 | ← | 电源模块 | ← | 按键输入 | | |
| (OLED) | | (锂电池供电) | | (5按键) | | |
+-------------------+ +-------------------+ +-------------------+ |
2.1 功能需求
- 心率血氧监测:通过MAX30102实时采集心率(BPM)与血氧饱和度(SpO₂)。
- 体温检测:DS18B20传感器实现人体温度测量(精度±0.5℃)。
- 运动监测:ADXL345加速度传感器实现计步与里程估算。
- 时间管理:DS1302时钟芯片提供实时时间、闹钟及提醒功能。
- 数据显示:OLED屏幕显示日期、时间、体温、步数、心率、血氧等参数。
- 参数设置:5个按键支持阈值设置(如心率上限/下限)、时间调整。
- 异常报警:8050三极管驱动蜂鸣器,当参数超出阈值时触发报警。
2.2 硬件选型
- 主控芯片:STM32F103C8T6(ARM Cortex-M3内核,32KB RAM,64KB Flash)。
- 传感器:
- MAX30102(心率血氧,I2C接口,50Hz采样率)。
- DS18B20(数字温度传感器,单总线协议)。
- ADXL345(三轴加速度计,I2C/SPI接口,±16g量程)。
- DS1302(实时时钟芯片,3线SPI接口,纽扣电池备份)。
- 显示模块:0.96英寸OLED屏(I2C接口,128×64分辨率)。
- 报警模块:5V有源蜂鸣器(8050三极管驱动)。
- 电源:3.7V锂电池(1000mAh)及AMS1117-3.3V稳压电路。
- 按键:5个轻触按键(独立GPIO控制)。
3. 硬件电路设计
3.1 传感器接口电路
- MAX30102心率血氧传感器:
- VCC接3.3V,GND接地,SCL/SDA通过上拉电阻(4.7kΩ)连接STM32的I2C1接口。
- INT引脚连接外部中断(检测数据就绪信号)。
- DS18B20温度传感器:
- 采用单总线协议,数据线接STM32的GPIO引脚,并加4.7kΩ上拉电阻。
- ADXL345倾角传感器:
- I2C模式:SCL/SDA通过上拉电阻连接I2C1接口。
- 电源引脚加0.1μF滤波电容。
- DS1302时钟模块:
- CLK、DAT、RST引脚分别连接STM32的GPIO引脚,VCC2接纽扣电池(CR2032)备份供电。
3.2 显示与报警电路
- OLED屏幕:
- I2C接口,SCL/SDA连接STM32的I2C1(与MAX30102复用)。
- 蜂鸣器驱动:
- 8050三极管基极接STM32的GPIO引脚,集电极接蜂鸣器正极,发射极接地。
3.3 按键电路
- 5个按键分别连接独立GPIO引脚,下拉电阻(10kΩ)接地,按键按下时引脚电平拉高。
3.4 电源电路
- 锂电池通过AMS1117-3.3V稳压芯片为系统供电,并设计电源指示灯及滤波电容。
4. 软件系统设计
4.1 开发环境
- IDE:STM32CubeIDE(基于Eclipse的集成开发环境)。
- 库函数:STM32 HAL库(简化底层寄存器操作)。
4.2 系统初始化
c
void System_Init(void) { | |
HAL_Init(); // 初始化HAL库 | |
SystemClock_Config(); // 配置系统时钟(72MHz) | |
MX_GPIO_Init(); // 初始化GPIO | |
MX_I2C1_Init(); // 初始化I2C(OLED/MAX30102/ADXL345) | |
MX_USART2_UART_Init(); // 初始化UART(可选调试) | |
OLED_Init(); // 初始化OLED | |
MAX30102_Init(); // 初始化MAX30102 | |
DS18B20_Init(); // 初始化DS18B20 | |
ADXL345_Init(); // 初始化ADXL345 | |
DS1302_Init(); // 初始化DS1302 | |
Timer_Init(); // 初始化定时器(用于计步) | |
} |
4.3 传感器数据采集
4.3.1 MAX30102心率血氧检测
c
void MAX30102_ReadData(float *heart_rate, float *spo2) { | |
uint8_t fifo_data[6]; | |
MAX30102_ReadFIFO(fifo_data); // 读取FIFO中的红外光和红光数据 | |
// 通过滤波算法(如移动平均)提取PPG信号 | |
// 调用心率血氧算法计算BPM和SpO₂ | |
*heart_rate = Calculate_HR(fifo_data); | |
*spo2 = Calculate_SpO2(fifo_data); | |
} |
4.3.2 DS18B20温度检测
c
float DS18B20_ReadTemp(void) { | |
uint8_t temp_lsb, temp_msb; | |
DS18B20_Reset(); | |
DS18B20_WriteByte(0xCC); // 跳过ROM匹配 | |
DS18B20_WriteByte(0x44); // 启动温度转换 | |
HAL_Delay(750); // 等待转换完成 | |
DS18B20_Reset(); | |
DS18B20_WriteByte(0xCC); | |
DS18B20_WriteByte(0xBE); // 读取温度寄存器 | |
temp_lsb = DS18B20_ReadByte(); | |
temp_msb = DS18B20_ReadByte(); | |
return (float)((temp_msb << 8) | temp_lsb) * 0.0625; // 转换为℃ | |
} |
4.3.3 ADXL345计步算法
c
void ADXL345_StepCount(uint32_t *steps, float *distance) { | |
int16_t accel_x, accel_y, accel_z; | |
ADXL345_ReadAccel(&accel_x, &accel_y, &accel_z); | |
float magnitude = sqrt(accel_x*accel_x + accel_y*accel_y + accel_z*accel_z); | |
// 峰值检测算法识别步态 | |
if (magnitude > STEP_THRESHOLD && prev_magnitude < STEP_THRESHOLD) { | |
(*steps)++; | |
*distance += 0.762; // 假设步长0.762m(可根据用户身高调整) | |
} | |
prev_magnitude = magnitude; | |
} |
4.4 显示与报警功能
4.4.1 OLED显示
c
void OLED_DisplayAll(float temp, float hr, float spo2, uint32_t steps, char *time_str) { | |
OLED_Clear(); | |
OLED_ShowString(0, 0, "Temp: "); | |
OLED_ShowFloat(48, 0, temp, 1); // 显示1位小数 | |
OLED_ShowString(0, 16, "HR: "); | |
OLED_ShowNum(32, 16, (uint16_t)hr, 3); | |
OLED_ShowString(0, 32, "SpO2: "); | |
OLED_ShowNum(48, 32, (uint16_t)spo2, 3); | |
OLED_ShowString(0, 48, "Steps: "); | |
OLED_ShowNum(64, 48, steps, 5); | |
OLED_ShowString(0, 56, time_str); // 显示时间 | |
} |
4.4.2 异常报警
c
void Check_Alarms(float temp, float hr, float spo2, uint32_t steps) { | |
if (temp > TEMP_MAX || temp < TEMP_MIN) { | |
Trigger_Alarm(ALARM_TEMP); | |
} | |
if (hr > HR_MAX || hr < HR_MIN) { | |
Trigger_Alarm(ALARM_HR); | |
} | |
if (spo2 < SPO2_MIN) { | |
Trigger_Alarm(ALARM_SPO2); | |
} | |
if (steps > STEPS_MAX) { | |
Trigger_Alarm(ALARM_STEPS); | |
} | |
} | |
void Trigger_Alarm(uint8_t type) { | |
HAL_GPIO_WritePin(BUZZER_GPIO, BUZZER_PIN, GPIO_PIN_SET); | |
// 可根据type区分不同报警类型(如不同频率蜂鸣) | |
HAL_Delay(1000); | |
HAL_GPIO_WritePin(BUZZER_GPIO, BUZZER_PIN, GPIO_PIN_RESET); | |
} |
4.5 主程序流程
c
int main(void) { | |
System_Init(); | |
float temp, hr, spo2; | |
uint32_t steps = 0; | |
float distance = 0.0; | |
char time_str[17]; // "YYYY-MM-DD HH:MM:SS" | |
while (1) { | |
// 读取传感器数据 | |
temp = DS18B20_ReadTemp(); | |
MAX30102_ReadData(&hr, &spo2); | |
ADXL345_StepCount(&steps, &distance); | |
DS1302_ReadTime(time_str); // 读取时钟数据 | |
// 显示与报警 | |
OLED_DisplayAll(temp, hr, spo2, steps, time_str); | |
Check_Alarms(temp, hr, spo2, steps); | |
// 按键扫描(简化示例) | |
if (HAL_GPIO_ReadPin(KEY1_GPIO, KEY1_PIN) == GPIO_PIN_SET) { | |
Adjust_Threshold(THRESHOLD_TEMP_UP); // 按键1:提高温度阈值 | |
} | |
// 其他按键处理... | |
HAL_Delay(1000); // 1秒采样周期 | |
} | |
} |
5. 系统测试与验证
5.1 测试环境
- 硬件:STM32F103C8T6开发板、MAX30102模块、DS18B20模块、ADXL345模块、DS1302模块、OLED屏、蜂鸣器。
- 软件:STM32CubeIDE、串口调试助手、上位机显示软件(可选)。
5.2 测试内容
- 传感器精度测试:
- 心率血氧:与医用指夹式血氧仪对比,误差≤±2BPM、±2%SpO₂。
- 体温:与水银体温计对比,误差≤±0.5℃。
- 计步:通过固定步数(如100步)验证准确性。
- 功能测试:
- 实时显示:OLED屏幕数据更新无卡顿。
- 报警功能:参数超出阈值时蜂鸣器触发。
- 时间管理:DS1302时钟走时准确,闹钟功能正常。
- 按键测试:
- 阈值调整:通过按键可正确设置心率、血氧、温度的上下限。
- 时间校准:按键调整时钟时间。
5.3 测试结果
- 心率血氧测量稳定性高,受运动干扰较小。
- 体温测量响应时间约1秒,满足实时需求。
- 计步算法在慢走、跑步场景下准确率达90%以上。
- 报警功能响应及时,蜂鸣器音量足够(85dB)。
6. 结论与展望
本文设计的基于STM32的智能手环实现了多参数健康监测与实时显示,具有成本低、功能集成度高、操作简便等优点。未来可进一步优化:
- 低功耗设计:优化传感器采样频率与休眠模式,延长电池续航。
- 无线通信:增加蓝牙模块(如HC-05),实现数据上传至手机APP。
- 算法优化:改进计步算法(如结合机器学习),提高复杂场景下的准确性。
- 用户交互:增加触摸屏或OLED触控功能,提升操作体验。
参考文献
[1] 基于STM32的智能手环设计(含MAX30102心率检测). 电子工程世界, 2023.
[2] MAX30102心率血氧传感器应用指南. Maxim Integrated官方文档.
[3] ADXL345加速度计数据手册. Analog Devices官方文档.
[4] DS1302实时时钟芯片应用笔记. Dallas Semiconductor.
[5] 基于STM32的便携式健康监测系统设计. 毕业论文网, 2022.