Calcular distancias entre coodenades GPS

Buenos dias.
Estoy usando el módulo GPS "Adafruit GPS MTK3339 " y la libreria TinyGPS para recivir datos GPS.
Tengo dos temas que no se como solucionar. Paso copia de dos lecturas correlativas, estando el GPS quieto, está encima de mi mesa.

Latitud : 41.8533973 i Longitud : 2.2394618
Data : 12/11/2021
Hora : 11:29:5
Altitud (metres): 559.20
Rumb (graus) : 147.14
Velocitat(kmph) : 2.30
Satelits : 3

Latitud : 41.8533973 i Longitud : 2.2394950
Data : 12/11/2021
Hora : 11:29:8
Altitud (metres): 559.20
Rumb (graus) : 147.14
Velocitat(kmph) : 2.30
Satelits : 3

Haber si algien me puede ayudar.
Primer tema, ¿como puedo diferenciar si mi receptor està parado o no? Los datos de ejemplo que he pasado, son con el receptor quieto, pero la longitud tiene una ligera diferencia, y entiendo que por este motivo me da 2,3Km/h que no es cierto !!!
Segundo tema: como puedo saber la distancia entre cada lectura de los datos GPS?
El código que estoy usando es el sigüente:

// Adafruit GPS MTK3339 
/*
 Modul GPS
 RXD Arduino Pin 7 ;  TXD Arduino Pin 6
 RST Leave Open ? (Connect to a N/O momentary switch pulled low to reset?)
 NC Leave Open
 GND Ground ;  VCC +5
 Make sure you download TinyGPS.h
 */

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

unsigned long fix_age;

// Variables GPS
SoftwareSerial GPS(7,6); // Atenció que ha de coincidor amb els pins que fem servir 
TinyGPS gps;
void gpsdump(TinyGPS &gps);
bool feedgps();
void getGPS();
long lat, lon;
float LAT, LON;
int year;
byte month, day, hour, minute, second, hundredths;
// Fi variables GPS

void setup()
  {
  GPS.begin(9600);
  Serial.begin(9600);
  Serial.println(" ");
  Serial.println("*****************************************");
  Serial.println("Receptor dades GPS - Adafruit GPS MTK3339 ");
  Serial.println("*****************************************");   
  }

void loop()
  {
  CapturaGPS();
  }

// Funcios GPS *************************************************
void CapturaGPS()
  {
  gps.get_position(&lat, &lon, &fix_age);
  getGPS();
  Serial.print("Latitud : ");
  Serial.print(LAT/1000000,7);
  Serial.print(" i Longitud : ");
  Serial.println(LON/1000000,7);
  Serial.print("Data            : "); Serial.print(day, DEC); Serial.print("/"); 
  Serial.print(month, DEC); Serial.print("/"); Serial.println(year);
  Serial.print("Hora            : "); Serial.print(hour, DEC); Serial.print(":"); 
  Serial.print(minute, DEC); Serial.print(":"); Serial.println(second, DEC); 
  Serial.print("Altitud (metres): "); Serial.println(gps.f_altitude()); 
  Serial.print("Rumb (graus)    : "); Serial.println(gps.f_course()); 
  Serial.print("Velocitat(kmph) : "); Serial.println(gps.f_speed_kmph());
  Serial.print("Satelits        : "); Serial.println(gps.satellites()); 
  Serial.println();
  delay(2000);
  }

void getGPS()
  {
    bool newdata = false;
    unsigned long start = millis();
    // Every 1 seconds we print an update
    while (millis() - start < 1000)
    {
      if (feedgps ()){
        newdata = true;
      }
    }
    if (newdata)
    {
      gpsdump(gps);
    }
  }

bool feedgps()
  {
    while (GPS.available())
    {
      if (gps.encode(GPS.read()))
        return true;
    }
    return 0;
  }

void gpsdump(TinyGPS &gps)
  {
    //byte month, day, hour, minute, second, hundredths;
    gps.get_position(&lat, &lon);
    gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);   
    LAT = lat;
    LON = lon;
    {
      feedgps(); // If we don't feed the gps during this long routine, we may drop characters and get checksum errors
    }
  }

// Fi funcios GPS *************************************************

Mil grácias.

prueba este ejemplo para mostrar tus posiciones: (TinyGPS++)

Gracias Jackson.
He provado el ejemplo.

Location: 41.853549,2.239145 Date/Time: 11/12/2021 14:22:56.00
Location: 41.853549,2.239145 Date/Time: 11/12/2021 14:22:56.00
Location: 41.853549,2.239140 Date/Time: 11/12/2021 14:22:57.00

No se que mejoras tiene la libreria PLUS, pero quizas es mas rápida y precisa.
Estando el GPS parado, tambien canvia la latitud, quizas menos, pero esto hace que continue teniendo velocidat, cosa que no es cierta.
Alguna idea de como puedo calcular la distancia entre dos coordenadas?
Gracias.

hay una función para esto en la biblioteca

static double distanceBetween(double lat1, double long1, double lat2, double long2);

(Moví tu publicación a la sección en español)

Grácias Jackson.

static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
unsigned long distanceKmToLondon =
  (unsigned long)TinyGPSPlus::distanceBetween(
  gps.location.lat(),
  gps.location.lng(),
  LONDON_LAT, 
  LONDON_LON) / 1000;
Serial.print(F(" Distancia: ")); 
Serial.print(distanceKmToLondon);

Funciona. Con esto ya puedo avanzar.
Si la distancia entre lecturas es inferior a "x" metros, consideraré que no hay movimiento y que la velocidad es "0".

esto parece ser una idea razonable

El GPS no es muy preciso si no recibe muchas señales de los satélites, por lo que se puede ver una brecha de 10 o 15 m entre dos lecturas.

Obtienes una lectura cada segundo, por lo que si te mueves a 0,5 m / segundo (1,8 km / h), no te habrás movido mucho entre dos lecturas consecutivas, pero aún te estás moviendo.

Tienes que tener eso en cuenta.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.