Affichage messages sur une matrice de LED

Bonjour,

Je dispose d’une matrice de led de taille 20*5.J’aimerai pouvoir afficher du texte sur cette matrice (un peu comme on peut le voir dans les gares) J’ai déjà créer un alphabet ainsi que le reste du programme pour afficher un texte si celui-ci requiert moins de 20 pixels de long.

J’espérais donc, lorsque mon message requiert plus de 20 pixels de long, faire défiler mon texte afin que les caractères suivant s’affichent sur ma matrice. C’est la que je bloque. Pour faire ça je comptais associer à chaque pixel la couleur du pixel situé juste à sa droite. Je comptais donc utiliser la fonction "strip.getPixelColor() " de la bibliothèque neopixel. Cela semblait marcher aux premiers abords mais très vite le message s’assombrissait jusqu’à devenir complètement noir.

Voici un exemple de mon code (j’ai pris un exemple plus simple ou chaque pixel de la première ligne est d’une couleur différente et j’observe le défilement).

#include <Adafruit_NeoPixel.h>


#define LED_PIN    6
#define LED_COUNT 100
// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_RGB + NEO_KHZ800);



int arranger(int k, int i) {  //fonction retournant la position de la led en fonction du numéro de sa ligne et colonne 
  int reponse = 0;
  if (k % 2 == 0) {
    reponse = 20 * k + i + 1;
  }
  else {
    reponse = 20 * k + 20 - i ;
  }

  return reponse - 1;
}


void defiler() {                   
  for (byte i = 0; i < 20; i++) {
    for (byte k = 0; k < 5; k++) {
      strip.setPixelColor(arranger(k, i), strip.getPixelColor(arranger(k, i + 1)));
    }
  }
  for (byte k = 0; k < 5; k++) {
    strip.setPixelColor(arranger(k, 19), strip.getPixelColor(arranger(k, 0)));
  }
  strip.show();
}

void setup() {
  Serial.begin(9600);
  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
  // rainbow();
  for (int i = 0; i < 20; i++) {
    strip.setPixelColor(arranger(0, i), i * 10 +1, 0, 0);
  }
}

void loop(){
 defiler();
      for (int i = 0; i < 20; i++) {
        Serial.print(strip.getPixelColor(arranger(0, i))); Serial.print(" ");
      }
      Serial.println("");
}

Voici les premières lignes du port série:

 327680 983040 1638400 2293760 2949120 3604480 4259840 4915200 5570560 6225920 6881280 7536640 8192000 8847360 9502720 10158080 10813440 11468800 12124160 0 

655360 1310720 1966080 2621440 3276800 3932160 4587520 5242880 5898240 6553600 7208960 7864320 8519680 9175040 9830400 10485760 11141120 11796480 0 327680 

983040 1638400 2293760 2949120 3604480 4259840 4915200 5570560 6225920 6881280 7536640 8192000 8847360 9502720 10158080 10813440 11468800 0 0 655360 

1310720 1966080 2621440 3276800 3932160 4587520 5242880 5898240 6553600 7208960 7864320 8519680 9175040 9830400 10485760 11141120 0 0 327680 983040 

1638400 2293760 2949120 3604480 4259840 4915200 5570560 6225920 6881280 7536640 8192000 8847360 9502720 10158080 10813440 0 0 0 655360 1310720

On remarque qu’une ligne sur deux les valeurs n’ont pas de cohérence .

D’où vient ce problème ?

Comment est organisée votre matrice ? (Ordre des pixels)

Je pense que vous allez lire un cran trop loin avec for (byte i = 0; i < 20; i++) { quand i vaut 19 vous mettez le contenu du pixel 20 dedans et il est sur l’autre ligne

Il s'agit d'une matrice de 5 lignes et 20 colonnes. Le premier pixel est situé en haut à gauche et a pour indice 0. L'ordre des pixels suit un serpentin. Ainsi, le dernier pixel de la première ligne a pour indice 19.

Effectivement, j'avais bien oublié un cran dans ma boucle, j'ai donc remplacé 20 par 19. Merci !

Toutefois, j'obtiens toujours le même résultat dans le port série :frowning:

hello

:o :o :o

“for (byte i = 0; i < 20; i++) {” donc de 0 à 19, ce qui fait bien 20 lectures

“Je pense que vous allez lire un cran trop loin avec”

“Effectivement, j’avais bien oublié un cran dans ma boucle, j’ai donc remplacé 20 par 19. Merci !”

“for (byte i = 0; i < 19; i++) {” donc de 0 à 18, ce qui fait 19 lectures :confused: :confused: :confused:

ou alors, je n’ai rien compris :slight_smile:

dfgh:
...
ou alors, je n'ai rien compris :slight_smile:

Pour faire défiler, 19 lectures c’est bien si la ligne fait 20 pixels, le 20ème étant le nouveau pixel entrant: on met en pixel 0 la valeur du pixel 1, en 1 celle du 2, en 2 celle du 3,... en 18 celle du 19 et en 19 c’est une nouvelle couleur.

EpiX-EX:
Je comptais donc utiliser la fonction "strip.getPixelColor() " de la bibliothèque neopixel. Cela semblait marcher aux premiers abords mais très vite le message s’assombrissait jusqu’à devenir complètement noir.

je me demande si le phénomène observé n’est pas simplement dû au

 strip.setBrightness(50);

. Cette fonction a pour effet de modifier la valeur du pixel pour l’assombrir et donc quand vous relisez la couleur elle est (dans l’espace colorimétrique RGB) moitié moins brillante que celle que vous y avez mis.

Essayez en mettant setBrightness à fond pour tester cette hypothèse


Sinon je n’avais pas continué la lecture du code et je vois cela après le décalage

 for (byte k = 0; k < 5; k++) {
    strip.setPixelColor(arranger(k, 19), strip.getPixelColor(arranger(k, 0)));
  }

mais comme vous avez écrasé le contenu du pixel 0 par la valeur du pixel 1 vous ne réinjectez pas l’ancienne valeur à l’autre bout. Il faut le conserver dans un buffer temporaire.

X = couleur du pixel 0
Copier dans 0 à 18 les pixels de 1 à 19
Mettre en 19 la valeur X

Cette fonction a pour effet de modifier la valeur du pixel pour l’assombrir et donc quand vous relisez la couleur elle est (dans l’espace colorimétrique RGB) moitié moins brillante que celle que vous y avez mis.

Tout juste ! En ayant remis strip.setBrightness(255) le programme fonctionne parfaitement.

Seul souci, c’est que je suis désormais obligé d’utiliser les leds en pleine puissance. J’imagine qu’il va falloir que je crée moi-même une fonction pour assombrir les leds.

Sinon je n’avais pas continué la lecture du code et je vois cela après le décalage

for (byte k = 0; k < 5; k++) {

strip.setPixelColor(arranger(k, 19), strip.getPixelColor(arranger(k, 0)));
  }



mais comme vous avez écrasé le contenu du pixel 0 par la valeur du pixel 1 vous ne réinjectez pas l'ancienne valeur à l'autre bout. Il faut le conserver dans un buffer temporaire.

Effectivement je n’avais pas prêté attention. Merci !

Pour la brightness dans l’absolu l’œil ne réagit pas de la même façon à une variation de rouge vert ou bleu mais en première approche vous pouvez juste mettre par exemple R G et B a 128 et ce sera moins brillant.

en première approche vous pouvez juste mettre par exemple R G et B a 128 et ce sera moins brillant.

C’est-ce que je vais faire, cela sera amplement suffisant pour mon projet.

Merci à vous pour votre aide !

Avec plaisir, bonne continuation et développements