当前位置: 首页 > news >正文

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);	 			//串口一初始化为9600TIM2_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;}}	
}

六、实验效果 

七、资料内容

项目分享

相关文章:

  • 攻防世界--杂项misc-2017_Dating_in_Singapore
  • 力扣爆刷第149天之TOP100五连刷(LRU、K个一组)
  • 专栏【汇总】
  • Ansible——shell模块
  • 面试题:如何避免索引失效?
  • LCD电子广告牌课程设计
  • R语言绘图 --- 桑基图(Biorplot 开发日志 --- 5)
  • Win10下CodeBlock实现socket TCP server/client
  • CSS--超出就显示滚动条并设置滚动条的样式
  • LeetCode 每日一题 2024/6/3-2024/6/9
  • Qt——窗口
  • RabbitMQ从入门到入土
  • 什么是校园抄表系统?
  • 基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真
  • ABSD方法论:一种有效的软件开发方法
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Brief introduction of how to 'Call, Apply and Bind'
  • download使用浅析
  • ES10 特性的完整指南
  • golang 发送GET和POST示例
  • Python学习之路16-使用API
  • Vue.js-Day01
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 那些被忽略的 JavaScript 数组方法细节
  • 微服务入门【系列视频课程】
  • 走向全栈之MongoDB的使用
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 说说我为什么看好Spring Cloud Alibaba
  • #php的pecl工具#
  • #数学建模# 线性规划问题的Matlab求解
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (二)测试工具
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (转)菜鸟学数据库(三)——存储过程
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .Net小白的大学四年,内含面经
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • @FeignClient注解,fallback和fallbackFactory
  • @JsonFormat 和 @DateTimeFormat 的区别
  • @RequestMapping-占位符映射
  • [ C++ ] STL_list 使用及其模拟实现
  • [000-01-018].第3节:Linux环境下ElasticSearch环境搭建
  • [2019红帽杯]Snake
  • [Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解
  • [Android学习笔记]ScrollView的使用
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [BeginCTF]真龙之力
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • [codeforces] 25E Test || hash
  • [go] 策略模式
  • [hdu 4552] 怪盗基德的挑战书