计步、速度、距离、卡路里的功能实现

代码已上传,可下载!!!
https://download.csdn.net/download/weixin_46704960/12674679

⒈硬件部分

①芯片:

​ STM32F103ZET6(主控芯片) ADXL345(加速度传感器芯片)

②硬件连接

③IIC协议通信


​ ★ALT ADDRESS引脚为SDO引脚,接地时选择备用IIC地址0X53,器件地址+写命令为0XA6,器件地址+读命令为0XA7

​ ★本次使用的ADXL345模块,使用IIC模式时 CS引脚接着上拉电阻并与VS、Vdd连接3.3V电源

⒉软件部分

①ADXL345初始化

void ad345_Init(void)
{
signal_write_ad345(0x2E,0x00);   //0000 0000 禁用中断
signal_write_ad345(0x31,0x0B); //0000 1011 禁用自测模式 测量范围,正负16g,13位模式  1 LSB代表3.9 mg
signal_write_ad345(0x2C,0x09);// 0000   1001  位4为0:正常功率运行  速率设定为50HZ
signal_write_ad345(0x2D,0x08);//0000 1000   测量位设置为1,置于测量模式  器件处于正常工作模式
signal_write_ad345(0x2F,0x00); //1000 0000将DATA_READY中断映射到INT1
signal_write_ad345(0x2E,0x80);   //1000 0000使能 DATA_READY 中断
signal_write_ad345(0x1E,0xF9);   //X 偏移量 使用水平仪测量参数校准
signal_write_ad345(0x1F,0xFF);   //Y 偏移量
signal_write_ad345(0x20,0x00);   //Z 偏移量
}

②Step算法

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.70mStepLen = 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);}
}

③商用改进方案

​ ★使用ADXL345的FIFO和自动休眠唤醒功能达到低功耗的目的

​ ★接上INT2作为外部中断,并通过INT_SOURCE寄存器的D4、43进行活动和静止判断

3资料参考

https://www.analog.com/cn/analog-dialogue/articles/pedometer-design-3-axis-digital-acceler.html

https://www.cnblogs.com/qsyll0916/p/6691413.html

ADXL345数据手册

基于STM32的智能手环(一)-------计步、速度、距离、卡路里的功能实现相关推荐

  1. 《基于STm32的智能手环项目》笔记

    Q1.本科期间做过什么科研项目/竞赛?具体负责什么?做出了什么成果?是否获得什么荣誉奖项?(简单介绍一下<基于STM32智能手环>课程设计?) 项目经历:本科课程设计做过一个<基于S ...

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

    STM32系列 基于STM32的智能手环系统的设计 STM32系列 前言 一.系统方案的设计 1.1系统功能分析 1.2系统总体结构 二.硬件电路的搭建 2.1STM32最小系统组成部分 2.2S硬件 ...

  3. 智能手环功能模块设计_基于STM32实现智能手环设计

    龙源期刊网 http://www.qikan.com.cn 基于 STM32 实现智能手环设计 作者:付海生 陈婷婷 韩百科 涂曾兵 来源:<科学导报 · 学术> 2017 年第 10 期 ...

  4. 5、♥☆基于STM32的智能手环√★☆

    5.♥☆基于STM32的智能手环√★☆

  5. 基于STM32蓝牙智能手环脉搏心率计步器体温显示设计

    基于STM32蓝牙智能手环脉搏心率计步器体温显示设计 本设计由STM32F103C8T6单片机核心板电路+ADXL345传感器电路+心率传感器电路+温度传感器+lcd1602电路组成. 1.通过重力加 ...

  6. 基于STM32单片机智能手环脉搏心率计步器体温显示设计

    " 基于STM32单片机智能手环脉搏心率计步器体温显示设计." (获取方式:在"智能车杂谈"微信回复:009). 01 材料准备 清单列表 1.ADXL345模 ...

  7. 《基于STM32的智能手环》

    这个项目在以STM32F411为主的硬件开发平台+MDK4软件开发平台+串口编程软件ISP搭建的环境中进行开发.最终我们在这块开发板上完成了1.时间.日期界面:2.温湿度测量界面:3.心率血压测量界面 ...

  8. 基于STM32单片机智能手环脉搏心率检测计步器原理图PCB

    功能: 0.本系统采用STM32F103C8T6作为单片机,并采用的是成熟的模块 1.采用LCD1602作为显示液晶可以实时显示计步和心率的参数 2.心率传感器采用的是成熟的检测模块,经过LM393信 ...

  9. 基于STM32的智能健康监测手环

    摘  要 随着科技的飞速发展,人民的生活质量得到极大改善,同时人们对自身的健康状况更加关注.因此,需要设计了一款基于STM32的智能手环系统,其可显示步数.心率.温度.血氧等数据,使人们更快更好地实时 ...

最新文章

  1. SpringBoot在IDEA中实现热部署
  2. android studio撤销按钮,Android Studio无法撤消(Android Studio Can't Undo)
  3. TOC之关键链项目管理遇到软件工程7原则
  4. spring+springmvc+maven+mongodb
  5. 代码生成器1.0正式发布
  6. Android studio中提交svn一直卡在performing VCS commit
  7. amplify color_如何使用Amplify监视Nginx
  8. tomcat 洞合集
  9. 海康、大华摄像头chrome高版本实时播放(java集成)
  10. Web渗透测试实战:基于Metasploit 5.0
  11. RAMOS (内存操作系统)-无忧百科(不断完善中)
  12. Docker 停止容器
  13. 《数据结构》邓俊辉 网课习题详细解析(第五章:二叉树)
  14. 计算机处理io和cpu,虚拟化技术原理(CPU、内存、IO)
  15. JDBC与数据库连接
  16. 学习---微分_中值定理及洛必达法则
  17. 测试人员如何管理项目与风险预警
  18. Macbook无法开机?如何尝试自救
  19. 倚天屠龙记君临天下_战斗系统
  20. 生态,形态,业态 ---零售业弯道超车

热门文章

  1. Java工程师 中间件 分布式(一) 面试题(Day26)
  2. 字节程序媛:大厂技术岗求职流程解读经验分享,这是一份保姆级校招攻略
  3. 虚幻学习3--使用Quixel创建动画【笔记】
  4. 手机背光检测设备,三菱5U程序案例,4轴伺服控制,串口通讯,成熟项目案例
  5. 【众说区块链】从阿里区块链医疗聊起,落地应用要突破中心机构数据壁垒
  6. 基础讲解USB/UAC运作原理
  7. QtCreator选择新建项目类别,各项目类别介绍
  8. deepin、dde的历史起源与发展(附deepin所有版本的dde截图)
  9. layui框架学习(10:时间线)
  10. 2022年有什么性价比高的蓝牙耳机?盘点四款性价比蓝牙耳机