Liczba postów: 49
Liczba wątków: 6
Dołączył: May 2017
Reputacja:
21
22-08-2021, 09:55
(Ten post był ostatnio modyfikowany: 22-08-2021, 10:01 przez StaCh.)
(19-02-2020, 08:40)Robson Kerman napisał(a): 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
Chcialbym poprawic dokladnosc (!) odczytow polozenia horyzontalnego punktu w ktorym aktualnie sie znajduje razem z odbiornikiem GPS. Poniewaz dluzsza obserwacja kolejnych odczytow pokazuje skale bledow (nie wiem na razie dokladnie z czego to wynika) chcialbym czesc z tych bledow wyeliminowac korzystajac z wartosci HDOP podawanej w ciagu #GPGSA odczytywanym przez biblioteke TinyGPS++. Metoda kombinacji przykladow sklecilem taki kod, ktory niestety z niewiadomego powodu nie ogranicza wyswietlanych na LCD wartosci do takich dla ktorych spelniony jest warunek HDOP<=2.00. Sadze ze gdzies jest blad ktorego kompilator nie odrzuca a ow fragment nie dziala.
Prosze o analize i pomoc w rozwiklaniu zagadki.
Kod:
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
float h_dop;
// The TinyGPS++ object
TinyGPSPlus gps;
// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
// Horizontal diminution
TinyGPSCustom hdop(gps, "GPGSA", 16); // $GPGSA sentence, 16th element
void setup()
{
Serial.begin(115200);
ss.begin(GPSBaud);
lcd.begin();
lcd.backlight();
}
void loop()
{
// This sketch displays information every time a new sentence is correctly encoded.
while (ss.available() > 0)
if (gps.encode(ss.read()))
{
displayInfo();
}
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("No GPS detected: check wiring."));
while(true);
}
}
void displayInfo()
{
lcd.clear();
if (gps.location.isValid() || hdop.isUpdated() )
// if (gps.location.isUpdated())
{
float h_dop = gps.hdop.hdop();
Serial.print(F(" HDOP=")); Serial.print(h_dop);
Serial.println();
}
else
{
Serial.println(F("INVALID"));
lcd.setCursor(0, 0);
lcd.print("Brak synchronu");
delay(5000);
}
if (h_dop <= 2.00)
{
lcd.setCursor(0, 0);
lcd.print("Lat ");
lcd.print(gps.location.lat(), 6);
lcd.setCursor(0, 1);
lcd.print("Lon ");
lcd.print(gps.location.lng(), 6);
}
else
{
Serial.print ("Blad");
}
}
Na monitorze portu szeregowego wyswietla mi rozne wartosci HDOP w zakresie od 0.00 do 99.99 czasem trafia sie cos posredniego ale bardzo rzadko i caly czas na LCD mam nowe wartosci co 1 sekunde bez eliminacji niedokladnych odczytow.
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
Liczba postów: 49
Liczba wątków: 6
Dołączył: May 2017
Reputacja:
21
29-08-2021, 13:13
(Ten post był ostatnio modyfikowany: 29-08-2021, 13:17 przez StaCh.)
Wyszlo na to ze sam sobie musze odpowiedziec :-(. Po pierwsze prawdopodobnie ze wzgledu na polecenie "void" funkcja dopisana przeze mnie nie dzialala. Pomoglo zastapienie definicji "void DisplayInfo" przez sama owa procedure i teraz dziala.
Co do dokladnosci to obserwujac dostatecznie dlugo wyniki odebrane przez odbiornik GPS wynika, ze oprocz odczytow o slabej dokladnosci (pomijanych przez moj skrypt) wazna jest jeszcze aktualna konfiguracja "widzianych" przez odbiornik satelitow. Stojac w miejscu gdzie nie bylo ograniczen horyzontu uzyskalem dokladnosc ponizej 1 metra. Przypominam ze dlugosc odcinka na ziemi odpowiadajacego 1 stopniowi szerokosci geograficznej to okolo 110km. Jesli ow 1 stopien podzielimy przez 1000000 ( szesc cyfr po kropce) to wyjdzie 11 centymetrow. To jest zmiana wartosci ostatniej cyfry odczytu o 1.
Poniewaz zalezalo mi na dokladnosci moge jeszcze zmienic warunek aby HDOP byl mniejsze ale to i tak dokladnosc zalezy od pogody oraz aktualnej konfiguracji satelitow na niebosklonie.
W zasadzie przy dostatecznym ukladzie satelitow stojac w miejscu zmienia mi sie tylko ostatnia cyfra odczytu. Lepsza precyzja urzadzen geodezyjnych wynika z zastosowania jeszcze innych zrodel pozycjonowania.
Jesli uzywam programu bez ograniczen to odchylenie standardowe dla szerokosci geograficznej wynosi 16,25m a dla dlugosci geograficznej 4,5m ze wszystkich 3650 probek odebranych przez odbiornik.
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
Liczba postów: 884
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
43
29-08-2021, 17:58
(Ten post był ostatnio modyfikowany: 29-08-2021, 17:59 przez Jarewa0606.)
Żeby dokładnie precyzyjnie określać jest potrzebny dokładny precyzyjny zegar. Dlatego geodezyjne są na zegarze atomowym...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą.
Liczba postów: 49
Liczba wątków: 6
Dołączył: May 2017
Reputacja:
21
30-08-2021, 12:43
(Ten post był ostatnio modyfikowany: 01-09-2021, 14:40 przez StaCh.)
(29-08-2021, 17:58)Jarewa0606 napisał(a): Żeby dokładnie precyzyjnie określać jest potrzebny dokładny precyzyjny zegar. Dlatego geodezyjne są na zegarze atomowym...
Nie wystarczy precyzyjny zegar potrzeba wiecej puktow stalych w terenie.
Moj pomysl sie sprawdza. Mam 2 odbiorniki w naroznym oknie na polnoc i wschod. Czasem przez ponad pol godziny odbiornik nie odbiera sygnalow o HDOP <= 1.50
czyli nie zasmiecam sobie odczytow niepewnymi wynikami. Czyli o precyzji decyduje aktualna konfiguracja satelitow.
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.