Neo-6m GPS Modul am UNO

Hallo,

ich habe dieses Modul am UNO. Ich brauche eigentlich nur Koordinaten, evtl. noch die Uhr.
Aus den Beispielen habe ich einen Sketch genommen und da alles rausgemacht was nicht nach Koordinaten aussah.
Das blieb dann übrig:

#include <SoftwareSerial.h>
#include <TinyGPS.h>

unsigned long x = 0;

TinyGPS gps;
SoftwareSerial ss(3, 4);

static void smartdelay(unsigned long ms);

void setup()
{
  Serial.begin(9600);
  ss.begin(9600);
}
// -------------------------------------------------------------------
void loop()
{
  Serial.println(x);
  x++;

//  getGPS();
//}
//String getGPS()
//{
  float flat, flon;

  smartdelay(1000);
  gps.f_get_position(&flat, &flon);
  Serial.println(String(flat, 6) + ";" + String(flon, 6));
  Serial.println();
}
// -------------------------------------------------------------------
static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

Das läuft auch soweit und bringt die Koordinaten auf den Monitor.
Aber - wenn ich jetzt das GPS-auslesen in eine Funktion schreibe klemmt es (die auskommentierten Zeilen am Anfang der Loop, Zeilen 22 - 25, aktivieren). Dann macht er noch 3 Durchgänge und dann war es das - Ausgabe steht.
Da komme ich nicht mehr weiter. Hat da jemand einen Tipp wo es hängt?

Gruß Uwe

Kompiliert der das so? :astonished:

Kein Return in einer Funktion mit "String getGPS()".

Funktion auf String ohne Zuweisung?

String Meinstring=getGPS();

Schuppeste:
Kein Return in einer Funktion mit "String getGPS()".

Das war es wohl, mit
return (String(flat, 6) + ";" + String(flon, 6));
geht es...

Kompiliert hat er es, lief ja auch 2 Durchgänge der Loop.

Danke

Eine Funktion, die ein String Objekt zurückliefert, braucht man (ich jedenfalls) sowieso nicht.

Aber das eigentliche Problem ist: Wenn eine Funktion nichts zurückliefert, obwohl sie es sollte, ist das in C nur eine Warnung, und das Ergebnis ist undefiniert. ( 3 Mal laufen dann hängen ist also möglich )

getGPS() ist nur ein -unglücklicher- Wrapper um gps.f_get_position(&flat, &flon); und dauert immer 1 Sekunde. (Nicht ganz so smart, wenn noch was anderes zu tun ist.)

Mein Vorschlag (wenn schon, denn schon) :

bool getGPS(char* text, TinyGPS& gps, Stream& s) {
// liefert true und in text neue Koordinaten
// false, wenn text noch nicht geändert wurde 
// Achtung: text muss mindestens 22 Zeichen groß sein, keine Prüfung !
   if (s.available()) {
      if (gps.encode(s.read()) ) {
         float flat, flon;
         gps.f_get_position(&flat, &flon);
         dtostrf(flat, 10, 6, text);
         text[10] = ';';
         dtostrf(flon, 10, 6, text+11);
         return true;
      }
   }
   return false;
}

 
char msg[22];
void loop() {
   if ( getGPS(msg, gps, ss) ) {
      Serial.println(msg);
   }
}

ungetestet

Generell:
In einer “echten” Anwendung hat man evtl. mehr davon, wenn man die Koordinaten als Zahlen zur Verfügung hat.

Hallo und nochmals danke, klappt jetzt.
Ich brauche die Koordinaten als String da ich sie "nur" via Internet zu einem Server zum Abrufen schicke.
Ich habe es jetzt auch noch geschafft, meine RTC nach dem GPS zu stellen. Ich bin überrascht wie genau und empfindlich das billige Teilchen ist.
BTW und OT: Weiss jemand wie man aus einer Liste mit Koordinaten eine Route mit einer Karte in einer HTML (oder PHP) Seite darstellen kann?

uk1408:
BTW und OT: Weiss jemand wie man aus einer Liste mit Koordinaten eine Route mit einer Karte in einer HTML (oder PHP) Seite darstellen kann?

Das einfachste wäre wahrscheinlich die Google Maps API.

Wenns unbedingt HTML oder solcher Onlinekram sein muss, würd ich auch den Gockel nehmen.
Ansonsten dürft das so ziemlich jedes vernünftige Kartenprogramm hinkriegen, QLandkarteGT z.B. aber auch Garmin Basecamp-andere nutz ich nicht (Basecamp auch kaum, das will nich in Wine->dann eben nicht).