内容发布更新时间 : 2024/12/23 4:02:51星期一 下面是文章的全部内容请认真阅读。
因为用户在运动中可能手平持设备或者将设备置于口袋中,所以设备的放置方向不定,为此我们通过计算三个加速度矢量的峰峰值,比较之后选择加速度变化最大的轴作为计步的标准轴,获得一条步行运动的正弦曲线轨迹。具体的代码如下:
tempX = GMeter->X.Max - GMeter->X.Min; tempY = GMeter->Y.Max - GMeter->Y.Min; tempZ = GMeter->Z.Max - GMeter->Z.Min; if(tempX > tempY) { if(tempX > tempZ) { flag = 1;
tempMax = tempX; } else { flag = 3;
tempMax = tempZ; } } else {
if(tempY > tempZ) { flag = 2;
tempMax = tempY; } else { flag = 3;
tempMax = tempZ; }
} if(tempMax > 1000) { return flag; } else { return 0;
其中flag用来标记加速度矢量最长的轴。并且当加速度矢量的峰峰值大于1000时,加速度矢量最长的轴才能作为计步的标准轴。
第二步是峰值检测,程序记录了上次记录数据矢量长度和运动方向,通过矢量长度的变化,可以判断目前加速度的方向,并和上一次保存的加速度方向进行比较,如果是相反的,即是刚过峰值状态,则进入计步逻辑进行计步,否则舍弃。
- 34 -
通过对峰值的次数累加可得到用户步行步伐。
if((GMeter.X.Data[mm] > GMeter.X.UpLimit) && StepFlag == 0) StepFlag = 1; if((GMeter.X.Data[mm] < GMeter.X.DownLimit) && StepFlag ==1)
{StepFlag = 0;
StepCount++;}
最后是去干扰,手持设备会有一些低幅度和快速的抽动状态,可能是用户的手抖,或者是某个故意搞恶作剧的用户想通过快速反复摇动设备来模拟人走路,这些干扰数据如果不剔除,会影响记步的准确性,对于这种干扰,我们可以通过给检测加上阈值和步频判断来过滤。
此功能用到的函数主要如下:
void DataInit(SensorData *SData);//加速度值初始化
unsigned char DataSelect(SensorData *GMeter);//计步标准轴的选取 void CountStepInit(void); //计步初始化
void CountStep(signed short X,signed short Y,signed short Z);//计步 u8 MPU_Init(void); //初始化MPU6050 u8 mpu_dmp_init(void);//DMP初始化 详细代码参见附录二。 5.5.6 地图
本系统设计的地图可以显示240*280的分辨率的图片。并且可以放大,缩小。 使用本功能时,必须搭配GSM模块。下面将介绍地图功能的具体实现过程:
首先,我们需要利用GPS模块获得定位点的经纬度坐标。然后系统的地图功能需要通过网络向腾讯地图服务器发送请求。因此,必须给系统配置通讯模块。本系统选择GSM模块,利用GSM模块的GPRS功能与腾讯地图服务器建立TCP链接,把经纬度信息、缩放级别、分辨率等信息整合成一个请求命令后,以GET方式通过GPRS功能向腾讯地图服务器发送一个HTTP协议字符串。具体如下所示:
GET/ws/staticmap/v2/?center=30.766859,110.671047&zoom=13&format=jpg&size=240*280&key=U4GBZ-5RQ33-GSH3K-3UYBR-YL33J-ACBFY HTTP/1.1\\r\\nHost:apis.map.qq.com
其中,staticmap表示调用的是静态图。center=30.766859,110.671047表示经纬度信息。zoom表示调用的缩放级别,最小为4,最大为18。Format表示调用
- 35 -
的地图图片的格式,本系统调用的格式为jpg。size=240*280为图片分辨率。 key=U4GBZ-5RQ33-GSH3K-3UYBR-YL33J-ACBFY为申请的开发者密钥。由于地图功能需要使用SD卡,所以当用户点击地图进入地图界面后,系统首先调用SD_Init函数检测是否插了SD卡,如果用户没有插SD卡,则在屏幕上打印“请插入SD卡!!!”系统检测10次SD卡,如果10次之后依然没有检测到SD卡,则系统会自动退出。当系统检测到SD卡后则调用f_mount函数在SD卡上挂载FATFS文件系统。然后系统会调用Check_Sim900a函数检测SIM900A设备,如果检测5次之后仍然未检测到SIM900A设备,则系统自动退出地图功能。检测到SIM900A设备之后,系统调用Gsm_Gprs_GetFile函数向腾讯地图服务器请求地图信息,随后腾讯地图以网页的形式向GSM模块回传信息,并且在串口2的中断服务函数中将接收的信息存放在file_buff[153600]这个数组中,因为这个数组占内存过大,超过了芯片内部的64K RAM,因此,我在芯片外部扩展了1M字节的SRAM。当系统接收完信息后,调用Http_Jpg函数,将网页信息中的图片提取出来并以gsm.jpg为文件名保存在SD卡中。然后系统调用jpgDisplay函数将jpg格式图片解码并显示在LCD屏上。
当用户点击放大按钮时,系统调用ZuChengGetStr函数将http协议字符串的ZOOM值调大,重新向腾讯地图请求地图信息。并显示在LCD屏上。当用户点击缩小时,系统调小GET命令的ZOOM值,再次向腾讯地图请求地图信息。
此功能用到的函数主要如下: u8 State3_Map(void)//进入地图状态
u8 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime);//SIM900A发送命令 void Check_Sim900a(void); //检查并配置GSM模块 sim900a_res_e sim900a_init(void);//SIM900A初始化 void sim900a_gprs_init(void);//GPRS功能初始化 void Gsm_Gprs_GetFile(void); //通过GPRS获取地图信息 sim900a_res_e sim900a_gprs_http_link(void);//gprs连接http服务器 u8* CalcZoom(u8 zo, u8* str);//zoom值调整函数 u8* ZuChengGetStr(u8 size);//整合http协议字符串函数 u8 RequestAgain(void);//http重连接函数
u8 Http_Jpg(char* src, char* dst) //将网页信息中的jpg图片提取出来
- 36 -
void jpgDisplay(char *pic_name) //解码jpg图片并显示在LCD屏上 u8 FindJpg(FIL* fp, u8* data) //从网页中提取jpg图片 详细代码参见附录二。
- 37 -
6 系统功能测试与分析
系统功能测试是对系统的各项功能进行实际操作,查找他们有没有BUG或者设计的参数是否达到预定的要求。例如计步功能,就要在实际走路的过程中,使用计步功能,测试本计步功能是否能够正确的记录使用者的步数。下面将分别介绍本系统测试的结果。
6.1开机主界面测试
系统主界面如图6.1所示:
图6.1 系统主界面
开机之后,系统的时钟自动开始运行,显示良好,分别点击各个功能按钮,均能正常跳转。达到了预期要求。
6.2万年历功能测试
系统万年历功能的设计指标要求时间可调整。本系统设计的万年历可以支持1901年-2099年阳历、阴历、生肖、二十四节气、星期、以及实时时钟的功能,并且可以支持实时的时间更改。在时间更改的过程中,能判断时间的合法性,防
止用户错误更改时间。当本系统装上后备电池时,时间不会丢失,开机时不需要 再次设定时间。效果图如图6.2和图6.3:
- 38 -