# rttsummer **Repository Path**: linshire/rtt-summer-camp-study ## Basic Information - **Project Name**: rttsummer - **Description**: leraning for rtthread summer. - **Primary Language**: C - **License**: AGPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-07-18 - **Last Updated**: 2024-11-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # rttsummer #### 介绍 一个简单的基于MPU6050的计步小项目 #### 作品背景 #### 实现功能 从MPU6050获取xyz三轴的加速度,经过一系列的滤波,计算出行走步数,并通过esp8266上传使用usp协议传至局域网内的其他设备; #### 整体系统框架 ![](README.assets/%E8%AE%A1%E6%AD%A5DEMO.png) #### RT-Thread使用情况概述 #### 硬件框架 ![](README.assets/%E7%A1%AC%E4%BB%B6%E6%A1%86%E6%9E%B6-16595148968265-16596834987674.png) #### 软件模块说明 ##### mpu6050初始化 ```c user_device_init = rt_device_find(MPU6050_I2C_BUS_NAME); if(user_device_init != RT_NULL) { error = rt_device_open(user_device_init, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX | \ RT_DEVICE_FLAG_STREAM); if(error == RT_EOK) MPU6050 = mpu6xxx_init(MPU6050_I2C_BUS_NAME, RT_NULL); else rt_kprintf("errorr: %d\n",error); ``` step_count线程主要程序 ``` //阻塞线程定时执行 rt_sem_take(timeout,1000); //获取三周加速度数据 error = mpu6xxx_get_accel(MPU6050, &databuffera); //数据更新 sample.x= databuffera.x; sample.y= databuffera.y; sample.z= databuffera.z; //极值更新 peak_update(&peak,&sample); //滑动滤波 slid_update(&slid,&sample); //不乏判断并计步 Num += detect_step(&peak,&slid); rt_kprintf("%d,%d,%d\n",sample.x,sample.y,sample.z); rt_kprintf("%d\n",Num); ``` 计步判断算法 static int detect_step(peak_value_t *peak,slid_reg_t *slid) { //char flag=0; int step_cnt = 0; //判断最活跃轴 char res=is_most_active(peak); switch (res) { case MOST_ACTIVE_NULL: break; case MOST_ACTIVE_X: short threshold_x=(peak->oldmax.x+peak->oldmin.x)/2; if(slid->old_sample.x>threshold_x&&slid->new_sample.xoldmax.y+peak->oldmin.y)/2; if(slid->old_sample.y>threshold_y&&slid->new_sample.yoldmax.z+peak->oldmin.y)/2; if(slid->old_sample.z>threshold_z&&slid->new_sample.z