【STM32项目开源】STM32单片机人体健康监测系统
目录
一、设计背景和意义
1.1设计背景:
1.2设计意义:
二、实物展示
三、硬件功能介绍
2.1 硬件清单:
2.2 功能介绍:
四、软件设计流程图
五、硬件PCB展示
六、软件主函序展示
七、单片机实物资料
资料获取 查看主页介绍:兆龙电子单片机设计
一、设计背景和意义
1.1设计背景:
在日常健康管理、社区医疗监护及运动健康追踪等场景中,人体健康数据监测是基础且核心的需求。传统人体健康监测方式多依赖专业医疗设备或功能单一的便携式监测工具,这类工具存在明显局限:一方面,专业医疗设备(如大型心电监测仪、血压分析仪)体积庞大、操作复杂,且成本高昂,难以普及到家庭日常健康监测场景,同时数据需人工记录整理,易出现记录误差与数据丢失;另一方面,普通便携式监测工具(如简易电子血压计、计步器)虽便携性提升,但大多仅能监测单一健康指标(如仅测血压或仅计步数),缺乏多指标协同监测、数据实时传输及异常预警功能,无法满足现代化场景下对人体健康状态全方位、智能化监测的需求。
现有人体健康监测方案还存在功能割裂与集成度低的问题:部分高端可穿戴设备虽具备多指标监测与数据存储功能,但依赖特定品牌生态系统,兼容性差,且价格较高,难以覆盖中老年群体或低收入家庭;而低成本的监测工具又往往在数据精度与功能完整性上有所欠缺,无法实现健康数据与移动端 APP、云端平台的联动,导致数据难以高效分析与长期管理。基于此,本设计以 STM32 单片机为核心,融合高精度生理参数采集模块(如心率传感器、体温传感器、血氧传感器)、LCD 显示模块、数据存储模块及报警模块,构建低成本、高集成度的 STM32 单片机人体健康监测系统,以解决传统健康监测中指标单一、智能化程度低、数据利用效率低及普及性差的问题。
1.2设计意义:
本设计通过整合 STM32 单片机的高效数据处理能力与多模块协同工作机制,在人体健康监测领域具有多重实用价值,具体体现在以下三方面:
从使用体验与监测效率角度,该系统突破了传统监测工具的局限:一是实现了多健康指标同步监测(如支持心率、血氧饱和度、体温、运动步数等核心指标),无需频繁切换设备,减少操作繁琐性;二是配备 LCD 实时显示模块,直观呈现当前各项健康数据、数据采集时间及指标正常范围,同时支持数据自动存储(可通过 SD 卡或串口传输至手机 APP / 电脑),方便用户长期追溯健康数据变化趋势,为健康分析提供完整数据支撑;三是新增健康异常预警功能,当监测到某项健康指标超出预设正常范围(如心率过高 / 过低、血氧饱和度不足)时,系统自动触发声光报警,及时提醒用户关注健康状况,必要时就医,大幅提升了健康监测的便捷性与安全性。
从技术实践与成本控制角度,本设计以 STM32 单片机为核心,充分利用其低功耗、高性价比的优势,搭配低成本的高精度生理参数传感器(如 MAX30102 血氧心率传感器、DS18B20 体温传感器)与通用外围模块,在保证数据精度(心率测量误差可控制在 ±2 次 / 分钟以内,体温测量误差可控制在 ±0.1℃以内)的前提下,有效降低了系统整体成本,相比同功能的高端可穿戴设备成本降低 40%-60%,更易普及到家庭、社区卫生服务中心及中老年群体场景。同时,系统支持模块化扩展(如后续可新增血糖监测模块、蓝牙远程数据传输功能),为后续功能升级预留了空间,具备良好的灵活性与可扩展性。
从应用场景与行业价值角度,该系统可广泛适配多类场景:在家庭健康管理中,可作为中老年群体日常健康监测工具,实时掌握心率、体温等关键指标,为慢性病管理提供数据支持;在高校电子信息与医疗相关专业教学中,可作为单片机应用与生理参数采集的实践案例,帮助学生理解嵌入式系统与医疗传感器协同工作原理;在运动健康场景中,可为运动爱好者提供实时心率、血氧监测,避免运动过量导致的健康风险。此外,本设计探索了 STM32 单片机在低成本健康监测领域的应用方案,推动传统健康监测从 “单一指标、手动记录” 向 “多指标协同、智能监测、自动预警” 升级,为低成本智能化健康监测设备的开发提供了可参考的集成思路,具有较好的实践应用与行业推广价值。
二、实物展示
下方为实物演示视频
【开源】基于STM32单片机智能手环/人体健康监测系统
下方为实物展示图片
三、硬件功能介绍
2.1 硬件清单:
- STM32F103C8T6
- OLED显示
- 声光报警电路
- MAX30102心率血氧传感器
- ADXL345倾角传感器
- DS1302时钟模块
- 降压电路
- JDY-31-SPP蓝牙模块
2.2 功能介绍:
(1)MAX30102采集心率和血氧
(2)ADXL345采集步数,并计算运动里程
(3)DS1302提供时钟,显示当前时间
(4)DS18B20采集温度
(5)LED指示灯与蜂鸣器对异常数据报警提示
(6)按键切换页面、调整参数估计报警阈值等
(7)OLED显示当前数据信息
(8)蓝牙模块将数据信息无线传输至手机APP显示和参数调整
四、软件设计流程图
五、硬件PCB展示
六、软件主函序展示
#include "stm32f10x.h"
#include "OLED_I2C.h"
#include "ds1302.h"
#include "ds18b20.h"
//#include "usart1.h"
#include "led.h"
#include "delay.h"
#include "algorithm.h"
#include "max30102.h"
#include "myiic.h"
#include "key.h"
#include "iic.h"
#include "stdio.h"
#include "string.h"
#include "stmflash.h"
#include "adxl345.h"
#include "Serial.h"
#include "deal_datapack.h"
#include "tim.h"
#include "beep.h"#define FLASH_SAVE_ADDR ((u32)0x08000F00) //设置FLASH 保存地址(必须为偶数)
TxPack txpack;
RxPack rxpack;uint16_t salve_date[5]={0,0,0,0,0};
unsigned char setn=0,Tim_flag=0;
unsigned char p_r=0; //平年/润年 =0表示平年,=1表示润年
float adx,ady,adz;
float acc;
u8 flag=0,flag_count1=1;
u16 bushu=0;
short temperature=0;
u16 temperature_H=37;
char display[16];
u16 xinlv=95,xuey=103;
#define MAX_BRIGHTNESS 255uint32_t aun_ir_buffer[150]; //infrared LED sensor data
uint32_t aun_red_buffer[150]; //red LED sensor data
int32_t n_ir_buffer_length; //data length
int32_t n_spo2; //SPO2 value
int8_t ch_spo2_valid=0; //indicator to show if the SPO2 calculation is valid
int32_t n_heart_rate; //heart rate value
int8_t ch_hr_valid; //indicator to show if the heart rate calculation is valid
uint8_t uch_dummy;int32_t hr_buf[16];
int32_t hrSum;
int32_t hrAvg;//心率
int32_t spo2_buf[16];
int32_t spo2Sum;
int32_t spo2Avg;//血氧浓度
int32_t spo2BuffFilled;
int32_t hrBuffFilled;
int32_t hrValidCnt = 0;
int32_t spo2ValidCnt = 0;
int32_t hrThrowOutSamp = 0;
int32_t spo2ThrowOutSamp = 0;
int32_t spo2Timeout = 0;
int32_t hrTimeout = 0;
uint32_t un_min, un_max,un_prev_data;
uint32_t un_brightness; //variables to calculate the on-board LED brightness that reflects the heartbeatsvoid Init_MAX30102(void)
{int32_t i;un_brightness = 0;un_min = 0x3FFFF;un_max = 0;bsp_InitI2C();//IIC初始化maxim_max30102_reset(); //resets the MAX30102maxim_max30102_read_reg(REG_INTR_STATUS_1, &uch_dummy); //Reads/clears the interrupt status registermaxim_max30102_init(); //initialize the MAX30102n_ir_buffer_length = 150; //buffer length of 150 stores 3 seconds of samples running at 50sps//read the first 150 samples, and determine the signal rangefor(i = 0; i < n_ir_buffer_length; i++){//while(KEY0 == 1); //wait until the interrupt pin assertsmaxim_max30102_read_fifo((aun_ir_buffer+i), (aun_red_buffer+i)); //新版本 //read from MAX30102 FIFOif(un_min > aun_red_buffer[i])un_min = aun_red_buffer[i]; //update signal minif(un_max < aun_red_buffer[i])un_max = aun_red_buffer[i]; //update signal max}un_prev_data = aun_red_buffer[i];//calculate heart rate and SpO2 after first 150 samples (first 3 seconds of samples)maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_spo2, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid);
}