ADXL345应用——计步器设计(软件实现)
0赞
发表于 4/13/2012 3:57:54 PM
阅读(7584)
经过之前对单双击,摇晃检测等功能的熟悉,在计步器设计中,我们把各种功能糅合在一起,实现计步器初始参数的输入。
首先输入身高,LCD屏幕显示“input high cm”,等待输入,这里应用了ADXL摇晃检测和旋转检测:设置初始身高170(cm),当向左摇晃时,身高加1(cm),向右摇晃时,身高减1(cm)。设定结束后,竖直放置计步器顺时针旋转,则返回,逆时针旋转则进行下一项参数输入。
if(fifo_flag==9) { status = 170; int2str(status,str,8); disp_str(0,0,"input high: "); disp_str(0,2," cm "); disp_str(0,4," "); disp_str(0,6," "); disp_str(0,2,str); ADuC7026_static_rotate_2(); while(1) { if(fifo_flag==1) { fifo_flag=10; SPI_ADXL345_READ(XL345_INT_SOURCE); SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00); fifo_flag=10; mean_x = 0; mean_y = 0; mean_z = 0; for(i=0; i<1; i++) { ADuC7026_once(); mean_x+=long_r_data[0]; mean_y+=long_r_data[1]; mean_z+=long_r_data[2]; } mean_x/=1; mean_y/=1; mean_z/=1; mean_x-=static_x; mean_y-=static_y; mean_z-=static_z; long_delay(1000000); if(mean_y>0) { left_right =0 ; if(status>0) status-=1; } else { left_right =1; if(status<255) status+=1; } ADuC7026_once_2(); if(static_y>200) { fifo_flag=0; break; } else if(static_y<-200) { fifo_flag=20; break; } long_delay(50000); int2str(status,str,8); disp_str(0,0,"input high: "); disp_str(0,2," cm "); disp_str(0,4," "); disp_str(0,2,str); ADuC7026_static_rotate_2(); } } }
输入体重。身高参数设置完毕后进入体重设置。LCD屏幕显示“input weight kg”,,设置初始体重60(kg),与身高设置类似,想做摇晃时,体重加1(kg),向右摇晃时,体重减1(kg)。设定结束后,竖直放置计步器顺时针旋转,则返回,逆时针旋转则进行下一项参数输入。
if(fifo_flag==20) { weight = 60; int2str(status,str,8); disp_str(0,0,"input weight: "); disp_str(0,2," kg "); disp_str(0,4," "); disp_str(0,6," "); long_delay(1000000); disp_str(0,2,str); ADuC7026_static_rotate_2(); while(1) { if(fifo_flag==1) { fifo_flag=10; SPI_ADXL345_READ(XL345_INT_SOURCE); SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00); fifo_flag=10; mean_x = 0; mean_y = 0; mean_z = 0; for(i=0; i<1; i++) { ADuC7026_once(); mean_x+=long_r_data[0]; mean_y+=long_r_data[1]; mean_z+=long_r_data[2]; } mean_x/=1; mean_y/=1; mean_z/=1; mean_x-=static_x; mean_y-=static_y; mean_z-=static_z; long_delay(1000000); if(mean_y>0) { left_right =0 ; if(weight>0) weight-=1; } else { left_right =1; if(weight<255) weight+=1; } ADuC7026_once_2(); if(static_y>200) { fifo_flag=0; break; } else if(static_y<-200) { fifo_flag=5; break; } long_delay(50000); int2str(weight,str,8); disp_str(0,2,str); ADuC7026_static_rotate_2(); } } }
进入计步状态,LCD第一行显示“step s”,第二行显示速度“V s/sed”,单位以“步/秒”计,第三行显示“cal mc”。程序代码如下:
if(fifo_flag==5) { T1CON = 0xC4; IRQEN=GP_TIMER_BIT; disp_str(0,0,"step: s"); long_delay(6000000); while(1) { for(i=0; i<500; i++) { ADuC7026_once_2(); temp+=static_x; if(static_x>temp_max) temp_max_1 = static_x; if(static_xtemp_up&&flag==0) { step+=1; flag = 1; } else if(static_x
卡路里计算程序如下:
int2str(step - run_step,str,8); disp_str(0,2,"V: s/sec "); disp_str(0,4,"cal: mc"); disp_str(16, 2, str); if(step - run_step<3) { length=status/5.0; } else if(step - run_step==3) length = status/4.0; else if(step - run_step==4) length = status/3.0; else if(step - run_step==5) length = status/2.0; else if(step - run_step>5&&step - run_step<8) length = status; else length = 1.2*status; calorie=(unsigned int)(2.5*length*(step - run_step)*weight); int2str(calorie,str,8); disp_str(32, 4, str); if(step - run_step>4) disp_str(0, 6, "run "); else if(step - run_step<4&&step - run_step>0) disp_str(0,6,"walk "); else disp_str(0,6,"static "); run_step = step; T1CLRI =0X01;