单片机毕业设计 stm32智能手环

news2025/8/7 11:10:25

文章目录

  • 1 简介
  • 1 项目背景意义
  • 2 系统方案的设计
  • 3 系统总体结构
  • 4 系统硬件设计
    • 4.1 主控模块
    • 4.2 姿态解算模块:MPU6050
    • 4.3 DS3231实物图
    • 4.4 TFT显示模块
    • 4.5 硬件连接效果
  • 5 跌倒检测算法原理
    • 5.1 跌倒检测的判定流程
    • 5.2 关键算法实现


1 简介

🔥 Hi,大家好,这里是丹成学长的毕设系列文章!

🔥 对毕设有任何疑问都可以问学长哦!

这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是

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

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

🧿 选题指导, 项目分享:

https://blog.csdn.net/molodi/article/details/125933857


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

🧿 选题指导, 项目分享:

https://blog.csdn.net/molodi/article/details/125933857

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

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

相关文章

CIPU落地专有云:是“小众需求”还是“机会之门”?

2022 年 11 月&#xff0c;云栖大会主论坛&#xff0c;阿里巴巴集团副总裁、阿里云智能基础产品事业部负责人蒋江伟分享了阿里云专有云的一项新进展 —— CIPU 落地飞天企业版。在分析师峰会上&#xff0c;阿里巴巴集团研究员、阿里云专有云总经理刘国华也向分析师们详细介绍了…

双一流高校全球通邮经验:Coremail安全海外中继提升科研效率

在这个“后疫情时代”&#xff0c;高校间的国际交流合作更应架起桥梁&#xff0c;承担起文明交流互鉴的责任&#xff0c;邮件往来交流作为学术交流的重要工具&#xff0c;保障全球高校学术交流安全畅通&#xff0c;是Coremail针对高校教育邮件服务的重点之一。 针对高校行业面临…

python一键采集高质量陪玩,心动主播随心选......

人生苦短&#xff0c;我用python 北京时间11月6日上午&#xff0c;2022英雄联盟全球总决赛&#xff08;S12&#xff09;冠亚军决赛在美国旧金山大通中心球馆进行&#xff0c;随着DRX的成功夺冠&#xff0c;在全球进一步掀起了电竞热潮。 newzoo 《2022电竞市场报告》显示&…

《MySQL实战45讲》——学习笔记18 “索引失效、函数/隐式转换“【建议收藏】

本文介绍几种MYSQL中索引失效的典型SQL用法&#xff0c;包括对索引字段使用函数、索引字段隐式类型转换&#xff08;如字符串转数值类型&#xff0c;实质上也是使用CAST函数&#xff09;、索引字段隐式字符编码转换&#xff08;如utf8mb4字符集与utf8字符集的等值判断&#xff…

Leetcode101:对称二叉树

原文链接&#xff1a;101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;r…

日志异常检测准确率低?一文掌握日志指标序列分类

背景 目前&#xff0c;日志异常检测算法采用基于时间序列的方法检测异常&#xff0c;具体为&#xff1a;日志结构化->日志模式识别->时间序列转换->异常检测。异常检测算法根据日志指标时序数据的周期性检测出历史新增、时段新增、时段突增、时段突降等多种异常。 然…

那么多优秀的自动化测试工具,而你只知道Selenium?

如今&#xff0c;作为一名软件测试工程师&#xff0c;几乎所有人都需要具备自动化测试相关的知识&#xff0c;并且懂得如何去利用工具&#xff0c;来为企业减少时间成本和错误成本。这是为什么呢&#xff1f; 在以前&#xff0c;测试人员一般都只需要扮演终端用户&#xff0c;…

【云原生 | Kubernetes 系列】--Gitops持续交付 ArgoCD 部署与概念

1. Pull Pipeline 使用Pull Pipeline可以不在集群以外的地方保存凭据,避免凭据泄露的风险 工作模式: 两个Git仓库. 程序代码 程序员维护 分支策略 Hotfix Feature Develop Release Master 部署配置 基于OAM管理 Updater CI流水线交付了新的Image Operator Spec 期望状态 …

UE5笔记【一】安装、第一个关卡:光线、原点、平面;光线、天空、云朵;内容抽屉;运动控制;

第一步&#xff1a;安装UE5 下载Epic Games客户端。 下载EpicGames客户端&#xff0c;完成注册账户。 然后选择【库】、选择【引擎版本】后面的加号【】、然后点击【下拉箭头】选择你要安装的版本。点击【安装】。 特别提醒&#xff1a;请找一块特别大的硬盘存储空间&#xf…

prometheus+alertmanager 企业微信告警

一、应用安装启动 1、软件准备 alertmanager-0.24.0.linux-amd64.tar.gz blackbox_exporter-0.22.0.linux-amd64.tar.gz node_exporter-1.4.0.linux-amd64.tar.gz prometheus-2.40.0-rc.0.linux-amd64.tar.gz 2、配置文件 cat /data/prometheus/prometheus.yml #根据自己情况…

liunx集成jmeter进行压测实践

首先liunx环境需要部署jdk 1,获取jmeter免安装包&#xff1a;点击我获取免安装包 2,获取jmeter-manger工具&#xff0c;用于生成报告&#xff0c;日志等 点击我获取工具 3,在服务器上新建一个文件夹存放jmeter&#xff0c;推荐在/usr/local/下面&#xff0c;我这里由于权限问…

微服务真的过时了吗?Twitter员工因为微服务被马斯克解雇了

马斯克吐槽微服务 最近Twitter因为马斯克收购而大幅裁员的消息闹得可谓是沸沸扬扬&#xff0c;但是最近马斯克吐槽Twitter内部服务200个RPC的新闻更是闹得不可开交&#xff0c;并且和员工在twitter上的争论更是因为了程序猿界的广泛转发和评论 微服务真的是一个糟糕的设计吗&a…

如何处理海量数据文件以及大文件数据查找

目录 一.处理海量整数文件 ①问&#xff1a;假定有40亿个无符号整数&#xff0c;判断某数据是否在其中&#xff1f; ②问&#xff1a;假定有40亿个无符号整数&#xff0c;找到只出现一次的数据&#xff0c;两次&#xff0c;三次...&#xff1f; ③问&#xff1a;两个文件各…

[ Linux ] 动静态库 手把手教你写一个自己的库

目录 静态库与动态库 生成 发布动静态库 形成发布静态库 形成发布动态库 一个makefile同时生成动静态库 如何使用动静态库 使用静态库 正确做法&#xff1a; 使用动态库 运行动态库 为什么动态库运行时有找库的步骤 静态库与动态库 静态库&#xff08;.a&#xff0…

聊一聊作为高并发系统基石之一的缓存,会用很简单,用好才是技术活

大家好&#xff0c;又见面了。 在服务端开发中&#xff0c;缓存常常被当做系统性能扛压的不二之选。在实施方案上&#xff0c;缓存使用策略虽有一定普适性&#xff0c;却也并非完全绝对&#xff0c;需要结合实际的项目诉求与场景进行综合权衡与考量&#xff0c;进而得出符合自…

Spring Security认证之用户定义

本文内容来自王松老师的《深入浅出Spring Security》&#xff0c;自己在学习的时候为了加深理解顺手抄录的&#xff0c;有时候还会写一些自己的想法。 在前面的案例中&#xff0c;我们登陆的用户信息是基于配置文件来配置的&#xff0c;其本质上是基于内存来实现的。但是在实际…

(5)多机器人集群编队策略

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、多机器人集群编队策略1、多机器人协同作业冲突问题&#xff08;1&#xff09;介绍&#xff08;2&#xff09;多机器人系统…

学会Spring Cloud微服务架构绝活,渣本也能进大厂

微服务架构是互联网很热门的话题&#xff0c;是互联网技术发展的必然结果。它提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间互相协调、互相配合&#xff0c;为用户提供最终价值。虽然微服务架构没有公认的技术标准和规范或者草案&#xff0c;但业界已经有一些很有…

C++程序设计--第三章内容

提前声明&#xff1a; 本文内容为华北水利水电大学研究生C课程&#xff0c;如有 侵权请告知&#xff0c;作者会予以删除 1.函数 函数作用 —— 任务划分&#xff1b;代码重用定义形式 类型 函数名 &#xff08; 形式参数表&#xff09;{语句序列}调用形式 函数名&#x…

数据结构:树

文章目录一.树的概念二.树的相关概念三.树的表示一.树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下…