Acquisition de données GPS lentes.

Salut à tous,

Je viens de faire un petit programme pour afficher ma position GPS sur un LCD.

Tout fonctionne, mais ça rame un peu. Quand j’utilise les exemples de la librairie TinyGPS++, tout va très vite.

Quand je crée mes fonctions…ça fonctionne, mais ça rame. L’heure s’affiche doucement, puis au bout d’une minute la latitude, et encore un peu après la longitude. Parfois pas dans le même ordre, mais l’idée est là…

Le problème ne vient pas de l’affichage de l’écran car quand je met l’affichage sur le moniteur série tout est pareil.

Je joins mon programme qui mérite d’être amélioré et vous remercie d’avance.

#include <LiquidCrystal_I2C.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 10, TXPin = 14;
static const uint32_t GPSBaud = 38400;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
double Lat, Long,lati,longi, vites,vitess; 
unsigned long heure,temps,minu,minutes;

LiquidCrystal_I2C lcd(0x3F, 20, 4);



void setup()
{

  Serial.begin(115200);
 ss.begin(GPSBaud);

}






double latitude()
{

 while (ss.available())
    {
      if (gps.encode(ss.read()))
      {
      Lat = gps.location.lat();
      delay(50);
   //   Long = gps.location.lng();     
   //   Distance = gps.distanceBetween(Lat, Long, LatCible, LongCible);
      
  
  }}

  return Lat;


}


double longitude()
{

 while (ss.available())
    {
      if (gps.encode(ss.read()))
      {
   //   Lat = gps.location.lat();
      Long = gps.location.lng(); 
      delay(50);    
   //   Distance = gps.distanceBetween(Lat, Long, LatCible, LongCible);
      
  
  }}

  return Long;


}


unsigned long montreheure()
{

 while (ss.available())
    {
      if (gps.encode(ss.read()))
      {
      temps = gps.time.hour();
      delay(50);
   //   minu=gps.time.minute();
   //   Long = gps.location.lng();     
   //   Distance = gps.distanceBetween(Lat, Long, LatCible, LongCible);
      
  
  }}

  return temps;
// return minu;

}


unsigned long montreminutes()
{

 while (ss.available())
    {
      if (gps.encode(ss.read()))
      {
   //   temps = gps.time.hour();
      minu=gps.time.minute();
      delay(50);
   //   Long = gps.location.lng();     
   //   Distance = gps.distanceBetween(Lat, Long, LatCible, LongCible);
      
  
  }}

// return temps;
  return minu;

}





double vitesse()
{

 while (ss.available())
    {
      if (gps.encode(ss.read()))
      {
vites=gps.speed.kmph();
 delay(50);
  }}
 return vites;
}




void loop()
{


//-----------------------------------------------------------------------------------------------------GPS

 lati=latitude();
 delay(50);
 longi=longitude();
 delay(50);
 heure=montreheure();
 delay(50);
 minutes=montreminutes();
 delay(50);
 vitess=vitesse();


  Serial.print(heure); 
  Serial.print("H"); 
  Serial.println(minutes); 
  Serial.print("Vit : "); 
  Serial.println(vitess);
  Serial.print("LAT :");
  Serial.println(lati, 6);
  Serial.print("LONG :");
  Serial.println(longi,6);

}

bonjour
pourquoi faire des multiples while et if

while (ss.available())
    {
      if (gps.encode(ss.read()))

la lib tinygps++ renvoie les dernieres valeurs correctement acquises, il suffit juste de les afficher

J’avoue que j’ai pris du code dans les exemples et que je l’ai mis dans le mien…

Je viens de résoudre le problème en évitant de faire des fonctions.

Si quelqu’un sait pourquoi il est plus lent de passer par des fonctions, je suis preneur.

Merci pour la réponse.

Je post mon nouveau code qui fonctionne à merveille et qui est bien plus court! Pourquoi faire simple quand on peut faire compliqué! :

#include <LiquidCrystal_I2C.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 10, TXPin = 14;
static const uint32_t GPSBaud = 38400;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
double Lat, Long,lati,longi, vites,vitess; 
unsigned long heure,temps,minu,minutes;

LiquidCrystal_I2C lcd(0x3F, 20, 4);



void setup()
{

  Serial.begin(115200);
 ss.begin(GPSBaud);

}





void loop()
{


//-----------------------------------------------------------------------------------------------------GPS

 while (ss.available())
    {
      if (gps.encode(ss.read()))
      {
 lati=(gps.location.lat());
// delay(50);
 longi=(gps.location.lng());
// delay(50);
 heure=gps.time.hour();
// delay(50);
 minutes=gps.time.minute();
// delay(50);
 vitess=(gps.speed.kmph());
 }}


  Serial.print(heure); 
  Serial.print("H"); 
  Serial.println(minutes); 
  Serial.print("Vit : "); 
  Serial.println(vitess);
  Serial.print("LAT :");
  Serial.println(lati, 6);
  Serial.print("LONG :");
  Serial.println(longi,6);

}

chrismaximilien:
J'avoue que j'ai pris du code dans les exemples et que je l'ai mis dans le mien...

Je viens de résoudre le problème en évitant de faire des fonctions.

Si quelqu'un sait pourquoi il est plus lent de passer par des fonctions, je suis preneur.

Merci pour la réponse.

ce n'est pas un probleme de fonction
c'est un probleme de multiples conditions dans tes fonctions

Ah oui, j'ai même pas fais t gaffe que je copiais mal...

Merci, bien vu!