ZL31ARM: wskaźnik przyspieszenia 3D z czujnikiem MEMS LIS35
Fot. 7. Powiązanie osi kierunków z czujnikiem MEMS
Poniższy kod nie powinien sprawić problemów w zrozumieniu, ale niektóre fragmenty mogą wymagać komentarzy. Funkcja sChar2Str() konwertuje liczbę w tekst i przyjmuje wskaźnik do ciągu znaków typu char (do którego zostanie zapisana liczba w postaci symboli) oraz wartość liczbową typu signed char. Podczas wyznaczania wysokości słupków występuje podzielenie zmierzonej wartości przez 60 i pomnożenie przez 49 – pierwsza wartość została w przybliżeniu wybrana jako maksymalna mierzona statycznie, a druga określa maksymalną wysokość słupka od linii odniesienia.
signed char x, y, z , xKor=0, yKor=0, zKor=0; void indicator(){ unsigned int j; signed int x_temp, y_temp, z_temp; unsigned char STATE = 0; //Rysowanie ramek drawRectangle(-40, -50, -20, 50, RED, 0); drawRectangle(-10, -50, 10, 50, BLUE, 0); drawRectangle( 20, -50, 40, 50,GREEN, 0); //Rysowanie linii odniesienia drawLine(-66,0,66,0,WHITE); //Wyświetlenie oznaczeń osi LCDPutChar('X',120, 35, 0, 0xFFF, 0x00); LCDPutChar('Y',120, 65, 0, 0xFFF, 0x00); LCDPutChar('Z',120, 95, 0, 0xFFF, 0x00); while(1){ //Odczyt wartości przyśpieszeń LIS35_GetPosition(&x, &y, &z); //Korekta wskazan akcelerometru x+=xKor; y+=yKor; z+=zKor; sChar2Str(tempCHAR, x);//Konwersja wartości przyśpieszenia w osi x na ciąg typu String for (j=0; j < 4; j++) //Wyświetlenie znaków ciągu LCDPutChar(tempCHAR[j], 0, 20+j*7, 0, 0xFFF, 0x00); sChar2Str(tempCHAR, y); for (j=0; j < 4; j++) LCDPutChar(tempCHAR[j], 0, 50+j*7, 0, 0xFFF, 0x00); sChar2Str(tempCHAR, z); for (j=0; j < 4; j++) LCDPutChar(tempCHAR[j], 0, 80+j*7, 0, 0xFFF, 0x00); //(***KOREKTA***) x_temp = (signed int) (( (float) x/60)*49); //Wyznaczenie wysokości słupka if(abs(x_temp) > 49) x_temp = (x_temp < 0) ? -49:49; //Ograniczenie wysokości słupka y_temp = (signed int) (( (float) y/60)*49); if(abs(y_temp) > 49) y_temp = (y_temp < 0) ? -49 : 49 ; z_temp = (signed int) (( (float) z/60)*49); if(abs(z_temp) > 49) z_temp = (z_temp < 0) ? -49 : 49 ; //Rysowanie słupków przyśpieszenia drawRectangle(-38, 0, -21, x_temp, RED, 1); drawRectangle( -8, 0, 9, y_temp, BLUE, 1); drawRectangle( 22, 0, 39, z_temp,GREEN, 1); Delay(0x6FFFFF); //Ustawienie okresu aktualizacji obrazu //Czyszczenie narysowanych słupków drawRectangle(-38, 0, -21, x_temp, 0x000, 1); drawRectangle( -8, 0, 9, y_temp, 0x000, 1); drawRectangle( 22, 0, 39, z_temp, 0x000, 1); if(GPIO_ReadInputDataBit(JOY_PORT, JOY_RIGHT) == 0) break; //Zakonczenie dzialania } }