GPS informace na vyžádání

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
Jirka_H
Příspěvky: 2
Registrován: 08 zář 2019, 23:42
Reputation: 0

GPS informace na vyžádání

Příspěvek od Jirka_H » 09 zář 2019, 16:29

Zdravim, mam otázku na vyžádání si pozice z modulu NEO-6M.

Jedná se mi o to, abych si vyžádal pozici z modulu třeba každé 2 minuty či při velké změně pohybu začal tento časový rozestup vyžádání snižovat.
Původně jsem situaci chtěl řešit přes "delay". Ale na tom jsem selhal protože se mi ztrácela data....
Respektive, když nepoužiji delay tak načtu všechny informace ale refrest je každou sekundu či i méně:
- lon
- lat
- alt
- pocet satelitu
- presnost
....

Když jsem použil delay tak se mi již nenačetla polovina informací.
Máte někdo zkušenosti s načítáním gps souřadnic třeba na vyžádání přes loop každé 2 minuty či při velké změně polohy oproti předešlé (diff) tak snížení tohoto rozestupu?

Za rady děkuji.

Kód: Vybrat vše

//Libraries 
#include <Wire.h>  
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

int RXPin = 4;
int TXPin = 3;
int GPSBaud = 9600;
String dateString = "";
String timeString = "";
String lonString = "";
String latString = "";


TinyGPSPlus gps;
SoftwareSerial gpsSerial(RXPin, TXPin);

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address, if it's not working try 0x27.

void setup(){
  lcd.begin(20,4);   // iInit the LCD for 20 chars 4 lines
  lcd.setCursor(0,0); //First line
  

  lcd.setCursor(0,0);
  lcd.print("Lat: ");
  lcd.setCursor(0,1);
  lcd.print("Lon: ");  
  lcd.setCursor(0,2);
  lcd.print("Alt: ");  


  Serial.begin(9600);
  gpsSerial.begin(GPSBaud);
}

void loop()
{
    while (gpsSerial.available() > 0)
    if (gps.encode(gpsSerial.read()))
      lcd.clear();
      displayInfo();
      //Serial.println(gpsSerial.read());

    Serial.print("Sentences that failed checksum=");
    Serial.println(gps.failedChecksum());
 
    // Testing overflow in SoftwareSerial is sometimes useful too.
    Serial.print("Soft Serial device overflowed? ");
    Serial.println(gpsSerial.overflow() ? "YES!" : "No");


      if (millis() > 5000 && gps.charsProcessed() < 10)
      {
        Serial.println(F("No GPS detected"));
        while(true);
      }
}

void displayInfo()
{
  dateString = "";
  timeString = "";
  
  if (gps.location.isValid())
  {
    Serial.print("Latitude: ");
    Serial.println(gps.location.lat(), 6);
    lcd.setCursor(0,0);
    lcd.print("Lat: " + String(gps.location.lat(), 6));
    Serial.print("Longitude: ");
    Serial.println(gps.location.lng(), 6);
    lcd.setCursor(0,1);
    lcd.print("Lon: " + String(gps.location.lng(), 6));
    Serial.print("Altitude: ");
    Serial.println(gps.altitude.meters());
    lcd.setCursor(0,2);
    lcd.print("Alt: " + String(gps.altitude.meters()) + "m");

    lcd.setCursor(15,1);
    lcd.print("S: " + String(gps.satellites.value()));
    Serial.print("Satelites: ");
    Serial.println(gps.satellites.value());

    lcd.setCursor(13,2);
    lcd.print("P: " + String(gps.hdop.value()));
    Serial.print("Precision: ");
    Serial.println(gps.hdop.value());
    
  }
  else
  {
    Serial.println("Location: Not Available");
    lcd.setCursor(0,0);
    lcd.print("No location.");
    
  }
  
  Serial.print("Date: ");
  if (gps.date.isValid())
  {
    Serial.print(gps.date.month());
    Serial.print("/");
    Serial.print(gps.date.day());
    Serial.print("/");
    Serial.println(gps.date.year());
    dateString = String(gps.date.day()) + "-" + String(gps.date.month()) + "-" + String(gps.date.year());
  }
  else
  {
    Serial.println("Not Available");
    dateString = "No date";
  }

  Serial.print("Time: ");
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10)
    {
      Serial.print(F("0"));
      timeString = "0";
    }
    Serial.print(gps.time.hour());
    timeString = timeString + String(gps.time.hour()) + ":";
    Serial.print(":");

    if (gps.time.minute() < 10) 
    {
      Serial.print(F("0"));
      timeString = timeString + "0";
    }
    Serial.print(gps.time.minute());
    timeString = timeString + String(gps.time.minute()) + ":";
    Serial.print(":");
    
    if (gps.time.second() < 10) 
    {
      Serial.print(F("0"));
      timeString = timeString + "0";
    }
    
    Serial.print(gps.time.second());
    timeString = timeString + String(gps.time.second()); //+ ".";
    Serial.print(".");
    if (gps.time.centisecond() < 10) 
    {
      Serial.print(F("0"));
      //timeString = timeString + "0";
    }
    Serial.println(gps.time.centisecond());
    //timeString = timeString + String(gps.time.centisecond());    
  }
  else
  {
    Serial.println("Not Available");
    timeString = "No time";
  }
  lcd.setCursor(0,3);
  lcd.print(timeString);

  lcd.setCursor(20-dateString.length(),3);
  lcd.print(dateString);
  
  Serial.println();
  Serial.println();
  //delay(1000);
}

kiRRow
Příspěvky: 81
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: GPS informace na vyžádání

Příspěvek od kiRRow » 09 zář 2019, 17:18

Jak koukám jak je to napsané, tak v loopu se čeká na nějaká data, která přichází z toho GPS modulu. Takže bych tipnul, že ty data chodí z toho GPS modulu v nějakých pravidelných intervalech a ne až na vyžádání.

gilhad
Příspěvky: 333
Registrován: 07 bře 2018, 11:22
Reputation: 3

Re: GPS informace na vyžádání

Příspěvek od gilhad » 09 zář 2019, 17:45

Kód: Vybrat vše

    while (gpsSerial.available() > 0)
    if (gps.encode(gpsSerial.read()))
      lcd.clear();
      displayInfo();
Chapu-li dobre tento kus kodu, pak
  • dokud je dostupna nejaka informace
    • tak se precte a zakoduje (encode) a jestli je vysledek nenulovy
      • tak se smaze LCD
  • nasledne (tedy az zadna informace dostupna neni) se zavola displayInfo()
takze pokud dobre chapu tento kus kodu, tak ho naprosto nechapu.

kiRRow
Příspěvky: 81
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: GPS informace na vyžádání

Příspěvek od kiRRow » 09 zář 2019, 17:59

taky to tak nějak chápu ... nechápu jak někdo nepoužívá {} ... otázkou je jak to teď ten kompilátor veme ... napadají mě dvě možnosti jak to může dopadnout ...
1) buď přihlédne k tomu jak je odraženo volání funkce displayInfo(); a dopadne to takhle :

Kód: Vybrat vše

while (gpsSerial.available() > 0){
	if (gps.encode(gpsSerial.read())){
		lcd.clear();
		displayInfo();
	}
}
2) bez těch závorek se bude podmínky týkat pouze následující příkaz a dopadne to takto

Kód: Vybrat vše

while (gpsSerial.available() > 0){
	if (gps.encode(gpsSerial.read())){
		lcd.clear();
	}
}
displayInfo();

gilhad
Příspěvky: 333
Registrován: 07 bře 2018, 11:22
Reputation: 3

Re: GPS informace na vyžádání

Příspěvek od gilhad » 09 zář 2019, 18:27

Kompilator to vezme tak, jak je to napsane. A protoze na rozdil od treba Pythonu C++ ignoruje pocet mezer mezi prikazy, tak je spravne samozrejme 2)

(Pokud pomineme #define a jine podobne #neco, tak se program da zcuknout na jednu radku, aniz by kompilotor zaznamenal jakykoli rozdil. Akorat hlaseni "chyba na radku 1" nebude moc informativni :) , ale to je problem programatora, nikoli kompilatoru )

Jirka_H
Příspěvky: 2
Registrován: 08 zář 2019, 23:42
Reputation: 0

Re: GPS informace na vyžádání

Příspěvek od Jirka_H » 09 zář 2019, 19:09

Tak v prvé řadě musím přiznat, že máte pravdu - chybějící závorky.

Ale to celou situaci popravdě neřeší (nevyřešilo)

Kód: Vybrat vše

void loop()
{
    while (gpsSerial.available() > 0)
    {
      if (gps.encode(gpsSerial.read()))
      {
            lcd.clear();
            displayInfo();
      
          Serial.print("Sentences that failed checksum=");
          Serial.println(gps.failedChecksum());
       
          // Testing overflow in SoftwareSerial is sometimes useful too.
          Serial.print("Soft Serial device overflowed? ");
          Serial.println(gpsSerial.overflow() ? "YES!" : "No");
      
            if (millis() > 5000 && gps.charsProcessed() < 10)
            {
              Serial.println(F("No GPS detected"));
              while(true);
            }
      }
      delay(2000);
    }
}

Nezobrazí nic.
Když delay zakomentuji tak se data načítají každou vteřinu - respektive tak často jak je GPS modul pošle do arduina.

Takže pokud to chápu dobře, tak GPS posílá data nonstop každou vteřinu. Takže by stačilo napsat kód tak aby si šáhnul jednou za x vteřin na poslední hodnotu kterou od GPS modulu dostal.

Ale to očividně nevim jak. :(


A když ten delay zakomentuju tak zase dostávám data každou sekundu. Navíc v serialMonitoru mam čas pravidelně, ne ale pokaždé:

Kód: Vybrat vše

Sentences that failed checksum=1
Soft Serial device overflowed? YES!

gilhad
Příspěvky: 333
Registrován: 07 bře 2018, 11:22
Reputation: 3

Re: GPS informace na vyžádání

Příspěvek od gilhad » 09 zář 2019, 19:28

Tady se o tom pise cesky (nejak)
https://navody.arduino-shop.cz/navody-k ... eo-6m.html

Tady anglicky
https://lastminuteengineers.com/neo6m-g ... -tutorial/
a je tam datasheet toho modulu, vcetne casovani komunikace
na strance 16 je presne casovani, jak z toho modulu tahat informace - modul se vybere signale slave select (z libovolneho pinu arduina), za minimalne 500us (0.5ms) mu zacnes posilat hodiny a cist data (radky s $GPxxx data), dekodovat to muzes treba toho popisu, nebo tu je TinyGPS, az prestanes posilat hodiny, tak bys mel jeste 1ms podrzet slave select a pak ho teprve vypnout.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host