GPS Tracker sendet nicht die Koordinaten

Hallo, melde mich bei euch, da ich das Problem selber nicht lösen kann.
Verwende den Code um den GPS Standort zu senden, nach dem der Schalter betätigt worden ist.
Das SMS wird gesendet mit dem Text der im Code steht nur werden die Koordinaten nicht gesendet. Steht nur:

0°00'00.0"N 0°00'00.0"E

Verwende Adruino Uno und Nano , GY-GPS6MV2 NEO6MV2 NEO-6M GPS Empfänger und SIM800L V2.0 QUAD BAND GSM GPRS MODUL
Alles wird mit 5V Spannung versorgt.
GPS LED blinkt, bekomme im Monitor Daten mit Standort viele Daten.
Ich habe auch die Komponenten einzeln getestet scheint alles zu funktionieren, vielleicht ist der Code falsch für die NEO 6 um die Position zu senden.
Wäre ich dankbar für eure Hilfe, ich habe auch schon andere Code versucht und stecke fest. Bin ziemlich am Anfang mit dem Projekt und will nicht aufgeben .

//Prateek
//www.justdoelectronics.com

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

SoftwareSerial Gsm(9, 10);          // RX, TX pins for GSM module
char phone_no[] = "+91883058xxxx";  // Put Your phone number
TinyGPS gps;
int buttonState;
unsigned long buttonPressTime;
bool isSMSsent = false;

void setup() {
  Serial.begin(9600);
  Gsm.begin(9600);

  Gsm.print("AT+CMGF=1\r");
  delay(100);

  Gsm.print("AT+CNMI=2,2,0,0,0\r");
  delay(100);

  pinMode(5, INPUT_PULLUP);
}

void loop() {
  bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;

  for (unsigned long start = millis(); millis() - start < 1000;) {
    while (Serial.available()) {
      char c = Serial.read();
      Serial.print(c);  // Output GPS data to the Serial Monitor
      if (gps.encode(c))
        newData = true;  // Check if there is new GPS data
    }
  }

  buttonState = digitalRead(5);

  if (buttonState == LOW) {  // Button is pressed
    if (!isSMSsent) {
      buttonPressTime = millis();

      float flat, flon;
      unsigned long age;
      gps.f_get_position(&flat, &flon, &age);

      Gsm.print("AT+CMGF=1\r");
      delay(400);
      Gsm.print("AT+CMGS=\"");
      Gsm.print(phone_no);
      Gsm.println("\"");
      Gsm.println("Alert I Need help...");
      Gsm.print("http://maps.google.com/maps?q=loc:");
      Gsm.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
      Gsm.print(",");
      Gsm.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
      delay(200);
      Gsm.println((char)26);
      delay(200);
      Serial.println("SMS Sent");
      isSMSsent = true;
    }
  } else {
    isSMSsent = false;
    delay(10);
  }

  Serial.println(failed);
}

Was wird Dir denn auf dem Serial.Monitor angezeigt?
Irgendwie passt das nicht zusammen, wenn Du den Serial.Monior nutzen willst...

Wofür sind diese Variablen gut?

Egal was du da wo gefunden hast, jetzt ist es dein Code.
Wenn beide Teile (GPS empfangen, SMS senden) einzeln funktionieren, sind sie wohl nicht richtig synchronisiert.

Und wo in der SMS ein Text in der von dir behaupteten Formatierung 0°00'00.0"N 0°00'00.0"E stehen soll, sehe ich auch nicht. Das ist wohl eher ein Text von maps.google.com, das dir wie gewünscht die Mitte der Erde (südlich von Ghana) anzeigt, weil gps.f_get_position() beim Aufrufzeitpunkt keine gültigen Werte hat.

Als Aufgabe ist im Monitor wird das ausgegeben.


Mit dem Code habe ich keine Erfahrung , versucht habe ich einfach im Internet nach fertigen Code zu suchen aber wie es aussieht, war die Idee schlecht.
Die Programme selber zu schreiben ist im Moment noch nicht möglich, ich versuche jetzt mal zu lernen.
Im SMS wird Text ,,Alert I Need help...,, ausgegeben wie im Code geschrieben. Und
0°00'00.0"N 0°00'00.0"E
Das wird wohl stimmen das keine gültige Werte vorhanden sind, woran kann das liegen?

Du sitzt irgendwo zwischen Bieberberg und Oberhausen ost-süd-östlich von Ulm - so sagen es jedenfalls die GNGGA, GNGLL und GNRMC-Nachrichten.

Hängt eigentlich Dein GPS an Pin 0 und 1?
Ob der NEO6M damit klarkommt, wenn man ihm irgendwelche Ausgaben um die Ohren haut? Auf der Schnittstelle landen ja auch alle normalen Ausgaben (wie z.B. Dein Serial.println("SMS Sent");).

Sonst wäre doch mal eine Testausgabe direkt nach f_get_position angesagt:

      gps.f_get_position(&flat, &flon, &age);
      Serial.print(F("Latitude: "));
      Serial.print(flat,6);
      Serial.print(F(" - Longitude: "));
      Serial.println(flon,6);

Die Serielle ist kein Bussystem.

Wenn das dieses Projekt werden soll, hast Du anders als dort und ziemlich ungünstig verkabelt.
EDIT: Nicht das eben verlinkte, sondern dieses Projekt ist es. Das folgende gilt trotzdem.

Die Hardware-Serial vom Uno/Nano (Pins 0 und 1) sollte immer frei bleiben für Debugausgaben.

In der letzten Zeile Deiner loop()-Funktion steht ein Serial.println(failed);, das ballerst Du jetzt bei jedem Durchlauf einmal auf den NEO6M.

Ich würde empfehlen, den GPS-Empfänger - ähnlich wie im verlinkten Projekt - auch auf eine Software Serial zu legen; D3 und D4 sind ja noch frei.

angepasster Code
//Prateek
//www.justdoelectronics.com

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

SoftwareSerial Gsm(9, 10);          // RX, TX pins for GSM module
char phone_no[] = "+91883058xxxx";  // Put Your phone number
SoftwareSerial neo(3, 4);           // RX, TX pins for GPS module

TinyGPS gps;
int buttonState;
unsigned long buttonPressTime;
bool isSMSsent = false;

void setup() {
  Serial.begin(9600);
  Gsm.begin(9600);
  neo.begin(9600);

  Gsm.print("AT+CMGF=1\r");
  delay(100);

  Gsm.print("AT+CNMI=2,2,0,0,0\r");
  delay(100);

  pinMode(5, INPUT_PULLUP);
}

void loop() {
  bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;

  for (unsigned long start = millis(); millis() - start < 1000;) {
    while (neo.available()) {
      char c = neo.read();
      Serial.print(c);  // Output GPS data to the Serial Monitor
      if (gps.encode(c))
        newData = true;  // Check if there is new GPS data
    }
  }

  buttonState = digitalRead(5);

  if (buttonState == LOW) {  // Button is pressed
    if (!isSMSsent) {
      buttonPressTime = millis();

      float flat, flon;
      unsigned long age;
      gps.f_get_position(&flat, &flon, &age);
      Serial.print(F("Latitude: "));
      Serial.print(flat,6);
      Serial.print(F(" - Longitude: "));
      Serial.println(flon,6);

      Gsm.print("AT+CMGF=1\r");
      delay(400);
      Gsm.print("AT+CMGS=\"");
      Gsm.print(phone_no);
      Gsm.println("\"");
      Gsm.println("Alert I Need help...");
      Gsm.print("http://maps.google.com/maps?q=loc:");
      Gsm.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
      Gsm.print(",");
      Gsm.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
      delay(200);
      Gsm.println((char)26);
      delay(200);
      Serial.println("SMS Sent");
      isSMSsent = true;
    }
  } else {
    isSMSsent = false;
    delay(10);
  }

  //Serial.println(failed);
}

Den angepasste Code habe ich auf Nano drauf gespielt, leider hat das auch nicht geholfen.
Gleiches Ergebnis im Monitor sind die Koordinaten aufgelistet, SMS wird geschickt Position 0°00'00.0"N 0°00'00.0"E
GSM Pin 9 und 10 GPS Pin 3 und 4
Müssen die Koordinaten vielleicht in anderem Format ausgegeben werden? Wie im Bild ?

Hier fehlt dem Sim800l noch der Ground.
So ist die Datenübertragung fehlerhaft.

Wenn die neue Zusatzausgabe hinter f_get_position die richtigen Koordinaten zeigt, nimm doch mal testweise die Bedingung raus, die vielleicht die Nullen erzeugt:

      Gsm.print(flat, 6);
      Gsm.print(",");
      Gsm.print(flon, 6);

Ok, werde morgen mich wieder melden, bis jetzt vielen dank

Hallo, nach dem ich die Bedienungen rausgenommen habe, bekomme im Monitor folgende Daten, SMS wird gesendet, immer noch keine Koordinaten:

$GNGGA,175946.835,,,,,0,00,25.5,,,,,,*7C
$GNGLL,,,,,175946.835,V,N*62
$GPGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5*02
$BDGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5*13
$GPGSV,2,1,07,03,,,17,04,,,28,06,,,22,09,,,20*7B
$GPGSV,2,2,07,17,,,13,19,,,28,31,,,23*7B
$BDGSV,1,1,01,12,,,28*60
$GNRMC,175946.835,V,,,,,,,120525,,,N*54
$GNVTG,,,,,,,,,N*2E
$GNZDA,175946.835,12,05,2025,00,00*4D
$GPTXT,01,01,01,ANTENNA OK*35

Kann man da was erkennen ?

Ja.
Siehe Dokumentation über NMEA-Datensätze.

$GNGGA, 175946.835,            ,    ,           ,    , 0       , 00               , 25.5,,,,,,*7C
      , Uhrzeit   , Breitengrad, N/S, Längengrad, E/W, Qualität, Anzahl Satelliten, ....

Kein Fix, keine Koordinaten - jedenfalls nicht um kurz vor 18:00 Uhr.
Gib nochmal den Code bitte, mit dem Du das aufgezeichnet hast. Ich sehe nur die Ausgaben vom GPS, keine andere Ausgabe.

Es empfiehlt sich, den Code mit Ausgaben auf den Monitor anzureichern, damit man (a) weiß, wo er ist und (b) wie es ihm geht (Inhalte wichtiger Variablen).

//Prateek
//www.justdoelectronics.com

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

SoftwareSerial Gsm(9, 10);          // RX, TX pins for GSM module
char phone_no[] = "+49176XXXXXXXX";  // Put Your phone number
SoftwareSerial neo(3, 4);           // RX, TX pins for GPS module

TinyGPS gps;
int buttonState;
unsigned long buttonPressTime;
bool isSMSsent = false;

void setup() {
  Serial.begin(9600);
  Gsm.begin(9600);
  neo.begin(9600);

  Gsm.print("AT+CMGF=1\r");
  delay(100);

  Gsm.print("AT+CNMI=2,2,0,0,0\r");
  delay(100);

  pinMode(5, INPUT_PULLUP);
}

void loop() {
  bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;

  for (unsigned long start = millis(); millis() - start < 1000;) {
    while (neo.available()) {
      char c = neo.read();
      Serial.print(c);  // Output GPS data to the Serial Monitor
      if (gps.encode(c))
        newData = true;  // Check if there is new GPS data
    }
  }

  buttonState = digitalRead(5);

  if (buttonState == LOW) {  // Button is pressed
    if (!isSMSsent) {
      buttonPressTime = millis();

      float flat, flon;
      unsigned long age;
      gps.f_get_position(&flat, &flon, &age);
      Serial.print(F("Latitude: "));

      Gsm.print("AT+CMGF=1\r");
      delay(400);
      Gsm.print("AT+CMGS=\"");
      Gsm.print(phone_no);
      Gsm.println("\"");
      Gsm.println("Alert I Need help...");
      Gsm.print("http://maps.google.com/maps?q=loc:");
      Gsm.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
      Gsm.print(",");
      Gsm.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
      delay(200);
      Gsm.println((char)26);
      delay(200);
      Serial.println("SMS Sent");
      isSMSsent = true;
    }
  } else {
    isSMSsent = false;
    delay(10);
  }

  //Serial.println(failed);
}

GPS braucht etwas um die Daten zu zeigen, jetzt sieht das so aus, die XXXXX sind vom mir:

$GNGGA,183602.000,4833.XXXXX,N,01022.XXXXX,E,1,10,1.0,482.0,M,0.0,M,,*75

Sieht doch gut aus. GPS Fix mit 10 Satelliten.

Code ist ähnlich meinem aus #9, aber verstümmelt (nur Ausgabe des Worts "Latitude"). Ausgabe "SMS Sent" fehlt lt. #14 auch.

Hol Dir doch mal vor dem Lesen des Tasters die Position und lass die Koordinaten ausgeben.
Ich glaube, dass if (buttonState == LOW) nie zutrifft.

Fehlersuche geht schrittweise:
Die Monitorausgaben zeigen, dass das GPS funktioniert.
Dann als nächstes die Werte absichern, dann die SMS zusammenbauen (kannst Du Dir testweise auch auf den Monitor schreiben) und wenn alles da ist kannst Du auch senden.

Wenn ich den Code benutze bekomme ich, richtigen Standort

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
// Choose two Arduino pins to use for software serial
int RXPin = 3;
int TXPin = 4;
int GPSBaud = 9600;
// Create a TinyGPS++ object
TinyGPSPlus gps;
// Create a software serial port called "gpsSerial"
SoftwareSerial gpsSerial(RXPin, TXPin);
void setup()
{
  // Start the Arduino hardware serial port at 9600 baud
  Serial.begin(9600);
  // Start the software serial port at the GPS's default baud
  gpsSerial.begin(GPSBaud);
}
void loop()
{
  // This sketch displays information every time a new sentence is correctly encoded.
  while (gpsSerial.available() > 0)
    if (gps.encode(gpsSerial.read()))
      displayInfo();
  // If 5000 milliseconds pass and there are no characters coming in
  // over the software serial port, show a "No GPS detected" error
  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println("No GPS detected");
    while(true);
  }
}
void displayInfo()
{
  if (gps.location.isValid())
  {
    Serial.print("Latitude: ");
    Serial.println(gps.location.lat(), 6);
    Serial.print("Longitude: ");
    Serial.println(gps.location.lng(), 6);
    Serial.print("Altitude: ");
    Serial.println(gps.altitude.meters());
  }
  else
  {
    Serial.println("Location: Not Available");
  }
  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());
  }
  else
  {
    Serial.println("Not Available");
  }
  Serial.print("Time: ");
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(":");
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(":");
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(".");
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.println(gps.time.centisecond());
  }
  else
  {
    Serial.println("Not Available");
  }
  Serial.println();
  Serial.println();
  delay(1000);
}

Im Monitor wird angezeigt:

Latitude: 48.5XXXXX
Longitude: 10.3XXXXX
Altitude: 485.50
Date: Not Available
Time: 04:43:35.00

Das Datum wird auch später angezeigt

Der Kollege benutzt auch eine andere TinyGPS als Du und er hat keine feste Zeit zum Sammeln, sondern reagiert wenn gps.encode() einen neuen Datensatz signalisiert.

Was bringt dieser Code zu Tage?

// https://forum.arduino.cc/t/gps-tracker-sendet-nicht-die-koordinaten/1380735

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

SoftwareSerial neo(3, 4);    // RX, TX pins for GPS module
TinyGPS gps;

void setup()
{
    Serial.begin(9600);
    neo.begin(9600);

    pinMode(5, INPUT_PULLUP);
}

void loop()
{
    bool newData = false;

    while (neo.available())
    {
        char c = neo.read();
        Serial.print(c);    // Output GPS data to the Serial Monitor
        if (gps.encode(c))
            newData = true;    // Check if there is new GPS data
    }

    if (newData)
    {
        float flat, flon;
        unsigned long age;
        gps.f_get_position(&flat, &flon, &age);
        Serial.print("Latitude: ");
        Serial.println(flat, 6);
        Serial.print("Longitude: ");
        Serial.println(flon, 6);
        newData = false;
    }
}

ok , werde mich mit den Code weiter beschäftigen , vielen dank für die Erklärung ist doch nicht so einfach wie ich mir gedacht habe, aber ich bleibe dran

Schön.

Dann solltest du deinen Code auch soweit verstehen, dass du ihn vorsichtig ändern und erweitern kannst.

Was fehlt, ist die zweite SoftwareSerial - Schnittstelle für dein GSM Modul.
Zwei SoftSerial gleichzeitig kann schwierig sein, brauchst du aber nicht, da du sinnvoll nur eine SMS sendest, wenn du den Standort schon hast und dir gespeichert hast .

Soviel programmieren musst du lernen, sonst wird das nichts.