Led Matrix 8x32 WS2812 Faire défiler du texte

Bonjour à tous,

Voilà j'ai acheté une matrice de led rgb ws2812 en 8x32.

J'ai reussi avec les exemples à faire défiler du texte sans problème j'ai mm ajouté à mon projet une horloge rtc et une sonde dht11.

J'aimerais connaitre la longueur de ma matrice car pour l'instant je suis obligé de mettre un nombre au hasard. Ici le (-220)

Ci-dessous le code que j'ai fait :

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <RTClib.h>
#include "dht.h"

RTC_DS1307 RTC;

#define dht_apin A2 // Analog Pin sensor is connected to
 
dht DHT;

#define PIN 6

// MATRIX DECLARATION:
// Parameter 1 = width of NeoPixel matrix
// Parameter 2 = height of matrix
// Parameter 3 = pin number (most are valid)
// Parameter 4 = matrix layout flags, add together as needed:
//   NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT:
//     Position of the FIRST LED in the matrix; pick two, e.g.
//     NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
//   NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal
//     rows or in vertical columns, respectively; pick one or the other.
//   NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed
//     in the same order, or alternate lines reverse direction; pick one.
//   See example below for these values in action.
// Parameter 5 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, PIN,
  NEO_MATRIX_TOP    + NEO_MATRIX_LEFT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);

const uint16_t colors[] = {
  matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(255, 255, 0),matrix.Color(0, 0, 255), matrix.Color(255, 0, 255), matrix.Color(0, 255, 255), matrix.Color(255, 255, 255)};

void setup() {
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(10);
  matrix.setTextColor(colors[0]);
  matrix.setTextSize(1);
  Wire.begin();
  RTC.begin();
  Serial.begin(9600); 
}

int x    = matrix.width();
int pass = 0;
long currentMillis;
long previousMillisdht11 = 0;
long timedht11 = 5000;

long previousMillismatrix = 0;
long timematrix = 15;

long previousMillisrtc = 0;
long timertc = 500;

float temperature;
float humidity;
char heure[12];
char date[12];

void majtemp() {
  DHT.read11(dht_apin);
    temperature = DHT.temperature;
    humidity = DHT.humidity;
}

void loop() {

currentMillis = millis();
if(currentMillis - previousMillisrtc > timertc) {
    previousMillisrtc = currentMillis;  
    DateTime now = RTC.now();
    sprintf(heure,"%02u:%02u:%02u",now.hour(),now.minute(),now.second());
    sprintf(date,"%02u/%02u/%04u",now.day(),now.month(),now.year());
        }
  
  //dateheure = now.hour() + ':' + now.minute() + ':' + now.second();

  
//  matrix.print('l');
//  matrix.print(' ');
//  matrix.print(now.hour());
//  matrix.print(':');
//  matrix.print(now.minute());
//  matrix.print(':');
//  matrix.print(now.second());
  
  
currentMillis = millis();
if(currentMillis - previousMillisdht11 > timedht11) {
    previousMillisdht11 = currentMillis;  
    majtemp();
        }
        

  
  matrix.fillScreen(0);
  matrix.setCursor(x, 0);
  matrix.setTextColor(matrix.Color(255,0,0)); 
  matrix.print("Il est :");
  matrix.setTextColor(matrix.Color(0,255,0)); 
  matrix.print(heure);
  matrix.print(' ');
  matrix.setTextColor(matrix.Color(255,255,255));
  matrix.print(date);
  matrix.print(' ');
  matrix.print(temperature);
  matrix.print('c');
  matrix.print(' ');
  matrix.print(humidity);
  matrix.print('%');
  matrix.show();
  
currentMillis = millis();
if(currentMillis - previousMillismatrix > timematrix) {
previousMillismatrix = currentMillis;
if(--x < -220  ) {
    x = matrix.width();
    
    
//    if(++pass >= 8) pass = 0;
//    matrix.setTextColor(colors[pass]);
  }

}


}

Bien à vous
bypbop

Je connais mal la bibliothèque Neomatrix mais il semble que tu utilises la variable x pour positionner le premier pixel de ton texte. Celui en bas à gauche. Tu l'initialises à matrix.width() pour que le texte semble apparaître à l'extrémité droite de la matrice puis x-- pour le déplacer vers la gauche.

Pour faire disparaître ton texte à l'extrémité gauche, il faut que x se décrémente jusqu'à valoir l'opposé de la largeur de ton texte (en nombre de pixels).

Je crois que la fonction getTextBounds de la bibliothèque Adafruit GFX fait ce calcul, à confirmer cependant.

To replace previously-drawn test when using a custom font, use the getTextBounds() function to determine the smallest rectangle encompassing a string, erase the area using fillRect(), then draw new text.

int16_t  x1, y1;

uint16_t w, h;

tft.getTextBounds(string, x, y, &x1, &y1, &w, &h);



getTextBounds expects a string, a starting cursor X&Y position (the current cursor position will not be altered), and addresses of two signed and two unsigned 16-bit integers. These last four values will then contain the upper-left corner and the **width** & height of the area covered by this text — these can then be passed directly as arguments to fillRect().

Sinon, il faut le calculer toi-même : largeur = somme des largeurs de chaque caractère à afficher plus les espaces entre les caractères.

Merci c'est tout à fait ça je veux trouver la longueur de mon texte ...
Je vais tester merci !

Visiblement, chaque caractère utilise 6 pixels en largeur et tu ne mets pas d'espace : ça ne devrait pas être très compliqué.
Si ton texte est dans un c-string, tu as strlen

Bonjour

Avec mon club, nous avons acquis 2 bandeaux leds comme celui de la descrition ci dessus.
Cependant, après avoir relié les 2 matrices, nous n'arrivons pas à faire défiler le texte
sur les 2 bandeaux. Où doit-on modifier le programme ?
Merci

Dans les locaux du club...

Bonsoir

Merci pour cette édifiante réponse que nous avons appliquée ce soir , hélas sans succès;le 2° bandeau
situé à gauche reste éteint sauf quelques leds allumée. Nous fouillons le programme mais, faisons divers essais
mais sans résultat !
pouvez-vous nous aiguiller vers une solution.

D'avance merçi.

Sans le code ni les explications sur le câblage, l'arduino utilisé, etc, il est difficile de faire une réponse utile.

Bonjour

Le bandeau que nous utilisons est celui-çi :

https://fr.aliexpress.com/item/32911854822.html?spm=a2g0o.cart.0.0.43bf3c00HLWr0I&mp=1

Nous avons raccordé 2 bandeaux identiques par les connecteurs M/F de ceux-çi et nous alimentons
chaque bandeau en 5v;

Le programme que nous utilisons est celui bipbop plus haut dans cette page.

Un seul bandeau défile le texte et l'heure, quelques leds sont allumées à l'extrémité du second bandeau.

En modifiant les lignes du programme , nous n'obtenons aucun résultat.

En fin de compte, il nous semble que peut-être la solution se trouve dans les librairies
NeoPixel ou NeoMatrix

Tout conseil nous sera précieux, merci d'avance.

nous alimentons chaque bandeau en 5v;

C'est alimenté comment? Via l'arduino?

Si c'est ça, il est possible que la pin d'alimentation ne soit pas assez puissante pour les besoins des matrices, c'est à dire qu'elle ne délivre pas assez de courant.
Essayez d'alimenter avec une alimentation 5V délivrant au moins 2A (estimation au pif).

N'oubliez pas de raccorder les GND de l'alimentation et du montage arduino.

Oui nous alimentons chaque module (fil rouge 5V, fil blanc ( gnd) par une alim 5v 10A séparée .

Pour calculer l'alimentation, il faut compter 60mA par led (si tu les allumes au max de puissance, en blanc). C'est donc une valeur supérieure.

Il y a combien de leds par panneau ?
Comment tout cela est-il connecté et relié à l'arduino ?

Il y a des choses intéressantes à lire ici

Cette ligne déclare un panneau de 32 x 8 leds :

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, PIN,
  NEO_MATRIX_TOP    + NEO_MATRIX_LEFT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);

Si vous avez 2 panneaux en série, il faut peut-être déclarer 64, 8.

S'ils ne sont pas en série, c'est à dire que chacun a sa pin de commande, ça doit être différent. Il faut en déclarer deux différents.