LinkedIn YouTube Facebook
Szukaj

Wstecz
IoT

MEMS-owa poziomica z sensorem LIS35 na STM32

Dosyć skomplikowana wydawać się może poniższa funkcja, która ma za zadanie w miejsce wcześniej narysowanego bąbelka powietrza przerysować wycinek z tła poziomicy, aby wyczyścić ekran.

void TFTN_WriteBall(const unsigned short *buffer, const unsigned short *bufferball,
			int xPos, int yPos, int xSize, int ySize)

Można by przerysowywać całą bitmapę tła ale strasznie długo to trwa, dlatego odświeżana jest tylko używana część ekranu. Funkcja przyjmuje następujące parametry:

*buffer – wskaźnik do tablicy z tłem poziomicy
*bufferball – wskaźnik do tablicy z rysunkiem stalowej kulki
xPos oraz  yPos – to pozycja wspomnianej kuleczki na tle
xSize oraz  ySize – określa wymiar bitmapy kulki do wyświetlenia.

Sama funkcja wygląda następująco:

void TFTN_WriteBall(const unsigned short *buffer, const unsigned short *bufferball,
			int xPos, int yPos, int xSize, int ySize)
{
 	 //Draw bitmap
 	 unsigned short Word0,Word1;
 	 unsigned short x=0,y=0;


	// Set column address range
	TFTN_SendCmd(CASET);
	TFTN_SendData(xPoss);
	TFTN_SendData(xPoss+xSize-1);	
    
  	// Set row address range
	TFTN_SendCmd(PASET);
	TFTN_SendData(yPoss);
	TFTN_SendData(yPoss+ySize-1);
  
	// Write memory
  	TFTN_SendCmd(RAMWR);

	//Przerysowanie w miejscu starej kulki tla poziomicy
	for(y=0;y> 4) & 0xFF);        

				//pixel 1 B, pixel 2 R
			TFTN_SendData(((Word0 & 0x0F) << 4) | ((Word1 >> 8) & 0xF));  	

				TFTN_SendData(  Word1 & 0xFF);     
		}
	}	
  	TFTN_SendCmd(NOP);
	
	// Set column address range
	TFTN_SendCmd(CASET);
	TFTN_SendData(xPos);
	TFTN_SendData(xPos+xSize-1);	
    
  	// Set row address range
	TFTN_SendCmd(PASET);
	TFTN_SendData(yPos);
	TFTN_SendData(yPos+ySize-1);
  
	// Write memory
  	TFTN_SendCmd(RAMWR);
	
	
	//Rysowanie kulki
	for(y=0;y> 4) & 0xFF);                      
		//pixel 1 B, pixel 2 R   
   		 TFTN_SendData(((Word0 & 0x0F) << 4) | ((Word1 >> 8) & 0xF));  
   		 TFTN_SendData(  Word1 & 0xFF);     
		}
	}
	
	//Zapamietaj stara pozycje kulki
	xPoss=xPos;
	yPoss=yPos;
	TFTN_SendCmd(NOP);
}

W miejscu wyznaczonym przez akcelerometr rysowana zostaje bitmapa kulki z tym, że kolor czarny nie jest renderowany, a na jego miejsce jest przerysowywana piksel po pikselu bitmapa tła, aby kulka wyglądała profesjonalnie a nie jako kwadrat z rysunkiem kuli.

W momencie gdy uzyskamy poziom w osi x oraz y, kulka znajdzie się w środku najmniejszego okręgu narysowanego na tle, a buzzer wyda dźwięk informując nas dodatkowo o tym fakcie. Jako że bitmapa kulki jest na przemian usuwana oraz przerysowywana na nowo uzyskujemy efekt przeźroczystości, i zwykła bitmapa uzyskuje efekt bąbelka powietrza w wodzie.