博舍

基于STM32的智能手环系统的设计 智能定位系统原理图解

基于STM32的智能手环系统的设计

STM32系列基于STM32的智能手环系统的设计STM32系列前言一、系统方案的设计1.1系统功能分析1.2系统总体结构二、硬件电路的搭建2.1STM32最小系统组成部分2.2S硬件引脚连接2.2S实物连接图三、软件设计3.1系统流程图3.2主函数代码四、系统测试五、总结前言

随着科学技术的革新,智能化生活已经开始实现,更多的人们的目光聚焦在智能化产品上面,一方面是对自身健康的关注,另一方面是对便携轻松的生活的向往,智能手环就作为其中的一种代表性产物。其主要应用于运动显示比如显示行走及跑步的步数,距离,速度。同时可以实时健康监测比如心率,血氧,体温等。是一款突出个性与人性的智能化产物。

一、系统方案的设计1.1系统功能分析

本设计是由STM32F103C8T6最小系统电路,DS3231时钟模块,ADXL345计步模块,MAX30100血氧心率模块,DS18B20温度模块,MPU6050体位检测模块,1.44寸TFT彩色液晶屏显示模块组成的嵌入式智能手环系统。

(1)通过DS3231时钟模块实现日期显示的功能

(2)使用传感器ADXL345检测人步数

(3)通过MAX30100传感器实时检测血氧心率;

(4)通过传感器DS18B20进行温度测量。

(5)通过MPU6050体位检测卧床病人是否跌倒或可以通过此功能蜂鸣器警报呼叫。

(6)通过1.44寸TFT彩色液晶屏实时显示日期,步数,距离,心率,血氧,跌倒状态以及温度值。

1.2系统总体结构

二、硬件电路的搭建2.1STM32最小系统组成部分

2.2S硬件引脚连接

2.2S实物连接图

(1)STM32单片机实物图如下图所示。

(2)DS3231实物图

(3)ADXL345模块实物图如下图所示

(4)MAX30100实物图(5)MPU6050实物图

(6)DS18B20温度传感器的实物图(7)1.44寸TFT显示模块整体系统实物图手工焊接是一种常见的原始焊接方法。

三、软件设计

本设计采用轮询的操作方式,首先在系统中断中间隔不同的时间给相应的标志位置一,比如:计步每隔0.2s计步标志位置一,时钟每隔1s置一一次。然后在主循环中检测标志位,如果标志位置一。刷新相应的值。

3.1系统流程图

下面是更为详细的流程图

3.2主函数代码#include"stm32f10x.h"#include"delay.h"#include"led.h"#include"uart.h"#include"stdio.h"#include"ds18b20.h"#include"Lcd_Driver.h"#include"TFT_demo.h"#include"GUI.h"#include"key.h"#include"mpu6050.h"#include"inv_mpu.h"#include"inv_mpu_dmp_motion_driver.h"#include"math.h"#include"MAX30100.h"#include"MAX30100_Filters.h"#include"MAX30100_PulseOximeter.h"#include"MAX30100_SpO2Calculator.h"#include"myiic.h"#include"timer3.h"#include"adxl345.h"#include"myiic_2.h"#include"DS3231.h"u8ReadAdxl345;//定时读取adxl345数据u8ErrorNum=0;//记录错误次数u16Normal_num=0;//正常次数u16Error_num=0;//倾斜次数u16BuShu=0;//步数脉冲量u16step_num=0;//计数步数floatdisJuLi=0;//显示距离signedshortHeartRate_val=0;//心跳速率u8SPO2_val=0;//血氧浓度u8mpu_count=0;u8STAP_FLAG=0;u8mpu_flag=0;//人体跌倒检测标志位标志位1、2任意一个异常该标志位为1【1:跌倒,0:正常】_Boolmpu_1_flag=0;//人体跌倒检测标志位1角度异常标志【1:异常,0:正常】_Boolmpu_2_flag=0;//人体跌倒检测标志位2加速度异常标志【1:异常,0:正常】_Boolmpu_temp=0;//缓存_Booltemp_flag=0;//温度获取标志_Boolmax_flag=0;//心率血氧获取标志_Booltime_flag=0;//时间获取标志_BoolMPU_flag=0;//开关陀螺仪姿态获取分析标志_BoolMAX_flag=0;//开关心率血氧获取分析标志_BoolADXL_flag=0;//开关计步获取分析标志intSVM;//人体加速度向量幅值SVMintmain(void){floatpitch,roll,yaw;//欧拉角shortaacx,aacy,aacz;//加速度传感器原始数据u8t=0;u16z=0;//温度中间缓存值u16temp_BuShu;SysTick_Config(SystemCoreClock/1000);Delay_Ms(100);Lcd_Init();//屏幕初始化UART1_Init();//串口调试波特率115200DS18B20_Init();//DS18B20温度模块初始化PA4Gpio_Init();//蜂鸣器初始化PA5EXTI_KEY_Config();//按键初始化PA6MPU_Init();//MPU6050初始化-----SCLK接到“PB10”脚SDIN接到“PB11”脚DS3231_Init();//时钟模块初始化-----SCLK接到“PA3”脚SDIN接到“PA2”脚Delay_Ms(100);//等待初始化稳定//测试时钟代码//DS3231_Set(20,5,28,21,36,0);//while(1)//{//Delay_Ms(2000);//等待初始化稳定//get_show_time();//printf("%u-%u-%u ",calendar.w_year+2000,calendar.w_month,calendar.w_date);//printf("%u:%u:%u ",calendar.hour,calendar.min,calendar.sec);//}IIC_Init();//血氧浓度模块IIC初始化-----SCLK接到“PB8”脚SDIN接到“PB9”脚TIM3_Init();//每1ms执行一次中断,RunTime每1ms加1SPO2_Init();//血氧心率配置boot_Demo();//启动界面Delay_Ms(1000);//等待初始化稳定Init_ADXL345();//Init_ADXL345初始化-----SCLK接到“PB6”脚SDIN接到“PB7”脚if(Single_Read_ADXL345(0X00)==0xe5){Delay_Ms(5);}else{Delay_Ms(3);}while(mpu_dmp_init())//DMP初始化{//printf("MPU6050Error");Delay_Ms(200);}main_Demo();//主界面STAP_FLAG=1;while(1){//====人体温度检测显示====if(temp_flag){z=(ds18b20_read()&0x07FF);temperature=z/16.0;temp_flag=0;snprintf((char*)str,sizeof(str),"%2.1f",temperature);Gui_DrawFont_GBK16(40,64,WHITE,BLACK,str);}//====心跳血氧获取====if(MAX_flag){POupdate();//更新FIFO数据血氧数据心率数据if(max_flag){max_flag=0;show_max30100(HeartRate_val,SPO2_val);}}//====计步程序====if((!MPU_flag)&&(!MAX_flag)){if(ReadAdxl345==1)//定时读取adxl345数据{ReadAdxl345=0;ReadData_x();//三轴检测函数if((temp_Y>450)||(temp_YError_num++;//倾斜次数}if((Error_num!=0)&&(Normal_num!=0))//检测到步数{BuShu++;//步数脉冲量++Error_num=0;//清除一个周期检测Normal_num=0;}step_num=BuShu/2;//显示步数disJuLi=step_num*0.45;//显示距离if(BuShu!=temp_BuShu){snprintf((char*)str,sizeof(str),"%u",step_num);Gui_DrawFont_GBK16(48,16,WHITE,BLACK,str);snprintf((char*)str,sizeof(str),"%0.1f",disJuLi);Gui_DrawFont_GBK16(48,96,WHITE,BLACK,str);temp_BuShu=BuShu;}}}//获取时间if(time_flag){time_flag=0;get_show_time();sprintf((char*)str,"%u:%u:%u ",calendar.hour,calendar.min,calendar.sec);Gui_DrawFont_GBK16(48,112,WHITE,BLACK,str);printf("%u-%u-%u ",calendar.w_year+2000,calendar.w_month,calendar.w_date);printf("%u:%u:%u ",calendar.hour,calendar.min,calendar.sec);}//====MPU6050数据获取====if(MPU_flag){t++;if(t>=10){t=0;if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0){MPU_Get_Accelerometer(&aacx,&aacy,&aacz);//得到加速度传感器数据SVM=sqrt(pow(aacx,2)+pow(aacy,2)+pow(aacz,2));//printf("pitch:%0.1froll:%0.1fyaw:%0.1fSVM:%u ",fabs(pitch),fabs(roll),fabs(yaw),SVM);//分析x、y、z角度的异常判断if(fabs(pitch)>40||fabs(roll)>40||fabs(yaw)>40)//倾斜角度的【绝对值】大于40°SVM大于设定的阈值时,即认为摔倒mpu_1_flag=1;elsempu_1_flag=0;//分析加速度SVM的异常判断if(SVM>23000||SVMTimingDelay--;if(STAP_FLAG){led_count++;if(led_count%200==0){ReadAdxl345=1;}if(led_count==1000){led_count=0;temp_flag=1;max_flag=1;time_flag=1;if(mpu_flag)//蜂鸣器响一秒{mpu_count++;if(mpu_count==1)BEEP_ON;elseif(mpu_count==2)BEEP_OFF;}if(mpu_count==3)//异常3秒回复状态{mpu_count=0;mpu_flag=0;show_mpu(0);}}}}

代码结构如图

四、系统测试

五、总结

想要实现更多的研究,就要深入的理解它,如果我们可以在智能手环中,我们可以引入操作系统,使用一些可以跑操作系统(Android)的处理器,可以让多功能的实现不是那么的有难度。需要资料的我后续会发一下啊

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇