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("");
}
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
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
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.