• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
TinyGPS++, formatowanie danych?
#1
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.
 
Odpowiedź
#2
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
 
Odpowiedź
#3
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości