【STM32项目开源】STM32单片机智能心率手环系统

目录

一、设计背景和意义

1.1设计背景:

1.2设计意义:

二、实物展示

三、硬件功能介绍

[2.1 硬件清单:](#2.1 硬件清单:)

[2.2 功能介绍:](#2.2 功能介绍:)

四、软件设计流程图

五、硬件PCB展示

六、软件主函序展示

七、单片机实物资料

[资料获取 查看主页介绍:兆龙电子单片机设计](#资料获取 查看主页介绍:兆龙电子单片机设计)


一、设计背景和意义

1.1设计背景:

在运动健康管理、老年康养监护、职场人员健康监测及智慧医疗穿戴场景中,心率实时监测、健康数据精准分析、异常预警与便捷使用是核心需求。传统心率监测设备存在明显局限:一方面,高端医疗级心率监测设备(如专业多参数监护仪、定制化健康监测平台、动态心电记录仪)功能虽全但成本高昂,体积大且操作复杂,依赖专业医护人员调试与解读数据,难以普及到普通家庭、运动爱好者及职场日常场景,且设备兼容性差,数据无法与个人移动终端联动,更换或升级成本高,无法灵活满足不同人群(如老年人、运动人群、办公族)的健康管理需求;另一方面,普通简易心率监测装置(如单功能心率手环、手机外接心率贴、传统电子计步器)虽操作简单、价格低廉,但功能单一,仅能通过单点采样获取心率数值,缺乏心率变异性分析、异常心率预警、运动负荷适配监测及数据长期存储分析等功能,无法满足现代化健康管理场景下对心率精准监测、健康风险提前预警的需求。

现有关心率监测方案还存在功能割裂与集成度低的问题:部分高端心率监测设备虽具备多维度健康数据采集与分析功能,但依赖复杂的软硬件架构与专业维护,后期使用成本高,难以覆盖预算有限的普通消费群体或基层康养场景;而低成本心率监测装置又在功能完整性与智能化上存在欠缺,无法实现心率数据与移动 APP、健康管理平台的实时联动,导致异常心率漏报、健康数据无法追溯、个性化健康建议缺失等问题,无法为用户健康趋势分析及医护人员远程监护提供数据支撑。基于此,本设计以 STM32 单片机为核心,融合高精度生理监测与辅助模块(如光电心率传感器、血氧检测模块、运动加速度传感器、体温传感器)、LCD 显示模块、数据存储模块及蓝牙通信与异常报警模块,构建低成本、高集成度的物联网智能心率手环系统,以解决传统心率监测设备功能单一、智能化程度低、数据精准度不足及健康管理效率低的问题。

1.2设计意义:

从使用体验与健康管理效率角度,该系统突破了传统心率监测设备的局限:一是实现了多维度监测与多功能联动(如支持心率、血氧、体温、运动状态同步监测,联动蓝牙通信模块、异常报警模块),无需用户手动操作或专业人员现场解读数据,减少健康数据采集的繁琐性与人工分析的误差率;二是配备 OLED 实时显示模块,直观呈现当前心率数值、血氧饱和度、运动步数、体温及健康状态等级,同时支持数据自动存储(可通过蓝牙传输至移动 APP / 健康管理平台),方便用户长期追溯健康数据,也为医护人员分析健康趋势、优化个性化健康管理方案提供完整数据支撑;三是新增异常预警与自动调控功能,当监测到某项参数超出安全范围(如静息心率过高 / 过低、血氧饱和度低于阈值、运动心率超负荷),系统自动触发震动 / 声光报警(同时向绑定的家属 / 医护终端发送预警信息),并联动运动提醒模块给出暂停运动、及时休息等建议,无需人工干预即可及时预警健康风险,大幅提升了健康监测的便捷性与时效性。

从技术实践与成本控制角度,本设计以 STM32 单片机为核心,充分利用其低功耗、高性价比的优势,搭配低成本的高精度生理监测模块及通用外围模块,在保证监测精度(心率监测准确率可控制在 99.5% 以上,数据响应时间可控制在 0.5 秒以内)的前提下,有效降低了系统整体成本,相比同功能的高端医疗级心率监测设备成本降低 40%-60%,更易普及到普通家庭、运动爱好者、职场办公族及社区康养中心等场景。同时,系统支持模块化扩展(如后续可新增睡眠监测模块、血糖辅助监测功能、语音健康提醒功能),为后续功能升级预留了空间,具备良好的灵活性与可扩展性。

**二、**实物展示

下方为实物演示视频

演示视频https://www.bilibili.com/video/BV1ZFH8znEYS/?spm_id_from=333.1387.upload.video_card.click&vd_source=2a672ca4e8794dca68cbe6d047b42ca5

下方为实物展示图片

三、硬件功能介绍

2.1 硬件清单:

  • STM32F103C8T6
  • OLED液晶显示
  • RTC时钟
  • ADXL345倾角传感器
  • 独立
  • 声光报警电路
  • 心率传感器
  • DS18B20温度传感器
  • 降压电路

2.2 功能介绍:

(1)健康数据检测:实时监测心率、体温及步数,数据异常时触发声光报警
(2)心率波形显示:将心率数据以实时波形形式显示于OLED屏幕
(3)时间显示与设置:显示实时时间,并支持通过按键修改时间参数
(4)阈值调节功能:可通过按键手动设置各健康参数的报警阈值
(5)蓝牙远程监控:将心率、体温与步数数据上传至手机APP,实现远程实时监测

四、软件设计流程图

五、硬件PCB展示

六、软件主函序展示

复制代码
#include "led.h"
#include "delay.h"

#include "sys.h"
#include "usart.h"	 
#include "timer.h"
#include "adc.h"
#include "adxl345.h"
#include "Pedometer.h"
#include "stmflash.h"
#include "OLED_I2C.h"
#include "ds18b20.h"
#include "rtc.h"
#include "key.h"

#include "string.h" 	
/************************************************

************************************************/


extern _Bool Timer_Flag ;			//时间到 标准位
extern _Bool update_flag;			//更新标志变量


//要写入到STM32 FLASH的字符串数组
u8 TEXT_Buffer[]={"0000000"};
#define SIZE sizeof(TEXT_Buffer)	 	//数组长度
//#define FLASH_SAVE_ADDR  0X08020000 	//设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
#define FLASH_SAVE_ADDR  0X0800f400 	//设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)



void Dis_Init(void)
{
	OLED_ShowCN(0,0,10);			//心率
	OLED_ShowCN(16,00,11);

	OLED_ShowStr(32,0,":---r/min",2);

	OLED_ShowCN(0,2,12);			//步数
	OLED_ShowCN(16,2,13);


	OLED_ShowCN(0,4,14);			//体温
	OLED_ShowCN(16,4,15);
}
unsigned char Dis_mode = 0;		//显示状态标志 0:显示传感器数据  1:显示日期时间


short x, y, z;
int main(void)
{	

	unsigned char p[16]=" ";

	u8 datatemp[SIZE];	
	unsigned int  STEP=0;			//步数临时替换值			
	_Bool Heart_OK = 0;				//读取到正确心率标志位
	unsigned char Heart = 0;		//心率值
	short temperature = 0; 				//温度值

	STEPS_DIS = 1;
	delay_init();	    			//延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//设置中断优先级分组为组3:2位抢占优先级,2位响应优先级

    LED_Init();		  				//初始化与控制设备连接的硬件接口
	OLED_Init();					//OLED初始化

	OLED_CLS();						//清屏
	OLED_ShowCN(32,2,0);			//欢迎使用
	OLED_ShowCN(32+16,2,1);
	OLED_ShowCN(32+32,2,2);
	OLED_ShowCN(32+32+16,2,3);




	while(ADXL345_Init())			//3D加速度传感器初始化	
	{
		OLED_ShowStr(0,0,"ADXL345 Error",2);
		delay_ms(200);
		OLED_ShowStr(0,0,"             ",2);
 		delay_ms(200);
	}
	while(DS18B20_Init())	//DS18B20初始化	
	{
		OLED_ShowStr(0,0,"DS18B20 Error",2);

		delay_ms(200);
		OLED_ShowStr(0,0,"             ",2);	

		delay_ms(200);
	}
	delay_ms(100);
	while(DS18B20_Get_Temp()==850);	//DS18B20刚上电时候 读取的值是850 这里等待 直到不是850才开始下一步		
	delay_ms(5000);


	OLED_CLS();						//清屏
	Adc_Init();
	TIM3_Int_Init(1999,71);			//定时2ms中断


	uart_init(9600);	 			//串口一初始化为9600
	TIM2_Int_Init(199,7199);		//10Khz的计数频率,计数到500为20ms 
	KEY_Init();						//IO初始化		
	EXTIX_Init();					//外部中断初始化

	OLED_CLS();						//清屏 
	Dis_Init();						

	STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);  //flash中读出步数

	STEPS = (datatemp[0]-0x30)*10000+(datatemp[1]-0x30)*1000+(datatemp[2]-0x30)*100+(datatemp[3]-0x30)*10+(datatemp[4]-0x30);//读到值转换为步数
//	RTC_Init();
//	
//	RTC_Set(2019,8,5,20,43,55);     //设置时间
 	while(1)
	{	

		if(Timer_Flag==1)					//500ms到 读取数据
		{
			Timer_Flag = 0;					//清除标志
			TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE ); 						//使能指定的TIM3中断,允许更新中断
			TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE ); 						//使能指定的TIM3中断,允许更新中断		
			temperature=DS18B20_Get_Temp();	//读取温度
			TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); 						//使能指定的TIM3中断,允许更新中断
			TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 						//使能指定的TIM3中断,允许更新中断

			TIM_Cmd(TIM2, ENABLE);  		//使能TIMx	
			if (QS == true)					//读取到了心率信号
			{			
				QS = false; 				//清除标志 等待下一次读取
				if(BPM>HEART_MIN_ERROR&&BPM<HEART_MAX_ERROR)		//读取到的值再正常心率区间 40-160内
				{
					Heart_OK = 1;			//标志位置一
					Heart = BPM;			//心率传递给Heart
				}
				else
				{
					Heart_OK = 0;			//标志位清零
					Heart = 0;				//设置为0
				}	
			}
		}

		if(ADXL345_FLAG==1)					//20ms到?
		{
			ADXL345_FLAG = 0;	  			//清除标志位
			step_counter();	
		}
		delay_ms(20);	
		if(STEP!=STEPS)						//步数发生改变 存储一次
		{
			STEP = STEPS;
			TEXT_Buffer[0]=(u16)STEPS/10000+0x30;
			TEXT_Buffer[1]=(u16)STEPS%10000/1000+0x30;
			TEXT_Buffer[2]=(u16)STEPS%10000%1000/100+0x30;
			TEXT_Buffer[3]=(u16)STEPS%10000%1000%100/10+0x30;
			TEXT_Buffer[4]=(u16)STEPS%10000%1000%100%10+0x30;

			STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
		}
		if(calendar.hour==0&&calendar.min==0&&(calendar.sec==0||calendar.sec==1||calendar.sec==2))		//凌晨00:00:00  清除步数
		{
			STEPS = 0;
			TEXT_Buffer[0]=(u16)STEPS/10000+0x30;
			TEXT_Buffer[1]=(u16)STEPS%10000/1000+0x30;
			TEXT_Buffer[2]=(u16)STEPS%10000%1000/100+0x30;
			TEXT_Buffer[3]=(u16)STEPS%10000%1000%100/10+0x30;
			TEXT_Buffer[4]=(u16)STEPS%10000%1000%100%10+0x30;

			STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
			delay_ms(500);

		}
		Key_set();							//时间设置

		if(KEY0==0)							//KEY0切换显示按键
		{
			while(KEY0==0);					//等待松开
			OLED_CLS();						//清屏	
			if(Dis_mode==0)					//如果上一次是显示心率、步数、体温 的 则显示时间
				Dis_mode = 1;
			else 							//如果上一次不是显示心率、步数、体温 的 则心率、步数、体温
			{
				Dis_mode = 0;				
				Dis_Init();					//显示汉字信息
			}		
		}
		if(KEY2==0)	   						//清除步数
		{
			while(KEY2==0);
			STEPS = 0;
			TEXT_Buffer[0]=(u16)'0';
			TEXT_Buffer[1]=(u16)'0';
			TEXT_Buffer[2]=(u16)'0';
			TEXT_Buffer[3]=(u16)'0';
			TEXT_Buffer[4]=(u16)'0';

			STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);		//清除后存储一次数据
		}

		if(update_flag==1) 					//2S标志到 发送一次数据到手机APP
		{
			update_flag = 0;
			printf("Step:%5d H:%3d T:%4.1f \r\n",STEPS,Heart,(float)temperature/10);	//串口发送出去

		}

		switch(Dis_mode)
		{
			case 0:	  										//显示传感器数据
				if(STEPS_DIS==1)							//刷新计步?
				{
					sprintf((char*)p,":%-5d ",STEPS);		//显示步数
					OLED_ShowStr(32,2,p,2);
				}
 				sprintf((char*)p,":%4.1f    ",(float)temperature/10);
				OLED_ShowStr(32,4,p,2);						//显示温度

				if(Heart_OK==1)								//读取到正确心率?
				{
					sprintf((char*)p,":%3dr/min",Heart);	//显示心率
					OLED_ShowStr(32,0,p,2);	
				}
				else
				{
					sprintf((char*)p,":---r/min");	
					OLED_ShowStr(32,0,p,2);
				}
			break;

			case 1:											//显示时间 日期等信息
				RTC_Display();								//显示时钟
			break;
		}

	}	
}

七、单片机实物资料

资料获取 查看主页介绍:兆龙电子单片机设计

相关推荐
金叶科技智慧农业7 小时前
2025年虫害预测如何更精准?物联网虫情测报仪显身手,金叶智能助力绿色防控
物联网
码界奇点7 小时前
基于Spring Cloud Alibaba与Vue.js的分布式在线教育系统设计与实现
前端·vue.js·分布式·spring cloud·架构·毕业设计·源代码管理
码界奇点7 小时前
基于SpringBoot3+Vue的前后端分离电商系统设计与实现
前端·javascript·vue.js·spring·毕业设计·鸿蒙系统·源代码管理
崇山峻岭之间7 小时前
STM32F030CxT6学习记录
stm32·嵌入式硬件·学习
九河云7 小时前
云计算+大数据+IoT:构建企业数字化底座的三大支柱
大数据·物联网·云计算
TDengine (老段)7 小时前
直播回放 | IDMP 无问智推技术详解
数据库·人工智能·物联网·ai·时序数据库·tdengine·涛思数据
OpenLoong 开源社区7 小时前
源启高校,智创未来!OpenLoong 开源社区亮相 AtomGit 西南大学站
人工智能·机器人·开源
1+2单片机电子设计8 小时前
STM32F103 实现温湿度数据采集并上传机智云的完整方案
stm32·单片机·嵌入式硬件
码上上岸8 小时前
基于STM32的农业大棚温湿度自动调控系统
stm32·单片机·嵌入式硬件