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
}
}


Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



