资讯专栏INFORMATION COLUMN

毕业设计 - 基于单片机的智能手环 -计步器 嵌入式 物联网 stm32

不知名网友 / 2249人阅读

摘要:老年智能手环主要致力于深入到整个救治老年人环节中,促进几个关键人群的及时反应智能互联信息互通。是一款突出个性与人性的智能化产物。


1 简介

Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目

基于单片机的智能手环 -计步器

大家可用于 课程设计 或 毕业设计

技术解答、毕设帮助、开题指导print("Q 746876041") 

1 项目背景意义

随着智能化时代的来临, 无线互联与智能化处理软件的大面积普及。 传统的就医形式已经通过网络互联科技而变得高效, 但是, 纵然在这种趋势下, 老年人就医依然面临很多困境, 种种的原因导致很多老年人突发疾病但是没能得多及时的救治。 老年智能手环主要致力于深入到整个救治老年人环节中, 促进几个关键人群的及时反应、 智能互联、 信息互通。 如何高效、 精准、 相对简洁的去实现种种义务之间的平衡, 包括子女对老人的赡养义务, 在大批量救治病患的过程中, 医生如何平衡好对每一个病人的义务。

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

2 系统方案的设计

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

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

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

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

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

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

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

3 系统总体结构

4 系统硬件设计

4.1 主控模块

STM32C8T6(最小核心板),当然,用其他型号的32,如STM32ZET6也是可以的。

4.2 姿态解算模块:MPU6050

4.3 DS3231实物图

4.4 TFT显示模块

4.5 硬件连接效果

5 跌倒检测算法原理

当人体正常行走时, 合成加速度在 1g 至 2.5g 左右, 如下图所示。 当人体不论从何方向跌落时, 垂直方向的位置和速度都将会改变, 所以加速度和俯仰角也会随着而变化。 如图 4.7 中设置采样频率为 350Hz 并且可以看出图中跌倒过程中各个方向加速度变化情况。 当手环佩戴者跌落时, 整个过程持大约持续约 2 秒, 其加速度曲线变化是先减小然后增加, 最后稳定。 可以得出结论, 坠落是一个暂时的过程, 在这个过程中, 测试者经历失重、 撞击和静止三个状态。 在下降过程中, 合成加速度的最大值约为 2.6 g, 并且有 7 个连续采样点的合成加速度为 2.0 g 或更多。 当人摔倒时, 通过对人体姿态角的采样, 人体的俯仰角和侧翻角都会发生变化, 在跌倒后有一个或更多姿态角的绝对值大于 45°。

5.1 跌倒检测的判定流程


跌倒最开始的加速度会是最大的, 当跌倒后人的自然反应会让加速度有所减小,所以跌倒有两个阈值, 第一个阈值较大为触发阈值, 第二个阀组为持续阈值, 然后在50 个周期内计时, 是否有 80%时间为大于第二个跌倒阈值的, 有这两个持续过程则判定为跌倒, 否则丢弃跌倒判定数据, 跌倒流程图如上图。

5.2 关键算法实现

if(adxl345_flag == 1)	{			adxl345_flag = 0;		Multiple_Byte_Read(0x32);//采样		sampling_cnt++;//采样次数		sampling_cnt0++;/*-------------------平均滤波算法-----------------*/		for(i=0;i<3;i++)//0->x 1->y 2->z	{		reg_buf3[i] =  reg_buf2[i];		reg_buf2[i] =  reg_buf1[i];		reg_buf1[i] =  reg_buf0[i];		reg_buf0[i] =  (buf[2*i+1] << 8) + buf[2*i];//数据合成				filter_out[i] = (reg_buf0[i] + reg_buf1[i] + reg_buf2[i] +reg_buf3[i])/4;				if(filter_max[i] < filter_out[i]) filter_max[i] = filter_out[i];		if(filter_min[i] > filter_out[i]) filter_min[i] = filter_out[i];	}/*-------------------动态阈值和动态精度算法------------------*/	if(sampling_cnt == 50)	{		sampling_cnt = 0;		/*printf("cnt:%ldms/r/n",cnt);//50次测量所用的时间		cnt=0;*/		//printf("interval:%ld/r/n",interval);		for(i=0;i<3;i++)		{			Vpp[i] = filter_max[i] - filter_min[i];//计算双峰值			Dynamic_threshold[i] = (filter_max[i] + filter_min[i])/2;//计算动态阈值						filter_max[i] = 0;//重新初始各轴的最大、最小值			filter_min[i] = 4095;			Error_flag[i] = 0;						//>100					if(Vpp[i] >= 250)		Dynamic_precision[i] = Vpp[i]/50;//跑步				else if( (Vpp[i] >= 100) && (Vpp[i]<250) )	Dynamic_precision[i] = 3;//走路				else {Dynamic_precision[i] = 2;Error_flag[i] = 1;}			}		}/*------------------线性移位 消除高频噪声--------------------*/		for(i=0;i<3;i++)	{			sample_old[i] = sample_new[i];		if(filter_out[i] >= sample_new[i])		{					if((filter_out[i] - sample_new[i]) > Dynamic_precision[i])				sample_new[i] = filter_out[i];					}		else if(filter_out[i] < sample_new[i])		{					if((sample_new[i] - filter_out[i]) > Dynamic_precision[i])				sample_new[i] = filter_out[i];					}	}/*--------------------最大峰值检测,判断活跃轴,步伐判断----------------*///sample_new < Dynamic_threshold 表示已迈过动态阈值下方//sample_new - sample_old < 0 表示加速度的变化小于0,斜率为负数	if( (Vpp[0] >= Vpp[1]) && (Vpp[0] >= Vpp[2]) ) //x轴活跃	{			if( (sample_old[0] > Dynamic_threshold[0]) && (sample_new[0] < Dynamic_threshold[0]) && (Error_flag[0] == 0) )		{					if( (interval > 10 ) && ( interval < 100 ) )			{				Step_Out+=1;				regulation3 = regulation2;				regulation2 = regulation1;				regulation1 = regulation0;				regulation0 = 1;				if( regulation3 && regulation2 && regulation1 && regulation0 )					printf("Step:%d/r/n",Step_Out);			}			else 			{							regulation3 = 0;				regulation2 = 0;				regulation1 = 0;				regulation0 = 0;						}			interval = 0;		}	}	else if( (Vpp[1] >= Vpp[0]) && (Vpp[1] >= Vpp[2]) ) //y轴活跃	{			if( (sample_old[1] > Dynamic_threshold[1]) && (sample_new[1] < Dynamic_threshold[1]) && (Error_flag[1] == 0) )		{			/*----------时间窗口--------*/			if( (interval > 10 ) && ( interval < 100 ) )			{				Step_Out+=1;				/*-----------计数规则--------------*/				regulation3 = regulation2;				regulation2 = regulation1;				regulation1 = regulation0;				regulation0 = 1;				if( regulation3 && regulation2 && regulation1 && regulation0 )					printf("Step:%d/r/n",Step_Out);			}			else 			{							regulation3 = 0;				regulation2 = 0;				regulation1 = 0;				regulation0 = 0;						}			interval = 0;				}	}			else if( (Vpp[2] >= Vpp[0]) && (Vpp[2] >= Vpp[1]) ) //z轴活跃	{			if( (sample_old[2] > Dynamic_threshold[2]) && (sample_new[2] < Dynamic_threshold[2]) && (Error_flag[2] == 0) )		{					if( (interval > 10 ) && ( interval < 100 ) )			{				Step_Out+=1;				regulation3 = regulation2;				regulation2 = regulation1;				regulation1 = regulation0;				regulation0 = 1;				if( regulation3 && regulation2 && regulation1 && regulation0 )					printf("Step:%d/r/n",Step_Out);			}			else 			{							regulation3 = 0;				regulation2 = 0;				regulation1 = 0;				regulation0 = 0;						}			interval = 0;		}	}		//printf("Step:%d/r/n",Step_Out);	/*------速度 距离 卡路里-----*/	if(sampling_cnt0 == 100)	{		i_cnt++;		sampling_cnt0 = 0;		m_nPedometerValue = Step_Out;		Dynamic_step = m_nPedometerValue - m_nLastPedometer;//2s的步数变化		/*---每步距离----*/		if( Dynamic_step == 1 ) //身高取 170cm = 1.70m			StepLen = 1.70/5;		else if(  Dynamic_step == 2  )			StepLen = 1.70/4;		else if(  Dynamic_step == 3 )			StepLen = 1.70/3;		else if( Dynamic_step == 4  )			StepLen = 1.70/2;		else if( Dynamic_step == 5 )			StepLen = 1.70/1.2;		else if( ( Dynamic_step >= 6 ) && ( Dynamic_step < 8 ) )			StepLen = 1.70;		else if( Dynamic_step >= 8 )	StepLen = 1.70*1.2;				Speed = StepLen/2;		calories = Speed * weight/400;		printf("Dynamic_step:%d/t",Dynamic_step);				m_nLastPedometer = m_nPedometerValue;		printf("StepLen:%.3f/t",StepLen);		printf("Speed:%.3f/t",Speed);		printf("calories:%.3f/r/n",calories);	}}

6 最后

技术解答、毕设帮助、开题指导print("Q 746876041") 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125314.html

相关文章

  • 基于STM32Cube MX开发TencentOS-Tiny软件包

    摘要:基于开发的软件包导师汪礼超学员崔林威摘要腾讯物联网操作系统是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,可裁剪等特性。图中断函数处理进行生成工程配置,按如下界面进行配置,最后点击,并点击。 ...

    shiyang6017 评论0 收藏0
  • 基于片机智能家居控制系统

    摘要:中控部分采用了单片机,其主要作用是获取输入部分数据,经过内部处理,控制输出部分。 设计简介: 本设计是基于单片机的智能家居控制系统,主要实现以下功能: 可通过DS18B20实时测量环境温度温度具有上下限,自动模式下温度超出限值,GMS发送短信温度上下限通过手机蓝牙设置系统可通过手机蓝牙、红外...

    zacklee 评论0 收藏0
  • 启明云端分享:小米智能手环主控秘密

    摘要:年末,年即将走进尾声,忙碌了一年准备给家里人买一份礼物,这些天看了很多产品,最终选定了小米智能手环。 年末,2021年即将走进尾声,忙碌了一年准备给家里人买一份礼物...

    wpw 评论0 收藏0
  • 三年探索:一条自控、电信/科类学生技术成长路线

    摘要:所以我必须基于自己现在的情况走出一条适合自己情况的成长路线。下位机上位机的思想下位机上位机这就是我自己探索出来的技术成长路线。对和嵌入式的朋友感兴趣的朋友可以试一下我这条学习路线 ...

    Miracle 评论0 收藏0
  • 从MicroPython到TPYBoard 萝卜教育引领青少年学科式编程新标杆

    摘要:萝卜教育致力于为青少年和创客爱好者提供开源硬件产品系列开发板以及零配件产品。致力于成为中国专业的青少年学科编程教育品牌,立足青少年学科编程培训,给孩子一个新的思考方式,让中国青少年与世界同步 2019年3月,教育部发布《2019年教育信息化和网络安全工作要点》,推动在中小学阶段设置人工智能相关课程,逐步推广编程教育。其实早在2017年,我国就将少儿编程纳入到国务院发展规划中,作为国家级...

    GeekGhc 评论0 收藏0
  • TPYBoard开发板带你轻松玩转MicroPython

    摘要:实践证明,加上稳定可靠的外围电路和抗干扰电源,以为核心的产品能成功应用于苛刻的工业环境,使开源硬件和开发平台得到更广泛的应用,产品多样性远远高于官方开发板,是学习的首选。 说到MicroPython,也许有人会感到陌生。而说到和它密切相关的Python,是否会恍然大悟呢?Python属于解释型语言,1989年才开发完成的Python显然非常年轻。然而经过数十年的磨砺,如今Python已...

    z2xy 评论0 收藏0

发表评论

0条评论

不知名网友

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<