• 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
Tiny GPS++, Podzielenie danych na części
#1
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.
 
Odpowiedź
#2
Zajrzyj tu: https://www.arduino.cc/reference/tr/lang...ingobject/. Zamieniasz liczbę na string, potem ze stringa wyławiasz literki do kolejnego stringa.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
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ć.
 
Odpowiedź
#4
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:

}
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#5
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.
 
Odpowiedź
#6
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
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.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#8
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.
 
Odpowiedź
#9
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
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#10
Problem rozwiązany Smile
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości