LinkedIn YouTube Facebook
Szukaj

Wstecz
IoT

Cyfrowy kompas na STM32 z czujnikiem HMC5883

Za pomocą funkcji trygonometrycznych obliczane są współrzędne punktu końca wirtualnej linii która ma swój początek na środku ekranu. Współrzędne te zmieniają się w zależności od kąta obrazującego kierunek geograficzny, dzięki takiemu rozwiązaniu mamy w zależności od kąta ruch punktu po okręgu o określonej średnicy. Skoro zmienna k oznacza nam położenie południa to k+180 da nam północ itd.

Wyjaśnienia wymaga zmienna declinationAngle, która jest wyznaczona za pomocą strony http://magnetic-declination.com/ i przekształcona na radiany (kalkulator dostępny np. http://www.wolframalpha.com/input/?i=%284%C2%B0+21%27%29+in+radians) i oznacza ona deklinację magnetyczną.

Ponieważ do realizacji kompasu elektronicznego został użyty sam magnetometr jest duże prawdopodobieństwo że kąt będzie się gwałtownie zmieniał w pewnym przedziale, a to oznacza drganie liter obrazujących kierunki świata na wyświetlaczu.

Na „odreagowanie” została stworzona kolejna funkcja, rysująca losowe figury, służąca tylko i wyłącznie rozrywce i nie ma nic wspólnego z kompasem prócz tego, że także wykorzystuje obliczenia trygonometryczne:

void Opcja_Krzywe(void)
	{
	float stopien = (2 * 3.1415926) / 360;
	unsigned short kata=0,katb=0,katc=0;
	unsigned char a=0,b=0,c=0;
	volatile int xl1,yl1,xl2,yl2,xl3,yl3;
	volatile signed char seta,setb,setc;
	unsigned int kolor;	
	extern volatile unsigned char losowo;
	unsigned char Efekt[12] = {"\0"};	


	
	TFTN_Clear(0x000);
	//Losowe wartości kilku zmiennych (losowa pierwsza figura)
	seta=abs((rand()+losowo)%10+1);
	setb=abs((rand()+losowo)%10+1);
	setc=abs((rand()+losowo)%10+1);
	
	//Wyjscie do menu glownego przez JOY_DOWN
	while(GPIO_ReadInputDataBit(JOY_SW_PORT, JOY_DOWN))
	{
		a++;
		b++;
		c++;
		
		if (a==seta)
		{
		xl1 = (int)(66 + 20 * sin(stopien*kata));
		yl1 = (int)(66 + 20 * cos(stopien*kata));
		a=0;
			kata++;
			if(kata==359) kata=0;
		}
		
		if(b==setb)
		{
		xl2 = (int)(xl1 + 20 * sin(stopien*katb));
		yl2 = (int)(yl1 + 20 * cos(stopien*katb));
			b=0;
			katb++;
			if(katb==359) katb=0;
		}
	
		if(c==setc)
		{
		xl3 = (int)(xl2 + 20 * sin(stopien*katc));
		yl3 = (int)(yl2 + 20 * cos(stopien*katc));
			c=0;
			katc++;
			if(katc==359) katc=0;
		}
		
		//Zmiaana koloru w zalerznosci od figury
		kolor=((15-seta)<<8 | ((15-setb)*10)<<4 | ((15-setc)*100));
		
		//Ruysowanie figury
		TFTN_PutPixel(xl3, yl3, kolor);
		



		//Po wcisnieciu JOY_ENTER kolejny obrazek
		if (!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5))
		{
			TFTN_Clear(0x000);
			
//Losowa predkosc obrotu kazdej z 3 niewidocznych lini
//
//		Linia 1		 Linia 2	Linia 3
//          0.0------------xl1,yl1------------xl2,yl2------------xl3,yl3(rysowanie piksela)
//		 seta		setb		  setc
//
			seta=abs((rand()+losowo)%10+1);
			setb=abs((rand()+losowo)%10+1);
			setc=abs((rand()+losowo)%10+1);

			a=0;
			b=0;
			c=0;
			
		//Predkosci przedstawione na LCD
		sprintf((char *)Efekt, "%2d %2d %2d\0", seta,setb,setc);
		TFTN_WriteXY(Efekt ,0, 3,0xFFF,0x000, font1);
		}
		
	}
}

Tak naprawdę to są trzy proste o jednakowej długości połączone do siebie szeregowo z czego pierwsza z nich ma stały punkt zaczepu tj. środek ekrany a jej koniec jest początkiem następnej prostej itd. z czego ostatnia linia swoim końcem rysuje pewne krzywe które są zobrazowane na TFT. Każda z części tej 3-odcinkowej prostej obraca się z pewną losową prędkością względem swojego początku co daje nam ciekawy efekt. Aby było ciekawiej figury zmieniają swój kolor w zależności od ich kształtu a informacje na temat prędkości są wyświetlone na ekranie.