Witam,
próbuję zrobić rejestrator GPS i potrzebuje wyciągnąć do zmiennej lattitude i longitude, używam biblioteki TinyGPS++. W przykładach znalazłem coś takiego:
Serial.print(gps.location.lng(), 6);
co wyświetla wartość "30.236640" czyli taką jaka mi odpowiada. Teraz moje pytanie jak zapisać powyższe do zmiennej, kiedy zapiszę tak i wyświetlę zmienną:
gpsString = gps.location.lng();
otrzymuje tylko 2 miejsca po przecinku "30.24"
a kiedy tak:
gpsString = (gps.location.lng(), 6)
zwraca mi 6. Zmienna jest stringiem. Ktoś pomoże? z programowaniem arduino dopiero zaczynam.
Różne rodzaje zmiennych
Komputery, a szczególnie małe kontrolery jak Arduino mają mało pamięci. Wymyślono więc różne rodzaje zmiennych liczbowych. Przechowują różne zakresy liczb, im mniejszy, tym mniej zajmuje pamięci.
int - przechowuje liczby od -32768 do 32767, zajmuje 2 bajty pamięci
word - przechowuje liczby od 0 do 65535, zajmuje 2 bajty pamięci
byte - przechowuje liczby od 0 do 255, zajmuje 1 bajt pamięci
char - przechowuje liczby od -128 do 127, zajmuje 1 bajt pamięci
long - przechowuje liczby od -2 miliardów do 2 miliardów, zajmuje 4 bajty pamięci
unsigned long - przechowuje liczby od 0 do 4 miliardów, zajmuje 4 bajty pamięci
Są też dodatkowe rodzaje zmiennych do liczb ułamkowych:
float - zapamiętuje ułamki z dokładnością do 7 cyfr po przecinku, zajmuje 4 bajty
double - zapamiętuje ułamki z dokładnością do 15 cyfr po przecinku, zajmuje 8 bajtów
Nie wiem z czym walczysz. Może ja za mało kawy dzisiaj wypiłem, może piszesz niejasno.
Tu przykład konwersji liczb ułomnych do napisów.
Kod:
float liczbafloat= 15.5555555555555;
double liczbadouble= 22.2222222222222;
String stringfloat="";
String stringdouble="";
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print("Liczbafloat, wydruk domyslny = ");
Serial.println (liczbafloat);
Serial.print("Liczbadouble, wydruk domyslny = ");
Serial.println (liczbadouble);
Serial.println ();
liczbafloat+=1;
liczbadouble+=1;
stringfloat=(String(liczbafloat));
stringdouble=(String(liczbadouble));
Serial.println("Po konwersji na stringi");
Serial.print("Liczbafloat jako string domyslny = " );
Serial.println (stringfloat);
Serial.print("Liczbadouble jako string domyslny = " );
Serial.println (stringdouble);
Serial.println ();
Serial.println ("###################### po formatowniu do 6 znakow po przecinku ###################################");
Serial.print("Liczbafloat, wydruk domyslny = ");
Serial.println (liczbafloat,6);
Serial.print("Liczbadouble, wydruk domyslny = ");
Serial.println (liczbadouble,6);
Serial.println ();
stringfloat=(String(liczbafloat,6));
stringdouble=(String(liczbadouble,6));
Serial.println("Po konwersji na stringi");
Serial.print("Liczbafloat jako string domyslny = " );
Serial.println (stringfloat);
Serial.print("Liczbadouble jako string domyslny = " );
Serial.println (stringdouble);
Serial.println ();
liczbafloat+=1;
liczbadouble+=1;
delay(1000);
}
A czemu należy unikać liczb zmiennoprzecinkowych zauważysz po chwili oglądania wydruków. Możesz też się domyśleć dlaczego komputer/telefon trzeba restartować co jakiś czas.
Czemu należy unikać String,String() to też inny temat.
W każdym bądź razie najlepiej te wyniki zamieniać na liczbę int//uint/uint16_t/uint32_t w zależności jakie na nich chcesz robić operacje i jaki jest wymagany zakres, pamiętać że jest ona x100, x1000000, na takich liczba wykonywać obliczenia/porównania i zapisywać do tablicy znaków zamiast do String.