ESP32, écran Oled et texte défilant

Hello la communauté,
je suis en train de développer un petit projet pour m’amuser, et je suis confronté à un problème qui semble trivial.
En effet, j’ai un écran Oled de 0,96 pouces 128 * 64., et j’aimerais y faire défiler du texte.
Mon problème, c’est que d’après les tutos que j’ai vu, pour faire défiler un texte, il faut faire une boucle comme suit :

void displayScrollingText(const char* text) {
  u8g2_uint_t x;
  
  u8g2.firstPage();
  do {
  
    // draw the scrolling text at current offset
    x = offset;
    u8g2.setFont(u8g2_font_t0_11_mf);  
    do {          
      u8g2.drawUTF8(x, 10, text);     // draw the scolling text
      x += width;           // add the pixel width of the scrolling text
    } while( x < u8g2.getDisplayWidth() );    // draw again until the complete display is filled
    
  } while ( u8g2.nextPage() );
  
  offset-=3;              // scroll by three pixel
  if ((u8g2_uint_t) offset < (u8g2_uint_t) - width) 
    offset = 0;             // start over again
 
  delay(10);
}

Mais je fais clignoter une led dans la fonction Loop, en mettant un delay(500) par exemple.
Or la boucle du texte défilant sollicite fortement le processeur. Tant que le texte n’a pas fini de défiler, le processeur est locké. Je constate alors que ma led ne clignote plus toutes les 500ms.

J’aimerais donc savoir quelle est la bonne manière de faire pour afficher un texte défilant sans locker le processeur.
Peut-on faire du multithreading sur un esp32 LoRa SX1276 ?

D’avance merci,
Binomial

parceque ta boucle est bloquante : elle ne se termine pas tant que le texte n’a pas fini de défiler.

Il faut que tu trouves un moyen de ne pas faire de boucle mais une fonction qui décale ton texte lorsqu’elle est appelée périodiquement depuis loop()

Ou mettre le clignotement de la led dans le while… Mais la solution de Bricofoy est plus propre

Pas bête, je peux tenter de faire défiler mon texte de quelques pixels à chaque tour du loop().
Merci beaucoup, je vais essayé, et vous tiendrai au courant :slight_smile:

Petit retour sur mon souci, j’ai déplacé le code d’affichage du texte dans le loop.
Ca fonctionne, sauf que pour que le défilement soit naturel il faut pas qu’il y ait plus de 20ms de delay par passage dans le loop. Ce qui pose souci car pour gérer mes clignotement de led et buzzer, j’ai un délais entre 600 et 650ms par boucle.
Je pense donc à conditionner mon code pour découper mes gros délais, mais ça ne va pas être simple

Tu peux faire un truc un peu plus coulant. D’abord tu crées une fonction qui fait l’affichage défilant, exactement ce que tu as décrit plus haut, mais dans une fonction, que tu peux appeler n’importe où.
Ensuite dans la loop, tu surveilles le temps qui passe. Des que 20ms se sont écoulées, tu appelles la fonction qui fait défiler le texte d’un cran.
L’idéal serait que les autres instructions de la loop ne durent pas plus de 20ms aussi mais ça n’a pas l’air d’être le cas.
Si tu as des delay dans ton code, tu peux les remplacer par une fonction qui va surveiller le temps qui passe et appeler ta fonction de défilement toutes les 20ms.
Si les durées que tu annonces ne sont pas dues à des delay, alors tu peux chercher ce qui prend du temps et y insérer des appels de ta fonction lorsque les 20ms sont passées.

Après réflexion, le top serait d’utiliser un timer qui lancerait une interruption toutes les 20ms pour appeler ta fonction de défilement. @vileroi pourrait t’expliquer ça très mieux que moi. :rofl:

C’est pas bête du tout.
Je peux faire un “override” de la fonction delay, qui fera finalement des successions de délais de 20ms et d’appels à la fonction d’affichage du texte. Ce qui m’évitera de tout récrire mon code

Ou plus simplement tu pourrais ne pas utiliser delay() mais utiliser millis()

Ou encore utiliser une librairie qui fait ça pour toi comme par exemple YASM
https://forum.arduino.cc/t/partage-yasm-bibliotheque-de-creation-de-machines-a-etat-tres-simple-demploi/504517

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