Matrice 40 leds WS2812 5*8 journal défilant

Bonjour,
je cherche à faire un journal défilant sur un shield avec 40 leds WS2812 réparties en 8 colonnes de 5 leds de haut.
Le shield:


La numérotation des leds est:
0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15

J’ai créé un alphabet de 3 (largeur) *5 (hauteur) leds pour chaque lettres.
J’arrive à afficher une phrase mais avec un seul caratère à la fois (que ce soit en défilant (ce que j’ai fait: YouTube ou non).
J’ai mis un point en remplacement des espaces pour les essais. Le texte est: “HELLO.WORLD.I.AM.NONO!”
Ma routine d’affichage:
affiche_lettre(pos_led, lettre, R,G,B), où pos_led (byte) est le numéro de la led et lettre (String) est la lettre à afficher.

Mon problème c’est que j’aimerais faire défiler ce texte de droite à gauche…

Dans la loop, j’ai:

  text = "HELLO.WORLD.I.AM.NONO!";
  text = text + "  "; //On met 2 espace à la fin pour effacer l'affichage
  longueur = text.length(); 
    
     
  byte caracteres_restant = longueur;
  byte caracteres_affiches; 
  
while(caracteres_restant != 0) {
  for(i = 0; i < 11; i++) {
      affiche_lettre(7 - i, text.substring(caracteres_affiches, caracteres_affiches + 1), 10,0,0); 
      
//      affiche_lettre(7 - i - 7, text.substring(caracteres_affiches, caracteres_affiches + 1), 10,0,0); //H
//      affiche_lettre(7 - i - 3, text.substring(caracteres_affiches + 1, caracteres_affiches + 2), 10,0,0); //E
//      affiche_lettre(7 - i + 1, text.substring(caracteres_affiches + 2, caracteres_affiches + 3), 10,0,0); //L 
     

    

    delay(500);   
    strip.clear();   //Efface la lettre de son emplacement
    if(7 - i == -3) {  //La lettre est complètement effacée
      caracteres_restant -= 1;
      caracteres_affiches += 1;  
    }
  }
 
 }//fin while

L’un d’entre vous aurait-il un petit bout de code déjà tout fait?
Ou quelques trucs pour m’aider SVP?

il faut créer un buffer spécifique qui représente l’état de vos LEDs ce sera un tableau de 8x5 avec 3 octets pour les valeurs R,G et B de la LED en question

byte leds[8][5][3];

par exemple pour adresser un pixel à l’intersection d’une ligne et d’un colonne vous conservez la couleur dans

leds[colonne][ligne][0] // --> R
leds[colonne][ligne][1] // --> G
leds[colonne][ligne][2] // --> B

Lorsque vous voulez faire défiler quelque chose il faut décaler d’un cran dans le bon sens les octets (ligne par ligne ou colonne par colonne en fonction du sens de défilement) puis prendre la bonne ligne ou colonne de votre dessin de votre alphabet pour l’injecter dans la ligne ou colonne que vous venez de libérer. au changement de lettre on injecte une ligne ou colonne vide puis on passe au caractère suivant. L’espace dans l’alphabet graphique c’est simplement une lettre sans rien d’allumé.

une fois que c’est fait, vous envoyez toute la matrice à l’affichage

pour régler la vitesse de défilement, vous réglez le délai d’attente entre deux décalages consécutifs dans le tableau

en gros en séquence ça donne quelque chose comme cela
graphique.png

en procédant ainsi vous aurez plusieurs caractères en même temps sur l’écran. C’est juste de la manipulation de tableaux à recopier.

si votre alphabet ne gère pas les couleurs et que tout est uniforme lors de l’affichage bien sûr pas besoin alors d’avoir autant d’espace réservé, on peut descendre au niveau du bit (1 octet = 8 bit = une ligne) et chaque bit dira si le pixel doit être allumé ou pas, ce qui permet de limiter la mémoire utilisée (le décalage dans les colonnes devient alors un bit shift)

Je vois, en fait ma méthode d'adressage direct n'est pas correct, je dois passer par une variable que représente l'état spécifique de chaque led.
Je n'ai plus trouver pour mettre les lettres dedans.
Et après je n'ai qu'a l'envoyer à l'affichage.

Merci pour votre aide, je vais essayer de faire çà :slight_smile: