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

目录

一、前言

二、项目简介

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;
		}
	}	
}

六、实验效果 

七、资料内容

项目分享

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PCA与LDA

共同点 降维方法&#xff1a; PCA和LDA都是数据降维的方式&#xff0c;它们都能通过某种变换将原始高维数据投影到低维空间。 数学原理&#xff1a; 两者在降维过程中都使用了矩阵特征分解的思想&#xff0c;通过对数据的协方差矩阵或类间、类内散度矩阵进行特征分解&#xff…

鸿蒙低代码开发的局限性

在版本是DevEco Studio 3.1.1 Release&#xff0c;SDK是3.1.0(API9) 的基础上。 1、低代码插件没有WebView组件。 2、低代码插件没有空白的自定义组件&#xff0c;当前提供的所谓自定义组件&#xff0c;只能用列表中提供的组件来拼接新的组件。 3、使用ets代码自定义的组件&…

bugku--web---baby lfi

1、题目描述 2、页面提示使用language参数 3、构造url:/?languagefr。页面有回显 4、这里提示包含关键的文件 5、构造url:/?language/etc/passwd 6、flag shellmates{10CA1_F11e_1Nc1US10n_m4y_r3ve4l_in7Er3st1nG_iNf0Rm4t1on}

单北斗定位手持终端的优势

在追求精准与效率的现代生活中&#xff0c;单北斗定位手持终端以其独特优势&#xff0c;为众多行业领域带来了前所未有的便利与安全保障。凭借北斗卫星导航系统的高精度定位能力&#xff0c;这款单北斗定位手持终端不仅能在复杂环境中实现厘米级别的位置锁定&#xff0c;还具备…

五分钟“手撕”二叉树

代码放开头&#xff0c;供大家查阅。 但是对于树来说&#xff0c;更重要的是理解树的概念&#xff0c;树的概念很多&#xff0c;题却是千篇一律&#xff0c;这篇博客详细的讲解了概念&#xff0c;看完必有很大的收获。 目录 一、实现代码 二、什么是树 三、树的重要概念 四…

探索未来教育的智慧教学整体架构:数字化时代的教育革命

在数字化时代&#xff0c;教育领域也正在经历着前所未有的变革和创新。智慧教学整体架构作为教育技术与教学实践的完美结合&#xff0c;正在成为推动教育革命的关键力量。本文将深入探讨智慧教学整体架构的概念、核心组成部分以及其在未来教育中的应用前景。 **智慧教学整体架构…

C++设计模式---装饰器模式

1、介绍 装饰器&#xff08;Decorator&#xff09;模式是一种结构型设计模式&#xff0c;它允许你动态地给一个对象添加额外的职责。 装饰器模式主要用于扩展对象的功能&#xff0c;而又不改变其原有结构。在C中&#xff0c;装饰器模式主要应用于那些需要为对象动态添加功能或改…

IO流的转换流

目录 ​编辑 转换流 利用转换流按照指定字符编码读取 利用转换流按照指定字符编码写出 将本地文件中的GBK文件。转成UTF-8 练习 序列化流 反序列化流 /对象操作输入流 序列化流/反序列化流的细节 练习 转换流 是字符流和字节流之间的桥梁 字符转换输入流:InputS…

QWidget 属性——windowTitle·windowIcon·qrc

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

金融科技企业如何提高服务效率

一、引言 在金融科技&#xff08;FinTech&#xff09;领域&#xff0c;服务效率是企业竞争力的重要组成部分。随着科技的不断进步和市场竞争的加剧&#xff0c;金融科技企业必须不断提升服务效率&#xff0c;以满足客户需求&#xff0c;赢得市场份额。本文将从多个角度详细阐述…

AB测试学习(附有相关代码)

目录 一、基本概念1. 定义2. 作用3. 原理 二、实验基本原则三、实验步骤四、实验步骤详解1. 确定实验目的2. 确定实验变量3. 实验指标设计3.1 实验指标类型&#xff08;按作用区分&#xff09;3.1.1 核心指标3.1.2 驱动指标&#xff08;跟踪指标&#xff09;3.1.3 护栏指标 3.2…

pycharm爬取BOSS直聘岗位信息

编译器&#xff1a;Pycharm 效果展示如图 简单原理描述&#xff1a;模拟人工动作爬取页面信息&#xff0c;运行脚本后代码自动打开浏览器获取相关信息&#xff0c;模拟人工进行页面跳转并自动抓取页面信息记录到表格中。 深入原理描述&#xff1a;页面翻转的时候会调用接口&am…

Pixi.js学习 (四)鼠标跟随、元素组合与图片位控

目录 一、鼠标移动跟随 1.1 获取鼠标坐标 1.2 鼠标跟随 二、锚点、元素组合 2.1 锚点 2.2 元素组合 三、图片图层 四、实战 例题一&#xff1a;完成合金弹头人物交互 例题二&#xff1a;反恐重击瞄准和弹痕 例题一代码&#xff1a; 例题二代码&#xff1a; 总结 前言 为了提高作…

【会议征稿,五大海内外高校支持】第四届经济发展与商业文化国际学术会议(ICEDBC2024,6月21-23)

第四届经济发展与商业文化国际学术会议&#xff08;ICEDBC2024&#xff09;将于2024年6月21-23日在中国大连隆重召开。会议主要围绕“经济发展”“商业文化”等研究领域展开讨论。 旨在为经济&#xff0c;商业的专家学者及企业发展人提供一个分享研究成果、讨论存在的问题与挑战…

调整SinoDB数据库日志模式

在数据库上线后&#xff0c;可能需要变更数据库的日志模式&#xff0c;这可能是由于业务变更或性能调整等原因引起的。数据库日志模式的变更可能涉及单一实例环境或高可用集群环境。本文将介绍如何调整SinoDB数据库的日志模式。 1、 停止应用程序 在修改数据库日志模式之前&am…

Spring 中使用MyBatis

一、Mybatis 的作用 1、MyBatis&#xff08;前身为iBatis&#xff09;是一个开源的Java持久层框架&#xff0c;它主要用于与数据库交互&#xff0c;帮助开发者更轻松地进行数据库操作。 持久层&#xff1a;指的是就是数据访问层(dao)&#xff0c;是用来操作数据库的。 2、MyB…

【BIM+GIS】Supermap优化BIM模型

文章目录 一、生成缓存二、实例化一、生成缓存 第一步:导出Revit模型 第二步:加载模型 第三步:生成缓存 第四步:添加到场景 二、实例化 实例化技术适用于重复模型较多的情况,可以实现对相同的几何模型只绘制一次,降低了显卡等硬件设备的压力。例如,一幢房屋中存在大量…

C++ day6 练习

#include <iostream>using namespace std;class Animal { private:string name; public:Animal(){}Animal(string name):name(name){}virtual void perform(){cout << "我是" << name <<endl;} };class Lion:public Animal { private:string…

Deploy Kafka for Centos 7

应用介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写&#xff0c;用于处理消费者在网站中的所有动作流数据。 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据&#xff0c;这些数据…

filezilla-server 1.8.1 设置

filezilla-server 1.8.1 设置&#xff1a; 1. 2. 3. 4. 其他不用配置&#xff0c; 5. 6. 7. 8. 9. 如果外网连不上 filezilla-server 提示无法连接到服务器&#xff0c; 多半是 filezilla-server 所在的电脑没有通过防火墙允许&#xff0c;打开 Windows defender 防…