Arduino Polska Forum
Tiny GPS++, Podzielenie danych na części - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino)
+--- Wątek: Tiny GPS++, Podzielenie danych na części (/watek-tiny-gps-podzielenie-danych-na-cz%C4%99%C5%9Bci)

Strony: 1 2


Tiny GPS++, Podzielenie danych na części - Osiasty - 16-02-2020

Cześć.
Potrzebuję pomocy z biblioteką Tiny GPS++. Kiedy używam kodu:
Kod:
Serial.println(gps.location.lng(),6);
Otrzymuje dane które mnie interesują np. 18.639749.
Chciałbym te otrzymane dane podzielić aby wyświetlały mi się po dwie cyfry i w ten sposób były odświeżane

A = cyfra 1 i 2 (18);
B = cyfra 3 i 4 (63);
C = cyfra 5 i 6 (97);
D = cyfra 7 i 8 (49);

Czy jest taka możliwość zrobienia tego na Arduino bo nie mogę znaleźć żadnego przykładu tak podzielenia danych.
Pozdrawiam.


RE: Tiny GPS++, Podzielenie danych na części - kaczakat - 16-02-2020

Zajrzyj tu: https://www.arduino.cc/reference/tr/language/variables/data-types/stringobject/. Zamieniasz liczbę na string, potem ze stringa wyławiasz literki do kolejnego stringa.


RE: Tiny GPS++, Podzielenie danych na części - Osiasty - 16-02-2020

Dzięki ale jako początkujący to napisanie tego zajmie mi chyba z rok bo mało jest na ten temat przykładów jak ma to wyglądać.
Może ktoś zna jakiś prostszy sposób na tą konwersję.
Napiszę do czego zmierzam może to ułatwi zrozumienie problemu. Urządzenie do którego mam wysłać dane przyjmuje je jako format BCD po 2 cyfry by je wyświetlić na LCD jako współrzędne. Więc muszę podzielić je na A,B,C,D. Następnie za pomocą komend:

Kod:
tmpData1[6] =  bcd(A);  // fourth two digits
tmpData1[7] =  bcd(B);  // third two digits  NO
tmpData1[8] =  bcd(C);  // second two digits
tmpData1[9] =  bcd(D);  // firs two digits

chciałbym wysłać je do urządzenia aby prawidłowo odczytał wartość współrzędnych.
Chyba że istnieje jakiś inny sposób by to rozwiązać.


RE: Tiny GPS++, Podzielenie danych na części - kaczakat - 16-02-2020

No to źle Cię zrozumiałem, myślałem że chcesz sobie drukować napisy czy tam pokazać na LCD. Jak to mają być liczby to możesz sobie pierwszą liczbę podzielić modulo przez 100 i przypisać do liczby całkowitej int.
int i= 18.639749%100, zostanie przypisana liczba 18. 
Potem pierwszą liczbę mnożysz x100 i znowu dzielisz modulo przez 100, masz i=63, (18.63*100)%100 = 63, itd.
Jak pierwsza liczba w części całkowitej może być większa niż 100 to podziel pierwszy raz modulo 1000, no ale jest że ma być liczba dwucyfrowa, tak że 100 jest OK.
Dzielenie i mnożenie na pewno będzie szybsze niż zamiana na string, wyłowienie dwóch znaków i potem z powrotem zamiana na int.
A po chwili zastanowienia łatwiej zacząć od tyłu:
Kod:
float zmiennaf=18.681232;
uint32_t zmienna32;

void setup() {
  // put your setup code here, to run once:
  delay(5000);
zmienna32= 1000000*zmiennaf;
Serial.begin(115200);
while (zmienna32>0)
{
Serial.println(zmienna32%100);
zmienna32/=100;
}
}

void loop() {
  // put your main code here, to run repeatedly:

}



RE: Tiny GPS++, Podzielenie danych na części - Osiasty - 17-02-2020

Wow dzięki za kod wstawiłem go w ten sposób

Kod:
float zmiennaf;
uint32_t zmienna32;
void loop()
{
Serial.begin(19200);
float zmiennaf = (gps.location.lat());
zmienna32= 1000000*zmiennaf;
Serial.begin(19200);
while (zmienna32>0)
{
Serial.println(zmienna32%100);
zmienna32/=100;
}


Na wyjściu w monitorze otrzymałem.
72
97
33
50
11  1.7  50.339771 
72
97
33
50
11  2.9  50.339767 
68
97
33
50
11  1.7  50.339767

Jak widać jest małe przekłamanie w ostatnich 2 cyfrach ale na tyle małe że pomijalne  teraz muszę pomyśleć jak te dane wyciągać do A,B,C,D. dane podkreślone to inne dane nie związane z tematem.


RE: Tiny GPS++, Podzielenie danych na części - kaczakat - 17-02-2020

Jeśli używasz Arduino z AVR (Atmega) to jest tylko float, a float ma to do siebie, że to co ma na ostatnim miejscu znaczącym to jest trochę losowe. Jak masz jakiś inny uC to użyj zmiennej double, z AVR double jest dalej floatem. Ale sama biblioteka, nawet jeśli używa double z AVR i tak podaje Ci tylko przybliżone dane, choć GPS może np. podawać dokładniejszą pozycję zapisaną w postaci binarnej na XXbitach. W przypadku GPS może to mieć zresztą mniejsze znaczenie, i tak każdy pomiar lokalizacji to skakanie po mapie, GPS w aucie tylko zgaduje, że jedziemy po ulicy a nie po budynkach na mapie i podaje dane uśrednione.


RE: Tiny GPS++, Podzielenie danych na części - Robson Kerman - 17-02-2020

Dane z gps mają postać (string) 12345678912. Biblioteka TinyGPS++ zamienia je na int, a następnie (nie wiem po co) na double:

Kod:
double TinyGPSLocation::lng()
{
updated = false;
double ret = rawLngData.deg + rawLngData.billionths / 1000000000.0;
return rawLngData.negative ? -ret : ret;
}

Otrzymujemy float 12.345678912, a kolega znowu zamienia je na int.
Sensu nie widzę.

Wywalić bibliotekę i pracować na czystych danych NMEA.
Już gdzieś o tym pisałem na łamach naszego forum.


RE: Tiny GPS++, Podzielenie danych na części - Osiasty - 18-02-2020

Patrzyłem na zawartość danych jakie wysyła mi moduł GPS i nie są prawidłowe
Znaczy się to co dostaje w linijce
$GNGGA,091609.00,5020.37459,N,01838.41470,E nijak ma się do wartości które dostaje z wykorzystaniem biblioteki które pokazują prawdziwe dane.
Więc jak tu użyć czystych danych.

Obecnie użyłem takiego kodu:
Kod:
float zmiennalat;
float lat;

void loop()
{
zmiennalat = (gps.location.lat());
lat = (zmiennalat/0.000001);
}

Obecnie pod "lat" mam cyfrę 50339920.00 
Wysyłając ją do urządzenia wyświetli pierwsze dwie cyfry a więc 50.
Czy jest więc możliwość aby wyświetlić cyfry od trzeciej aby wyglądało to na:  339920.00
Wtedy wysyłając ją w drugą pozycję wyświetliło by 33 i znowu skasować 2 pierwsze cyfry wysłać itd.
Może to jest sposób na mój problem.


RE: Tiny GPS++, Podzielenie danych na części - Robson Kerman - 19-02-2020

Ta biblioteka nie czyta prefiksów Glonass Galileo tylko GPS, czyli szukaj $GPGGA. Najprostrze i najtańsze odbiorniki muszą wysyłać przynajmniej $GPRMC, ale w/w biblioteka już niestety tego nie obsługuje.

Odpowiadając na pytanie:
Tak jest możliwość. Najprościej to pomnożyć pierwsze dwie cyfry przez 1000000 i odjąć od 50339920.00


RE: Tiny GPS++, Podzielenie danych na części - Osiasty - 19-02-2020

Problem rozwiązany Smile