conexion antena Garmin GLO - bluetooth - arduino

Buenos dias,
ante todo presentarme y saludaros... Ponga una ronda!

soy un aficionado a arduino ya he conseguido programar algunas cosillas bastante simples y lo paso muy bien
ahora estoy con un proyecto en el que quiero conectar una antena GLO ( Garmin GLO 2 ) por Bt al arduino, para hacer un trip para rallys sin necesidad de ir con sonda a rueda lo tengo conseguido
He utilizado la libreria Tiny GPS y TiniGPS++ me calcula bien las distancias ( a falta de ajustar ) pero tengo problemas con el tiempo de respuesta...

desde que muevo el gps unos metros hasta que lo gestiona el arduino pasan de 4 a 6 segundos.. y eso asi no me vale

os pongo copia del ino a ver si alguien ve el error ..

gracias de antemano.

#include <TinyGPS++.h>


#include <LiquidCrystal.h>

#include "SoftwareSerial.h"


LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

SoftwareSerial SoftSerial(13, 12); 

TinyGPSPlus GPS;

unsigned long satcount = 0;
float lati = 0;
float lon = 0;
float lati1 = 0;
float lon1 = 0;
float distancia = 0;
float dtotal =0;
void setup()
{
 Serial.begin(9600);
 SoftSerial.begin(9600);
 lcd.begin(16, 2);
 Serial.println("GPS Start");
 lcd.setCursor(0, 0);
 lcd.print("GPS GLO 001 ");
 delay (1200);
 lcd.clear ();
}

void loop()
{
 while (SoftSerial.available()) 
 {
   GPS.encode(SoftSerial.read());
 }

   satcount = GPS.satellites.value();
   lati = GPS.location.lat(),9;
    lon = GPS.location.lng(),9;
    lcd.setCursor(0, 0);
   lcd.print("Sat ok: ");  
   lcd.print(satcount);
    lcd.print("    ");
    lcd.print(GPS.speed.kmph());
   Serial.println(dtotal);
   Serial.println(lati, 9);
   Serial.println(lon, 9);
if (lati != lati1) {distancia = TinyGPSPlus::distanceBetween(lati1, lon1, lati, lon);
                     dtotal = dtotal + distancia; 

   
   lcd.clear ();
                     lcd.setCursor(13, 1);    
                      if (dtotal > 100000) dtotal= 0;
  
                       lcd.print(dtotal,0 );
                       lcd.print ("m");
                        lati1 = lati;
                         lon1 = lon;
}
   
 }

imagino que el codigo no estara muy limpio, mis disculpas soy muy novato..

saludos y gracias!

Buenas,

sigo con las pruebas todo me indica a que es la libreria que da una respuesta lenta es decir, desde que el GPS detencta la nueva ubicacion hasta que larduino lo gestiona pasan unos 8 segundos..
si conecto la GLO al pc en cuanto cambio de ubicacion el gps si veo cambio en el momento de los valores de Lat y Long... ( Con PUTY)

conoceis alguna llibreria que sea mas rapida en la adquisicion de datos del gps?
por otro lado , la manera de recibir los datos entre el arduino y la GLo es un HC05 BT conectada a dos pines 13y 12 ¿ puede ser algun conflicto por eso? ya que recibe por esos pines y envia por USB y al lcd. he cambiado estos pines pero me pasa igual.

me planteo si consigo adquirir esos datos de Lat y Long de una forma mas rapida utilizar la libreria solo para el calculo de distancia..

Gracias

Creo que tu error esta en la forma en la que recibes los datos del gps via SoftwareSerial.

En principio mira los 3 ejemplos de la librería.
A mi me gusta el ultimo, y usa esto

static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

En lugar de tu objeto SoftwareSerial acá lo llama ss pero es lo mismo

Como veras todo lo que se lee se hace en un tiempo limite para poder devolver el control al código y tener la apariencia de que sea veloz. Yo use un NEO6 y te aseguro que me daba resultados muy rápidos.. cada 100 mseg.

Bien, entonces replantea tu código usando este ejemplo.

test_with_gps_device.ino

Cambia los pines, los baudios, el objeto déjalo si me permites el comentario.
Observa que funciona correctamente y luego usa lo que quieres mostrar.

Buenas,, implementando esta parte de codigo me parece que ya va mas fluido ( a falta de realizar puebas en exterior)

pero no termino de entender bien el codigo bien tengo que estudiarlo,

static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

me revienta no entender el codigo y copiarlo sin mas :confused: :confused: :confused:

muchisimas gracias!!!!!

SOLUCIONADO

Utilizando la funcion:
if (gps.location.isUpdated())
{
}
asi no se sobrecarga, actuando solo cuando recibe datos del gps.

Gracias

Bueno, lamento no poder explicarte más pero estoy de vacaciones y desde el celular no veo todo lo que me gusta ver para tener una respuesta apropiada.
De todos modos me das gusto que hayas resuelto el problema.
Aprende a no usar delay. Es un asesino de los códigos.
En su lugar ya millis() y verás cono cambia todo.
La rutina que te sugerí ya justamente millis y solo consulta al GPS cada x milisegundos. Eso es todo.