Difficultée librairie parola

Bonjour, il me faudrait quelqu'un qui connaisse bien la librairie arduino parola SVP.

j'ai une matrice led 8*32 max72xx, et je suis coincé avec les mots de plus de 5 lettres.

je peux facilement écrire avec P.print les mots courts, et les mots long c'est mort.

pour les mots longs j'utilise le scroll, mais le scroll est une vraie galère, car il scroll indéfiniment. si je le conditionne à une action , par exemple un bouton, il scroll pendant l'appui puis se met en pause.

je voudrais pouvoir faire un scroll du mot une fois pour le lire, et c'est tout.

avez vous une idée ?

merci.

voici le code démo que j'utilise. Là en l'état il défile à l'appui, puis se met en pause au relâchement, puis reprend si j’appuie à nouveau.

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW // ICSTATION_HW/ GENERIC_HW / PAROLA_HW 
#define MAX_DEVICES 4
#define DATA_PIN  51 // 51 mega  11 uno   MOSI   GRIS       
#define CLK_PIN   52 // 52 mega  13 uno   SCLK   VIOLET     
#define CS_PIN    53 // 53 mega  10 uno   SS     BLEU       
// pin 50 mega pour MISO
byte bouton = 12;
byte etatbouton = 0;

MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

void setup() {
  // put your setup code here, to run once:
  P.begin();
  pinMode(bouton, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  etatbouton = digitalRead(bouton);
  if (etatbouton == HIGH) {
    defilement();
  }
}

void defilement() {
 if (P.displayAnimate())
   P.displayText("Push Start   ", PA_RIGHT, 70, P.getPause(), PA_SCROLL_LEFT);
}

de mémoire, l'appel à P.displayAnimate() répond true quand l'animation est terminée
➜ Il suffit sans doute de ne pas la relancer

Merci, j'avoue ne rien comprendre aux librairies, c'est pour ça que j'en utilise jamais. Mais pour l'affichage c'est bien pratique.
J'ai pas bien saisi la réponse, mais je vais essayer des trucs avec en condition true. Merci

en gros quand vous écrivez cela :

 if (P.displayAnimate())
   P.displayText("Push Start   ", PA_RIGHT, 70, P.getPause(), PA_SCROLL_LEFT);
}

vous dites au code : "quand tu as fini l'animation, relances-en une pour faire défiler du texte

il faudrait tester le bouton : une fois qu'il est appuyé, si vous n'avez pas d'animation En Cours, vous lancez une animation avec
P.displayText("Push Start ", PA_RIGHT, 70, P.getPause(), PA_SCROLL_LEFT);
et vous mettez une variable bool à vrai (du genre animationEnCours = true;) et vous attendez que P.displayAnimate() vous dise que l'animation est finie et là vous remettez animationEnCours = false;. comme il n'y aura plus rien à animer, plus rien ne devrait se passer

Dans cette bibliothèque, vous avez également les options :

   //  myDisplay.setIntensity(0);
  //myDisplay.displayClear();// Clear the display
  //myDisplay.setInvert(false);
  //myDisplay.setTextAlignment(PA_RIGHT);
  //myDisplay.setTextAlignment(PA_LEFT);
  //myDisplay.setTextAlignment(PA_CENTER);

J'ai utilisé le texte centré dans un projet, c'était le plus pratique pour moi, mais compte tenu de la largeur que la librairie donne à chaque caractère plus un point de séparation entre eux, je trouve très complexe de représenter plus de 5 caractères. La seule option pratique que j'ai trouvée était d'ajouter plus de modules 8x8. Dans plusieurs tests que j'ai fait, c'était la seule solution trouvée.

Merci, oui mais je suis bloqué à 8*32, la place est limitée. :wink:

Merci beaucoup pour l'exemple, je vais tester.

alors, j'ai compris l'idée (je pense), mais comme à chaque fois dans les librairies, on ne connait rien de la logique du concepteur, j'avoue que le P.displayAnimate je le mets, car j'ai essayé sans, et il se passe rien. si il renvoie une valeur true à la fin de l'animation, je devrais juste dire un truc du genre: if displayAnimate == true; "ne rien faire" non ? j'ai essayé ce que vous m'avez écrit, mais je ne comprends pas comment je vais interférer avec cette biblio ?

void loop() {
  // put your main code here, to run repeatedly:
  etatbouton = digitalRead(bouton);
  if (etatbouton == HIGH) {
    defilement();
  }
}

void defilement() {
  if (P.displayAnimate()) {
    animStart = true;
    P.displayText("Push Start   ", PA_RIGHT, 70, P.getPause(), PA_SCROLL_LEFT);
    if (P.displayAnimate == true)
    animStart = false;
  }
}

en fait je vois sur pleins de pages que displayAnimate renvoie true, mais je ne sais pas ce que ça veut dire. renoyer true où ? dans quoi ? vers quoi ? mystère.

il faut appeler displayAnimate() le plus souvent possible. ça fait l'animation

essayez un truc comme cela (tapé ici, absolument non testé)

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW // ICSTATION_HW/ GENERIC_HW / PAROLA_HW 
#define MAX_DEVICES 4
#define DATA_PIN  51 // 51 mega  11 uno   MOSI   GRIS       
#define CLK_PIN   52 // 52 mega  13 uno   SCLK   VIOLET     
#define CS_PIN    53 // 53 mega  10 uno   SS     BLEU       
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

const byte pinBouton = 12;


void setup() {
  P.begin();
  pinMode(pinBouton, INPUT);  // il y a un pull down externe
  P.displayText("Push to Start   ", PA_RIGHT, 70, P.getPause(), PA_SCROLL_LEFT);
  while (digitalRead(pinBouton) == LOW) P.displayAnimate();
  P.displayReset();
  P.displayText("STARTED   ", PA_RIGHT, 70, P.getPause(), PA_SCROLL_LEFT);
}

void loop() {
  P.displayAnimate();
}

je suppose que vous avez un pull down externe sur votre bouton

merci pour ce code, je vais l'essayer.mais je ne comprends pas comment displayAnimate sais quelle animation il doit faire ? ou alors je n'ai pas compris sa fonction. comment des "mots" dans un setup, peuvent être lus et trié dans la boucle ?? là j'avoue que ça me dépasse.

oui j'ai un pulldown physique.

ça fait quelques années que je n'ai pas joué avec Parola

de mémoire, les fonctions comme displayText() enregistrent une animation à exécuter avec un certain nombre de paramètres et l'effet d'entrée et de sortie

ensuite P.displayAnimate() se charge de gérer le temps de manière asynchrone (on ne bloque pas le code) et de faire un affichage quand c'est nécessaire en fonction des paramètres donnés comme la vitesse de défilement.

quand toute l'animation est terminée P.displayAnimate() dira true

je ne suis plus sûr si l'animation recommence toute seule dans ce cas mais on pourrait faire un P.displaySuspend() si on veut arrêter vraiment

alors ça fonctionne de cette façon :
à la mise sous tension, le message push to started défile et stop.
une fois appuyé le bouton, STARTED défile et s'arrête.
ensuite c'est bloqué.
mais je ne comprends pas le fonctionnement malheureusement, et cette histoire de valeur TRUE je ne la saisie pas.

en effet, j'ai essayé avec displaytext aussi, mais c'est encore plus flou que l'autre. je ne comprends pas les paramètres attendus.

faut lire les docs

https://majicdesigns.github.io/MD_Parola/

oui j'ai lu, je suis dessus encore en ce moment même, mais c'est tout en anglais, et il n'y a pas d'exemple, il n'y a que les conditions, du coup on peut même pas déduire ce qui est attendu.

Il y a des exemples dans la bibliothèque

oui j'ai regardé chaque exemple, mais c'est un sac de noeuds incompréhensible. on ouvre l'exemple scroll, et il y a 850 lignes de codes avec des expressions inconnues pour moi. on ne sait pas ce qui est utile et ce qui ne l'est pas. la seule biblio intéressante est la print minimal, et là on comprend, et on voit bien qu'il faut quasiment rien pour afficher.
j'ai bien vu que pour le scroll, en faisant des tests avec des morceaux par ci par là, que ça se fait en 2 lignes, donc les exemples sont bien trop complexes pour être utilisés.

Bon, je n'y arriverai pas, je laisse tomber. J'ai afficher successivement des mots, ça ira bien. Merci pour votre aide.