problème conflit SoftWareSerial et affichage Nextion

Bonjour,
je butte depuis quelques temps sur un conflit d'affichage entre une arduino nano et un écran Nextion.
lorsque j'affiche toutes les variables sans le code pour le GPS via "SoftWareSerial" directement sur le Nextion tout les affichage sont corrects.
mais une fois le code GPS en fonction, il n'y a plus d'infos reçu par le Nextion.
y a t'il un moyen de prendre les infos du GPS autrement, car le Nextion ne fonctionne que en série (tx-rx)

#include <Nextion.h> // théoriquement sufisant mais ne fonctionne pas sans le reste "Next" ?
#include <NexButton.h>
#include <NexProgressBar.h>
#include <NexGauge.h>
#include <NexNumber.h>
#include <NexPage.h>
#include <NexText.h>
#include <NexVariable.h>
#include <Wire.h>
#include <SDP6xx.h>


/*********************** GPS **********************************/

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

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

/************************ variable GPS ************************/
   double lat2 ; // set Nextion
   double lon2 ; // set Nextion
   double gisement;
   int route;
   int dif;
  float distance=0.0;
  float tlatRad, tlonRad;
  float midLat, midLon;
  float dist = 0.0;
  float latRad = lat2; 
  float lonRad = lon2; 

/*********************** page Nextion **************************/
NexPage pageaccueil = NexPage(0, 0, "accueil");
NexPage pageaffichage = NexPage(1, 0, "page0");
NexProgressBar Init = NexProgressBar(0, 2, "init");

/********************* horloge Nextion *************************/
NexNumber heures   = NexNumber(2, 23, "n0"); // Heures
NexNumber minutes  = NexNumber(2, 24, "n1"); // Minutes
NexNumber secondes = NexNumber(2, 25, "n2"); // Secondes

/********************* vitesse Nextion *************************/
NexProgressBar j0 = NexProgressBar(1, 3, "j0"); // Compteur
NexNumber vi  = NexNumber(1, 2, "via"); // Vitesse air page 1
NexNumber vs  = NexNumber(1, 6, "vis"); // Vitesse sol page 1
NexNumber vit  = NexNumber(7, 10, "va"); // Vitesse air page 7
NexNumber vso  = NexNumber(7, 6, "vs"); // Vitesse sol page 7

/*********************** alti Nextion **************************/
NexNumber qnh5  = NexNumber(5, 10, "qnhpage5"); // Vitesse sol page 7
NexNumber alt = NexNumber(1, 16, "valeuralti"); // Altitude en mètres

/**********************  GPS Nextion ***************************/
NexNumber Lati = NexNumber(8, 4, "latitude");
NexNumber Long = NexNumber(8, 5, "longitude");
NexNumber sat  = NexNumber(5, 2, "nbsat");
NexNumber satel  = NexNumber(1, 17, "nbsat2");

/**********************  Nav Nextion ***************************/
NexGauge routeV = NexGauge(7, 1, "z0");
NexNumber compas = NexNumber(7, 2, "comp");
NexNumber Dist =  NexNumber(7, 9, "x0");
NexVariable Va2 =  NexVariable(7, 21, "va2");
uint32_t number;


void setup() {

  nexInit ();
  Serial.begin(9600);
  Wire.begin();


for (int i=1;i<=50;i++) // boucle en prévision d'un calcul de calibration
{
      if(i<2) // affichage barre graphe
        { pageaccueil.show();}
    int pourcentage2 = map(i, 0, 50, 0, 100);
    Init.setValue(pourcentage2);
delay(20);
}
pageaffichage.show();
}

void loop() {

/***************************** GPS *****************************/
    while (ss.available() > 0){
    gps.encode(ss.read());
    if (gps.location.isUpdated()){

    int vsol = gps.speed.kmph();
    int Alt = gps.altitude.meters();
    float Latitude = gps.location.lat (); 
    float Longitude = gps.location.lng();
    int Sat = gps.satellites.value();
    
        vs.setValue(vsol);        // vitesse sol page 1
        vso.setValue(vsol);       // vitesse sol page 7
        alt.setValue(Alt);        // altitude page 1
        sat.setValue(Sat);          // Nb satellites page 7
        satel.setValue(Sat);        // Nb satellites page 1
        qnh5.setValue(Alt);       // altitude page 5  
 
    }
      }
     
/********************** capteur vitesse air ********************/
  int pa = (SDP6xx.readPA())/60;
  int vms = sqrt(2*pa/1.293);
  int airspeed = vms*3.6;

    vi.setValue(airspeed);    // vitesse air page 1  
    vit.setValue(airspeed);   // vitesse air page 7
    
    int pourcentage = map(airspeed, 0, 140, 0, 100);
    j0.setValue(pourcentage); // vitesse barregraphe page 1


/*********************** Horloge ****************************/
  heures.setValue(gps.time.hour()+2);      // (h) 
  minutes.setValue(gps.time.minute());     // (m)
  secondes.setValue(gps.time.second());    // (s)

 /******************* Calcul Gisement ***********************/
      Va2.getValue (& number); // lis la valeur du bouton GPS
  if (number > 0){ 
      lat2 = gps.location.lat ()* 0.017453293;
      lon2 = gps.location.lng ()* 0.017453293; 
}

    double lat1 = gps.location.lat() * 0.017453293; // mobile
    double lon1 = gps.location.lng() * 0.017453293; // mobile
   
    double longDelta = lon2 - lon1;
    double y = sin(longDelta) * cos(lat2);
    double x = cos(lat1)*sin(lat2) - sin(lat1)*cos(lat2)*cos(longDelta);
    gisement = degrees(atan2(y, x));
    while (gisement < 0) {
      gisement += 360;
    } 

/********************* Calcul Distance **********************/
  tlatRad = gps.location.lat() * 0.017453293;
  tlonRad = gps.location.lng() * 0.017453293;
  midLat = tlatRad - latRad;
  midLon = tlonRad - lonRad;
  float latSin = sin((latRad - tlatRad)/2);
  float lonSin = sin((lonRad - tlonRad)/2);
  
  dist = 2 * asin(sqrt((latSin*latSin) + cos(latRad) * cos(tlatRad) * (lonSin * lonSin))); 
  dist = dist * 6371; // pour la distance en Km il faut multiplier la valeure trouvée par le rayon de la terre
 
 /********************* Calcul Route **********************/ 
  int degr = gps.course.deg();
  
  if (degr <= 180){
     if (degr<gisement){
         route = gisement - degr;
  }
       if ( degr>gisement) {
            route = degr - gisement;
  }
  }
  if (degr > 180) {
        if (degr<gisement){
        dif = gisement - degr;
        route = 360 - dif;
  }
       if ( degr>gisement) {
         dif = degr - gisement;
         route = 360 - dif;
  } 
  }
  compas.setValue(degr);
  routeV.setValue((route)+90);
  
}

j'ai rajouté ca " ss.begin(GPSBaud); "dans le setup, ca ne change rien

Peut-être est-ce lié au fait qu'il ne peut y avoir qu'un softwareSerial à l'écoute à un instant donné.
Lorsque tu veux passer de l'un à l'autre il faut utiliser listen

Je ne vois pas où est déclaré le softwareSerial utilisé par le Nextion.

le Nextion est branché sur le TX et RX de la arduino, sans déclaration spécifique, enfin il me semble, je n'en suis pas très sur

Si on cherche "Arduino nextion gps", Google renvoie quelques projets similaires.
Celui-ci montre en vidéo son résultat : à l'instant 4:52 on voit ses connexions (plus d'infos ici). Le Nextion sur D0 & D1 (Rx, Tx), le GPS sur 2 autres pins donc en SoftwareSerial.

Donc, ça devrait fonctionner...

Je vois que tu as aussi un capteur de pression différentielle SDP6x, en I2C. Au passage, ces calculs en entier me semblent peu précis :

  int pa = (SDP6xx.readPA())/60;
  int vms = sqrt(2*pa/1.293);
  int airspeed = vms*3.6;

Tu devrais passer en float.

Il y a peut-être un problème d'alimentation, si tout est branché sur le pauvre nano, il est peut-être à la peine pour fournir du courant à tout ça... As-tu une alimentation externe que tu pourrais utiliser pour les capteurs, voire aussi l'écran ?

ok code changé pour:
float pa = (SDP6xx.readPA())/60;
float airspeed = (sqrt(2*pa/1.293))*3.6;

c'est quasiment le mème branchement ( alim exterieur 12v avec régulateur DC/DC 5v ) que mon montage, avec un moduleSDP610 en I2C qui fonctionne impec.

concernant le problème de conflit, je ne comprend pas le code du lien; je sais pas encore comment on utilise le serial.
si quelqu'un pouvait m'aiguiller en utilisant listen par exemple.
j'ai vue ca sur le net, mais comment l’intégrer dans mon code? je cherche, je cherche, je test, je vais bien finir par trouver.

#include <SoftwareSerial.h>

// software serial : TX = digital pin 10, RX = digital pin 11
SoftwareSerial portOne(10, 11);

// software serial : TX = digital pin 8, RX = digital pin 9
SoftwareSerial portTwo(8, 9);

void setup()
{
  // Start the hardware serial port
  Serial.begin(9600);

  // Start both software serial ports
  portOne.begin(9600);
  portTwo.begin(9600);

}

void loop()
{
  portOne.listen();

  if (portOne.isListening()) {
   Serial.println("Port One is listening!");
}else{
   Serial.println("Port One is not listening!");
}

  if (portTwo.isListening()) {
   Serial.println("Port Two is listening!");
}else{
   Serial.println("Port Two is not listening!");
}

}

Je ne sais pas comment est configurée ta librairie mais par défaut on trouve cela dans NexConfig.h

/** 
 * Define DEBUG_SERIAL_ENABLE to enable debug serial. 
 * Comment it to disable debug serial. 
 */
#define DEBUG_SERIAL_ENABLE

/**
 * Define dbSerial for the output of debug messages. 
 */
#define dbSerial Serial

/**
 * Define nexSerial for communicate with Nextion touch panel. 
 */
#define nexSerial Serial2

Si tu lis le readme.md qui est dans la librairie la démarche à suivre est très clairement expliquée.

oui je l'avait configuré, j'ai donc vérifié, ça ma l'air correct: // #debug_serial_enable
quand je remplace par " #define nexSerial Serial2 " au lieu de " #define nexSerial Serial " ça ne communique plus du tout.

Si tu laisses
#define nexSerial Serialla communication avec le Nextion se fait par la liaison série hard D0 D1.
Donc, à priori, ta configuration est correcte.

La compilation du code ne donne pas une consommation mémoire trop importante?

j'ai changer pour une arduino uno.
l'affichage sur le Nextion fonctionne maintenant, en revanche le rafraichissement est très très lent (environ 5 secondes).
Y a t'il un moyen de rendre ce code plus rapide?
Ou peut être deux aruino?
ça marche pareil avec une nano.

#include <Nextion.h>
#include <NexButton.h>
#include <NexProgressBar.h>
#include <NexGauge.h>
#include <NexNumber.h>
#include <NexPage.h>
#include <NexText.h>
#include <NexVariable.h>
#include <Wire.h>
#include <SDP6xx.h>
#include "RTClib.h"

RTC_DS3231 rtc;

/*********************** GPS **********************************/

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

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;

TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);

/************************ calcul GPS *******************/  
   double lat2 ; // set Nextion
   double lon2 ; // set Nextion
   double gisement;
   int route;
   int dif;
  float distance=0.0;
  float tlatRad, tlonRad;
  float midLat, midLon;
  float dist = 0.0;
  float latRad ; // = lat2 set Nextion
  float lonRad ; // = lat2 set Nextion 
  unsigned int h;     // pour stocker les heures
  unsigned int m;     // pour stocker les minutes
  unsigned int s;     // pour stocker les secondes

/*********************** page Nextion **************************/
NexPage pageaccueil = NexPage(0, 0, "accueil");
NexPage pageaffichage = NexPage(1, 0, "page0");
NexProgressBar Init = NexProgressBar(0, 2, "init");

/********************* horloge Nextion *************************/
NexNumber heures   = NexNumber(2, 23, "n0"); // Heures
NexNumber minutes  = NexNumber(2, 24, "n1"); // Minutes
NexNumber secondes = NexNumber(2, 25, "n2"); // Secondes

/********************* vitesse Nextion *************************/
NexProgressBar j0 = NexProgressBar(1, 3, "j0"); // Compteur
NexNumber vi  = NexNumber(1, 2, "via"); // Vitesse air page 1
NexNumber vs  = NexNumber(1, 6, "vis"); // Vitesse sol page 1
NexNumber vit  = NexNumber(7, 10, "va"); // Vitesse air page 7
NexNumber vso  = NexNumber(7, 6, "vs"); // Vitesse sol page 7

/********************* alti Nextion *************************/
NexNumber qnh5  = NexNumber(5, 10, "qnhpage5"); // Vitesse sol page 7
NexVariable valalti =  NexVariable(1, 16, "valeuralti");

/**********************  GPS Nextion ***************************/
NexNumber sat  = NexNumber(5, 2, "nbsat");
NexNumber satel  = NexNumber(1, 17, "nbsat2");

/**********************  Nav Nextion ***************************/
NexGauge routeV = NexGauge(7, 1, "z0");
NexNumber compas = NexNumber(7, 2, "comp");
NexNumber Dist =  NexNumber(7, 9, "x0");
NexVariable Va2 =  NexVariable(7, 21, "va2");
uint32_t number;

/***************************************** SETUP ****************************/
void setup(void) { 
  
  nexInit ();
  Serial.begin(9600);
  ss.begin(GPSBaud);
  Wire.begin();
  rtc.begin();
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
pageaffichage.show();
}

/***************************************** LOOP ****************************/
void loop() {
   Vitesseair(); 
     Gps();
      horloge();
       Gps();
        calculgisement (); 
         calculdistance();
          calculroute();
     Va2.getValue (& number);       
}

/******************************** vitesse air *****************************/
void Vitesseair(){
  float pa = (SDP6xx.readPA())/60;
  float airspeed = (sqrt(2*pa/1.293))*3.6;
  if (airspeed>=140) { airspeed = 0; }
   vi.setValue(airspeed);    // vitesse air page 1  
   vit.setValue(airspeed);   // vitesse air page 7
   
  int pourcentage = map(airspeed, 0, 140, 0, 100);
   j0.setValue(pourcentage);
}

/***************************************** GPS ****************************/
void Gps(){
    while (ss.available() > 0){
    gps.encode(ss.read());
    if (gps.location.isUpdated()){

    int vsol = gps.speed.kmph();
    int Alt = gps.altitude.meters();
    int Sat = gps.satellites.value();

    vs.setValue(vsol);        // vitesse sol
    vso.setValue(vsol);       // vitesse sol page 7
    valalti.setValue(Alt);    // altitude   
    sat.setValue(Sat);        // Nb satellites
    satel.setValue(Sat);      // Nb satellites
      }
    }
  }

/*********************** Horloge ****************************/
void horloge() {
  DateTime now = rtc.now();
  h = now.hour(), DEC;      // stock l'heure
  m = now.minute(), DEC;    // stock les minutes
  s = now.second(), DEC;    // stock les secondes

  heures.setValue(h);     
  minutes.setValue(m);     
  secondes.setValue(s);    
}

/********************** Calcul Gisement ***********************/
void calculgisement () {
    if (number > 0){ 
      lat2 = gps.location.lat ()* 0.017453293; 
      lon2 = gps.location.lng ()* 0.017453293;
      latRad = lat2;  // set Nextion
      lonRad = lon2;  // set Nextion
}

    double lat1 = gps.location.lat() * 0.017453293; // mobile
    double lon1 = gps.location.lng() * 0.017453293; // mobile
   
    double longDelta = lon2 - lon1;
    double y = sin(longDelta) * cos(lat2);
    double x = cos(lat1)*sin(lat2) - sin(lat1)*cos(lat2)*cos(longDelta);
    gisement = degrees(atan2(y, x));
    while (gisement < 0) {
    gisement += 360;
    } 
} 
     
/********************* Calcul Distance **********************/
void calculdistance() {
    tlatRad = gps.location.lat() * 0.017453293;
    tlonRad = gps.location.lng() * 0.017453293;
    midLat = tlatRad - latRad;
    midLon = tlonRad - lonRad;
    float latSin = sin((latRad - tlatRad)/2);
    float lonSin = sin((lonRad - tlonRad)/2);
  
    dist = 2 * asin(sqrt((latSin*latSin) + cos(latRad) * cos(tlatRad) * (lonSin * lonSin))); 
    dist = dist * 6371; 
    Dist.setValue(dist);
}

/********************* Calcul Route **********************/
void calculroute() {
  
  int degr = gps.course.deg();
  
  if (degr <= 180){
     if (degr<gisement){
         route = gisement - degr;
  }
       if ( degr>gisement) {
            route = degr - gisement;
  }
  }
  if (degr > 180) {
        if (degr<gisement){
        dif = gisement - degr;
        route = 360 - dif;
  }
       if ( degr>gisement) {
         dif = degr - gisement;
         route = 360 - dif;
  } 
  }

  compas.setValue(degr);
  routeV.setValue((route)+90);

}

Beaucoup de calculs en flottant et de calculs trigonométriques. Cela charge pas mal le CPU. Au passage le compilateur ne gère pas les double, il n'implémente que les float, mais c'est transparent. Il ne faut juste pas s'attendre à une meilleure précision dans les résultats.

La liaison avec le Nextion à 9600 bauds ne doit pas améliorer les choses, il doit quand même y avoir pas mal d'échange entre l'Arduino et l'écran. Il faudrait peut-être passer à un débit plus élevé à 115200 tu gagnerais un facteur 10 dans les échanges.

Solution complémentaire, faire le tri entre ce qui doit être rafraîchi toutes les secondes et ce qui peut être rafraîchi un peu moins souvent.

Tu peux aussi faire calculer le temps d'exécution de chaque routine pour voir lesquelles sont les plus chronophages et soit les appeler moins souvent, soit les optimiser si c'est possible.

Je débute avec l'arduino, alors il va me falloir encore du temps sur ce montage pour le rendre correct. J'y retourne de ce pas.
Merci.
a suivre.....

Le GPS fournit l'heure, tu n'as pas besoin d'une RTC :

Serial.println(gps.time.hour()); // Hour (0-23) (u8)
Serial.println(gps.time.minute()); // Minute (0-59) (u8)
Serial.println(gps.time.second()); // Second (0-59) (u8)

Tu as la méthode isUpdated() pour vérifier si une information a changé. Avec ça, tu peux simplement mettre à jour ce qui a changé:

void Gps(){
    while (ss.available() > 0) gps.encode(ss.read());

    if (gps.speed.isUpdated()) vs.setValue(gps.speed.kmph());
    if (gps.speed.isUpdated()) vso.setValue(gps.speed.kmph());
    if (gps.altitude.isUpdated()) valalti.setValue(gps.altitude.meters());
    if (gps.satellites.isUpdated()) sat.setValue(gps.satellites.value());
    if (gps.satellites.isUpdated()) satel.setValue(gps.satellites.value());

    if (gps.time.isUpdated()) {
      heures.setValue(gps.time.hour());     
      minutes.setValue(gps.time.minute());     
      secondes.setValue(gps.time.second()); 
    }
  }
}

Tu devrais optimiser ton code pour éviter d'interroger le GPS dans les fonctions calculdistance et calculgisement.
Pour cela, tu crées un booléen dans la loop qui vérifie si le GPS a été mis à jour :

bool MAJ = gps.location.isUpdated() || gps.time.isUpdated();

S'il est à true, tu appelles la fonction GPS et tu mets dans des variables globales tout ce qui peut te servir dans les autres fonctions (calculdistance et calculgisement) afin de ne pas avoir à réinterroger le GPS.

void loop() {
  Vitesseair();
  bool MAJ = gps.location.isUpdated() || gps.time.isUpdated();
   if (MAJ) {
     Gps();
     calculgisement();
     calculdistance();
     calculroute();
  }
  Va2.getValue (& number);       

}

Crées les variables globales

int latitude;
int longitude;
int degr;

Et dans la fonction Gps, tu les renseignes :

latitude = gps.location.lat();
longitude = gps.location.lng();
degr = gps.course.deg();

Tu peux alors utiliser ces variables dans les fonctions calculdistance et calculroute pour éviter d'interroger le GPS.

EDIT : je vois que tu as déjà ces variables tlatRad, tlonRad. Donc autant déplacer les lignes dans Gps()

    tlatRad = gps.location.lat() * 0.017453293;
    tlonRad = gps.location.lng() * 0.017453293;

et utiliser ces variables là où tu en as besoin.

j'avais fait une version avec la rtc du gps, je ne sai plus pourquoi j'ai remis la rtc 3231.
je vais tenter d’intégrer tout ça.
merci

bon, j'ai fais le ménage et intégré au mieux les recommandation de "
lesept " merci,
Ce n'est pas très probant comme améliorations, je n'arrive pas a augmenter les bauds entre la arduino et le nextion.
Je me rappelle avoir pris un RTC a cause du réglage de l'heure ( il faut que je rajoute +2 aux heures pour etre correct)

#include <Nextion.h>
#include <NexButton.h>
#include <NexProgressBar.h>
#include <NexGauge.h>
#include <NexNumber.h>
#include <NexPage.h>
#include <NexText.h>
#include <NexVariable.h>
#include <Wire.h>
#include <SDP6xx.h>
//#include "RTClib.h"

//RTC_DS3231 rtc;

/*********************** GPS **********************************/

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

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;

TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);

/************************ calcul GPS *******************/  
   float lat2 ; // set Nextion
   float lon2 ; // set Nextion
   float gisement;
   int route;
   int dif;
  float tlatRad, tlonRad;
  float midLat, midLon;
  float dist = 0.0;
  float latRad ; // = lat2 set Nextion
  float lonRad ; // = lat2 set Nextion 

/*********************** page Nextion **************************/
NexPage pageaccueil = NexPage(0, 0, "accueil");
NexPage pageaffichage = NexPage(1, 0, "page0");
NexProgressBar Init = NexProgressBar(0, 2, "init");

/********************* horloge Nextion *************************/
NexNumber heures   = NexNumber(2, 23, "n0"); // Heures
NexNumber minutes  = NexNumber(2, 24, "n1"); // Minutes
NexNumber secondes = NexNumber(2, 25, "n2"); // Secondes

/********************* vitesse Nextion *************************/
NexProgressBar j0 = NexProgressBar(1, 3, "j0"); // Compteur
NexNumber vi  = NexNumber(1, 2, "via"); // Vitesse air page 1
NexNumber vs  = NexNumber(1, 6, "vis"); // Vitesse sol page 1

/********************* alti Nextion *************************/
NexVariable valalti =  NexVariable(1, 16, "valeuralti");

/**********************  GPS Nextion ***************************/
NexNumber satel  = NexNumber(1, 17, "nbsat2");

/**********************  Nav Nextion ***************************/
NexGauge routeV = NexGauge(7, 1, "z0");
NexNumber compas = NexNumber(7, 2, "comp");
NexNumber Dist =  NexNumber(7, 9, "x0");
NexVariable Va2 =  NexVariable(7, 21, "va2");
uint32_t number;

/***************************************** SETUP ****************************/
void setup(void) {  
  nexInit ();
  Serial.begin(9600);
  ss.begin(GPSBaud);
  Wire.begin();
  //rtc.begin();
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
pageaffichage.show();
}

/****************************** LOOP ****************************/
void loop() {
  Vitesseair();
  bool MAJ = gps.location.isUpdated();
   if (MAJ) {
     Gps();
     calculgisement();
     calculdistance();
     calculroute();
  }
  Va2.getValue (& number);       

}
/************************* vitesse air ************************/
void Vitesseair(){
  float pa = (SDP6xx.readPA())/60;
  float airspeed = (sqrt(2*pa/1.293))*3.6;
  if (airspeed>=140) { airspeed = 0; }
   vi.setValue(airspeed);    // vitesse air page 1  
   
  int pourcentage = map(airspeed, 0, 140, 0, 100);
   j0.setValue(pourcentage);
}

/**************************** GPS ****************************/
void Gps(){
    while (ss.available() > 0) gps.encode(ss.read());

    if (gps.speed.isUpdated()) vs.setValue(gps.speed.kmph());
    if (gps.altitude.isUpdated()) valalti.setValue(gps.altitude.meters());
    if (gps.satellites.isUpdated()) satel.setValue(gps.satellites.value());
     
/*********************** Horloge ****************************/
    if (gps.time.isUpdated()) {
      heures.setValue(gps.time.hour()+2);     
      minutes.setValue(gps.time.minute());     
      secondes.setValue(gps.time.second());
    }    
  }

/********************* Calcul Distance **********************/
void calculdistance() {
  
    if (number > 0){ // set Nextion
      lat2 = gps.location.lat ()* 0.017453293; 
      lon2 = gps.location.lng ()* 0.017453293;
      latRad = lat2;  
      lonRad = lon2; 
      tlatRad = lat2;
      tlonRad = lon2; 
}
    midLat = tlatRad - latRad;
    midLon = tlonRad - lonRad;
    float latSin = sin((latRad - tlatRad)/2);
    float lonSin = sin((lonRad - tlonRad)/2);
  
    dist = 2 * asin(sqrt((latSin*latSin) + cos(latRad) * cos(tlatRad) * (lonSin * lonSin))); 
    dist = dist * 6371; 
    Dist.setValue(dist);
}

/********************** Calcul Gisement ***********************/
void calculgisement () {
    double lat1 = gps.location.lat() * 0.017453293; // mobile
    double lon1 = gps.location.lng() * 0.017453293; // mobile
   
    double longDelta = lon2 - lon1;
    double y = sin(longDelta) * cos(lat2);
    double x = cos(lat1)*sin(lat2) - sin(lat1)*cos(lat2)*cos(longDelta);
    gisement = degrees(atan2(y, x));
    if (gisement < 0) {
    gisement += 360;
    } 
} 

/********************* Calcul Route **********************/
void calculroute() {  
  int degr = gps.course.deg();
  
  if (degr <= 180){
     if (degr<gisement){
         route = gisement - degr;
  }
       if ( degr>gisement) {
            route = degr - gisement;
  }
  }
  if (degr > 180) {
        if (degr<gisement){
        dif = gisement - degr;
        route = 360 - dif;
  }
       if ( degr>gisement) {
         dif = degr - gisement;
         route = 360 - dif;
  } 
  }

  compas.setValue(degr);
  routeV.setValue((route)+90);

}

imaljl:
je n'arrive pas a augmenter les bauds entre la arduino et le nextion.

D'après la doc Nextion il y a une commande à envoyer à l'écran pour faire changer la vitesse de l'interface série. Tu peux ensuite refaire un Serial.begin() avec le nouveau débit

oui j'ai vu ça, et fait des essais, pour le moment j'ai pas réussi.

Bonjour

Pour le changement de vitesse de transmission entre arduino et nextion

Dans la page d'accueil du nextion et dans préinitialize Event

mettre la commande baud=19200 (par exemple)

Valid values are: 2400, 4800, 9600, 19200, 31250, 38400, 57600, and 115200, 230400, 250000, 256000, 512000, and 921600

Bien sur mettre la même vitesse dans le setup de l'arduino.

changer la vitesse vers le Nextion ça marche, mais la latence est toujours la , je regarde du coté du GPS, car il semble que ça coince de ce coté. Par exemple l'affichage des secondes ne se fait pas régulièrement un chiffre reste bloqué et quelques secondes après deux ou trois secondes s'affichent bien et ca rebloque pour quelques secondes. Avec une RCT externe c'est fluide.

L'arduino est capable de compter une seconde tout seul, et de rester assez précis sur quelques heures. Tu devrais utiliser millis pour compter le temps et remettre ce compteur à l'heure avec le GPS toutes les heures par exemple.

De même, tu ne te déplaces certainement pas à plus de quelques mètres par seconde (10 m/s c'est un sprint de niveau olympique) donc est-il nécessaire de mettre à jour toutes les informations géographiques à chaque tour de loop, c'est à dire plusieurs dizaines de fois par seconde, avec une communication GPS à chaque fois ?

Si c'est le GPS qui ralentit le code, autant l'utiliser avec parcimonie...