STM32项目分享:智能蓝牙手环

news2024/11/8 17:43:25

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

1.PCB图 

2.PCB板打样焊接图

五、程序设计 

六、实验效果 

七、资料内容

项目分享


一、前言

项目成品图片:

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV1YQ4y1s7e7/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

(资料分享见文末) 

二、项目简介

1.功能详解

基于STM32智能蓝牙手环,功能如下:

  1. 心率采集:pulsesenneor心率模块采集人体心率
  2. 计步:ADXL345三轴加速传感器记录人行走步数
  3. 时间显示:单片机内部RTC时钟模块读取记录当前实时时间
  4. 温度采集:DS18B20温度传感器采集人体体温
  5. OLED显示:显示当前时间,人体体温、心率、步数信息
  6. 蓝牙APP控制:手机端蓝牙app显示信息心率、体温和步数信息
  7. 按键控制:调整日期、时间以及切换显示信息

2.主要器件

  • STM32F103C8T6最小系统板
  • OLED显示屏(4针I2C协议)
  • Pulsesennor心率传感器
  • ADXL345加速度传感器
  • DS18B20温度传感器
  • 蓝牙模块(BT04-A)

三、原理图设计

四、PCB硬件设计

1.PCB图 

2.PCB板打样焊接图

五、程序设计 

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初始化
	delay_ms(50);
	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);
	ADXL345_Init();
	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();
 	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;
		}
	}	
}

六、实验效果 

七、资料内容

项目分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1813553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

改变Layout布局中路由渲染区域页面跳转变全屏

有一个需求需要点击侧边栏跳转页面时变全屏&#xff0c;而不是还在content中

QWidget 属性——windowTitle·windowIcon·qrc

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、windowTitle二、windowIcon三、qrc 一、windowTitle windowTitle 是一个通常用于表示窗口标题…

企业级开源项目,云缓存解决方案:CacheCloud

CacheCloud&#xff1a;简化缓存管理&#xff0c;释放数据潜力- 精选真开源&#xff0c;释放新价值。 概览 CacheCloud是由搜狐视频团队开发的一款开源的Redis缓存云平台&#xff0c;支持Redis多种架构(Standalone、Sentinel、Cluster)高效管理、有效降低大规模redis运维成本&…

深入理解rtmp(一)之开发环境搭建

深入理解rtmp(一)之开发环境搭建 手机直播在15年的时候突然火起来,随着花椒,映客等出现,直播一下就出现在了风口,各个公司针对直播的战斗迅速打响,战斗过程比较短暂,随着许多公司的退出和死去,手机直播行业趋于稳定,直播服务时长也被传统的CDN厂商牢牢占据,后面大家又把精力投…

c++【入门】火柴棒三角形问题

限制 时间限制 : 1 秒 内存限制 : 128 MB 题目 如下图所示&#xff0c;摆1个火柴棒三角形需要3根火柴&#xff0c;那么摆2个火柴棒三角形就需要6根火柴&#xff0c;请问摆n个火柴棒三角形需要多少根火柴&#xff1f; 输入 一个整数n&#xff0c;代表想要摆放的火柴棒三角形…

[大模型]Llama-3-8B-Instruct FastApi 部署调用

环境准备 在 Autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch-->2.1.0-->3.10(ubuntu22.04)-->12.1。 接下来打开刚刚租用服务器的 JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行演示。 pip 换源…

【AI大模型】Transformers大模型库(九):大模型微调之计算微调参数占比

目录 一、引言 二、计算微调参数占比 2.1 概述 2.2 模型参数结构一览 2.3 微调参数占比计算 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#xff0c;为huggingface上数以万计的预训练大模型提供预测、训练等服务。 &#x1f917; Transform…

【Qt】文件操作

文章目录 1 :peach:Qt 文件概述:peach:2 :peach:输入输出设备类:peach:3 :peach:文件读写类:peach:4 :peach:文件和目录信息类:peach: 1 &#x1f351;Qt 文件概述&#x1f351; 文件操作是应⽤程序必不可少的部分。Qt 作为⼀个通⽤开发库&#xff0c;提供了跨平台的⽂件操作能…

使用开源的zip.cpp和unzip.cpp实现压缩包的创建与解压(附源码)

目录 1、使用场景 2、压缩包的创建 3、压缩包的解压 4、CloseZipZ和CloseZipU两接口的区别 5、开源zip.cpp和unzip.cpp文件的下载 VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排…

【机器学习300问】112、什么是特征点检测?

特征点检测是计算机视觉中的一种技术&#xff0c;用于识别图像中具有显著局部特征的点。这项技术在多个领域内扮演着核心角色&#xff0c;包括图像识别、三维重建、运动跟踪和图像匹配等。 一、特征点任务的目的 在计算机视觉&#xff08;CV&#xff09;中&#xff0c;特征点检…

PyCharm QThread 设置断点不起作用

背景&#xff1a; 端午节回来上班第一天&#xff0c;不想干活&#xff0c;领导又再后面看着&#xff0c;突然想起一个有意思的问题&#xff0c;为啥我的程序在子进程QThread的子类里打的断点不好用呢&#xff1f;那就解决一下这个问题吧。 原因&#xff1a; 如果您的解释器上…

PB案例学习笔记-19制作一个图片按钮

写在前面 这是PB案例学习笔记系列文章的第19篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

【C++题解】1121 - “倒”数

问题&#xff1a;1121 - “倒”数 类型&#xff1a;需要找规律的循环 题目描述&#xff1a; 输入一个正整数 N&#xff08;0<N<2147483647&#xff09;&#xff0c;将这个数倒着合成一个新数后输出。 比如&#xff1a; 543 &#xff0c;倒过来是345 &#xff08;请注意…

2024年吉林等级保护测评机构名单

据悉&#xff0c;在吉林地区具备等保测评资质的机构为数不多&#xff0c;但每一家都承载着保障信息系统安全的重任。这些机构拥有专业的技术团队和丰富的经验&#xff0c;能够为各单位提供高质量的等保测评服务。今天我们小编就给大家汇总了一下2024年吉林等级保护测评机构名单…

基于电压矢量变换的锁相环simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于电压矢量变换的锁相环simulink建模与仿真&#xff0c;这个模型的基本构架如下所示&#xff1a; 2.系统仿真结果 由图中锁相结果可以看出&#xff0c;利用新型锁相环技术在…

[大模型]LLaMA3-8B-Instruct WebDemo 部署

环境准备 在 autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch-->2.1.0-->3.10(ubuntu20.04)-->12.1 接下来打开刚刚租用服务器的 JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行 demo。 pip 换源…

面试官:MySQL也可以实现分布式锁吗?

首先说结论&#xff0c;可以做&#xff0c;但不推荐做。 我们并不推荐使用数据库实现分布式锁。 如果非要这么做&#xff0c;实现大概有两种。 1、锁住Java的方法&#xff0c;借助insert实现 如何用数据库实现分布式锁呢&#xff0c;简单来说就是创建一张锁表&#xff0c;比…

SRE 排障利器,接口请求超时试试 httpstat

夜莺资深用户群有人推荐的一个工具&#xff0c;看了一下真挺好的&#xff0c;也推荐给大家。 需求场景 A 服务调用 B 服务的 HTTP 接口&#xff0c;发现 B 服务返回超时&#xff0c;不确定是网络的问题还是 B 服务的问题&#xff0c;需要排查。 工具简介 就类似 curl&#…

Nextjs 集成富文本编辑器react-quill

目录 一、组件代码 二、参考文档 由于Next与react有些差别&#xff0c;直接调用组件会报无法找到文档的错误&#xff0c;于是我们只有考虑动态导入了解决问题。因为富文本编辑器一般作用与form页面对SEO意义不大&#xff0c;所以这里可以考虑暂时关闭SSR。 一、组件代码 /*…

论文笔记:Frozen Language Model Helps ECG Zero-Shot Learning

2023 MIDL 1 intro 心电图&#xff08;ECG&#xff09;被广泛应用于检测各种心脏疾病&#xff0c;包括心律失常、心脏病发作和心力衰竭等近些年深度学习方法在心电图数据分类领域取得了不错的效果。 基于深度学习的ECG数据分类方法&#xff0c;通常以监督学习范式进行训练&am…