Affichage trop lent d'un codeur sur un écran Oled

Bonjour, je suis éleve de terminal S et je viens demander des conseils par rapport à mon projet qui se trouve être une station météo.

Ma partie consiste à afficher les différentes données récoltées par les capteurs sur un écran Oled 1’3 (Afficheur OLED 1,3'' I2C TF051 - Afficheurs graphiques OLED | GO TRONIC).

La partie qui me pose problème est l’affichage de la direction du vent (girouette) sur cet écran, la direction du vent est donné par un codeur incrémental (https://fr.rs-online.com/web/p/codeurs-rotatifs/2056869/).

J’ai d’abord fait deux bouts de code (un pour le codeur et un pour l’afficheur), jusque-là tout marchait à merveille.

J’ai ensuite voulu afficher les valeurs du codeur sur mon écran en regroupant les deux codes et voilà où les problèmes ont commencé.
Le moniteur, qui est sensé afficher la valeur du codeur en ajoutant 1 pour chaque pas, est devenu lent et non saccadé, il n’affichait plus les valeurs une par une.
L’écran, sur lequel était affiché des phrases et Bitmaps statiques, ne voulait plus afficher l’entièreté du message qu’il devait écrire.

Voici mon code:

void loop(void) {
  u8g.firstPage();     //démarer le dessin
  do {
    text_pluie();      //dessiner ce qu'il y a dans text
    p=0;
   while((counter > 0) && (counter < 31)||  (counter < -469) && (counter > -499)){
    if(p==0){
    text_vent_Nord();
    p=1;}
  }
   while((counter > 31) && (counter < 62)|| (counter < -437) && (counter > -469)){
    if(p==0){
    text_vent_NNE();
    p=1;}
  }
     while((counter > 62) && (counter < 93)|| (counter < -406) && (counter > -437)){
    if(p==0){
    text_vent_NE();
    p=1;}
  }
     while((counter > 93 ) && (counter < 125)|| (counter < -375) && (counter > -406)){
    if(p==0){
    text_vent_ENE();
    p=1;}
  }
     while((counter > 125) && (counter < 156)|| (counter < -344) && (counter > -375)){
    if(p==0){
    text_vent_Est();
    p=1;}
  }
     while((counter > 156) && (counter < 187)|| (counter < -312) && (counter > -344)){
    if(p==0){
    text_vent_ESE();
    p=1;}
  }
     while((counter > 187) && (counter < 219)|| (counter < -281) && (counter > -312)){
    if(p==0){
    text_vent_SE();
    p=1;}
  }
     while((counter > 219) && (counter < 250)|| (counter < -250) && (counter > -281)){
    if(p==0){
    text_vent_SSE();
    p=1;}
  }
     while((counter > 250) && (counter < 281)||  (counter < -219) && (counter > -250)){
    if(p==0){
    text_vent_Sud();
    p=1;}
  }
     while((counter > 281) && (counter < 312)|| (counter < -187) && (counter > -219)){
    if(p==0){
    text_vent_SSO();
    p=1;}
  }
     while((counter > 312) && (counter < 344)|| (counter < -156) && (counter > -187)){
    if(p==0){
    text_vent_SO();
    p=1;}
  }
    while((counter > 344) && (counter < 375)|| (counter < -125) && (counter > -156)){
     if(p==0){
    text_vent_OSO();
    p=1;}
  }
     while((counter > 375) && (counter < 406)|| (counter < -93) && (counter > -125)){
    if(p==0){
    text_vent_Ouest();
    p=1;}
  }
     while((counter > 406) && (counter < 437)|| (counter < -62) && (counter > -93)){
    if(p==0){
    text_vent_ONO();
    p=1;}
  }
    while((counter > 437) && (counter < 469)||  (counter < -31) && (counter > -62)){
   
    if(p==0){
    text_vent_NO();
    p=1;}
  }
     while((counter > 469) && (counter < 499) || (counter < 0) && (counter > -31)){
    if(p==0){
    text_vent_NNO();
    p=1;}
  }
  
    text_vitesse();
    text_degre();
    Bitmap();        //dessiner ce qu'il y a dans Bitmap
  }
  while( u8g.nextPage() );    //fin du dessin

  if( counter != temp ){      //si le conteur est différeent de 0
    Serial.println (counter);    //on affiche le conteur
    temp = counter;        //0 prend la valeur du conteur
  }
  if( counter >= 499 ){      //si le conteur fait un tour, il est remis à 0
    counter = 0;
  }
  if( counter <= -499 ){       
    counter = 0;
  }
   
}

Je n’ai mis que le Void Loop car j’imagine que c’est ici que le temps est perdu.

Ma question est la suivante : comment puis-je faire pour régler ce problème de fluidité sachant que j’ai changé la carte (passé de la UNO à la Méga) et ça n’a rien arrangé ?

Merci d’avance, Quentin

Bonjour,

Qu’est ce que tous ces ‘while’?

   while ((counter > 0) && (counter < 31) ||  (counter < -469) && (counter > -499)) {

A mon avis ce devrait être des ‘if’

Bonjour, merci du retour rapide,

les 'while' ici servent à n'envoyer qu'une seul phrase à écrire sur l'écran quand la position ne change pas, si je mets un 'if' la phrase va s'envoyer à chaque Loop même si la position n'a pas changé.

Ça bloque complètement ton programme.
Dès que tu va sortir d'un while tu vas tomber dans un des suivants et tu ne feras (quasiment) jamais la fin de ton while principal.

D'accord je vais changer pour voir, merci.

Bonjour,

Si tu ne veux pas envoyer deux fois la même information, il, suffit de mémoriser la dernière envoyée et de zapper l'envoi de la nouvelle si celle-ci est identique.

Merci pour cette piste je n'avais pas réfléchi dans ce sens

Pose toi la question de savoir comment deux personnes échangent des informations.

La première qui obtient les informations brutes, fait des calculs, filtre les informations redondantes pour ensuite les transmettre à la personne qui les affiche.

Au besoin, tu peux intercaler autant de personnes que tu veux si tu trouve que la première à trop de chose a faire ;).

Tu dois juste te mettre d'accord sur l'information reçue , ce que fait cette personne avec l'information (calcul, filtre) et ce qu'il envoie à la personne suivante.

Merci pour les conseils :slight_smile: