Problème affichage sur matrice ws2812

Bonjour à tous,
Je suis sur un nouveau projet où je voudrai faire plusieurs choses sur un ensemble de 7 matrices ws2812. Je voudrai pouvoir, suivant la commande envoyé sur la carte arduino uno, soit afficher un texte, soit mettre en rouge 5 matrices qui vont s'allumer l'une après l'autre et tout effacer après la 5ème (la 1, puis 1-2, 1-2-3, 1-2-3-4, 1-2-3-4-5) et afficher un nouveau texte après avoir tout effacé.
Au niveau du programme, je pense avoir sortir quelque chose, même s'il n'est pas fini, il n'y a pas les déclenchements ça tourne en boucle dans le loop.
J'ai regardé pas de vidéos et tutos, et ce qui me paraissait compliqué fonctionne (l'affichage des textes, même avec défilement) par contre là où je bloque c'est sur l'allumage d'une matrice entière (les 64 leds). Sans doute que je ne met pas ce qu'il faut (enfin c'est sur).
Je mettrai le code complet à la fin.
Ce qui ce passe c'est qu'au lieu d'avoir les 8x8 leds qui s'allument je n'ai que 5 colonnes et 7 lignes (en partant du "matrix.setCursor(32, 0);" que je définit et cela quelque soit la valeur max du pixel. Jusqu'à 10 j'ai ce rectangle de 5x7 et au dessus j'ai un 2ème rectangle qui se forme décalé d'une colonne sur la droite.
Est-ce que vous pourriez m'aider et me dire quel serait les bonnes lignes de code pour que cela fonctionne.
Merci par avance de votre aide,
Amitiés.

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

//Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32,8,2,
//  NEO_MATRIX_BOTTOM    + NEO_MATRIX_RIGHT+
//  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
//  NEO_GRB + NEO_KHZ800);

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(56,8,4, NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + 
NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE, NEO_GRB + NEO_KHZ800 );
    
void setup(){
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(10);
}


void loop() {
  
//afficherTexte();

decompte();


}


void afficherTexte(){
    matrix.fillScreen(0);
  matrix.setTextColor(matrix.Color(0, 200, 0));
  for(int x=56; x>=-255; x-=1) { 
  matrix.setCursor(x, 1); 
  matrix.print("Bienvenue au circuit Paul Ricard de l AMR33"); //lasdi
  matrix.show();
  delay(20);
  matrix.fillScreen(0);
}
}


//allumage de 5 matrices successivement puis donner départ
void decompte(){  
  
   matrix.fillScreen(0);
   matrix.setTextColor( matrix.Color(200, 0, 0));
   
   for(int pixel = 0; pixel <10; pixel ++){
      //matrix.setPixelColor(pixel, matrix.Color(200, 0, 0));
      matrix.setCursor(40, 0);
      matrix.print(pixel);
      matrix.show();
      }
      delay(1000);

      for(int pixel = 0; pixel < 10; pixel ++){
      //matrix.setPixelColor(pixel, matrix.Color(200, 0, 0));
      matrix.setCursor(32, 0);
      matrix.print(pixel);
      matrix.show();
      }
      delay(1000);

         for(int pixel = 0; pixel < 10; pixel ++){
      //matrix.setPixelColor(pixel, matrix.Color(200, 0, 0));
      matrix.setCursor(24, 0);
      matrix.print(pixel);
      matrix.show();
      }
      delay(1000);

      for(int pixel = 0; pixel < 10; pixel ++){
      //matrix.setPixelColor(pixel, matrix.Color(200, 0, 0));
      matrix.setCursor(16, 0);
      matrix.print(pixel);
      matrix.show();
      }
      delay(1000);

      for(int pixel = 0; pixel < 10; pixel ++){
      //matrix.setPixelColor(pixel, matrix.Color(200, 0, 0));
      matrix.setCursor(8, 0);
      matrix.print(pixel);
      matrix.show();
      }
      delay(1000);

      
      matrix.fillScreen(0);
      matrix.setTextColor(matrix.Color(200, 0, 00));
      matrix.setCursor(22, 1); 
      matrix.print("GO"); 
      matrix.show();
      delay(5000);


}

J-M-L jackson m'a donné un sacré coup de main sur un souci similaire pour mon affichage sur une matrice 8X32

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

s'il passe par ici, il va surement te donner le petit truc qui va bien ...

Bonjour et merci pour ta réponse :+1: . Je ne vais pas lui sauter dessus et patienter, et en attendant je vais essayer de me creuser la tête (enfin plutôt chercher sur le Net, pas assez costaud en config arduino) en partant sur l'idée du buffer.

Bonjour herisson33

Tu pourrais essayer l'IA en lui transmettant l'entier de ton premier post, y compris le sketch, tu verra c'est pas mal :wink:

Cordialement
jpbbricole

Bonjour et merci pour le lien :+1: . Je vais essayer, c'est vrai que je fais parti des "vieux qu'on" de l'age et par encore utiliser l'IA pour ce genre de soucis.

Bonjour,
Encore merci pour le lien (je ne connaissais pas), j'ai pu progresser dans mon code et maintenant j'arrive à commander soit le démarrage du texte ou l'allumage successivement de matrices avec des boutons.
Par contre j'ai voulu démarrer l'une ou l'autre des fonctions avec le bluetooth et on tourne en rond car le bluetooth fonctionne, je reçois bien les infos (en utilisant le print je vois bien que je vais dans les fonctions par contre ça bloque au niveau du "matrix.show();" car rien ne se passe au niveau des matrices, à moins que j'oublie quelque chose.
J'ai fait un autre code avec "#include <FastLED.h>" au lieu de " include <Adafruit_NeoMatrix.h>" et "#include <Adafruit_NeoPixel.h>", ça fonctionne au niveau des matrices à allumer mais je suis coincé pour afficher un texte (pas encore étudié comment faire.
Si vous aviez une idée, svp. Merci
Le code avec le bluetooth et NeoMatrix:

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
//#include <SoftwareSerial.h>
#include <AltSoftSerial.h>

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(56, 8, 3, NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + 
NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE, NEO_GRB + NEO_KHZ800);

//SoftwareSerial Bluetooth(8, 9); // RX, TX
AltSoftSerial Bluetooth;

// pour gestion millis
unsigned long previousMillis = 0;
unsigned long interval = 20; // Intervalle entre les mises à jour des LEDs

void setup() {
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(10);

  Serial.begin(9600);
  Bluetooth.begin(9600); // Initialiser le Bluetooth
}

void loop() {
  // Lire les commandes Bluetooth
  if (Bluetooth.available()) {
    char command = Bluetooth.read(); // Lire une commande
    switch (command) {
      case 'T': // Commande pour afficher le texte
        Serial.print("commande afficher texte = ");
        Serial.println(command);
        delay(50);

        afficherTexte();

        break;
      case 'D': // Commande pour démarrer le décompte
        Serial.print("commande decompte = ");
        Serial.println(command);
        delay(50);

        decompte2();
        break;
      case 'E': // Commande pour effacer
        matrix.fillScreen(0);
        matrix.show();
        break;
    }
  }
}



void afficherTexte() {

   Serial.println("Début afficherTexte");

  matrix.fillScreen(0);
  //matrix.setTextColor(matrix.Color(0, 150, 0));
  for (int x = 56; x >= -255; x -= 1) {
    Serial.print("x: "); Serial.println(x);
    matrix.setCursor(x, 1);
    matrix.setTextColor(matrix.Color(0, 150, 0));
    matrix.print("Bienvenue au circuit Mini-Z de l'AMR33");
    Serial.println("texte mémorisé");
    matrix.show();
    Serial.println("Envoi afficherTexte");
    delay(20);
    matrix.fillScreen(0);
  }
  Serial.println("Fin afficherTexte");
}



/*
void afficherTexte() {
  static int x = 56; // Position initiale
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    Serial.println("Début afficherTexte");

    matrix.fillScreen(0);
    matrix.setCursor(x, 1);
    matrix.setTextColor(matrix.Color(0, 150, 0));
    matrix.print("Bienvenue au circuit Mini-Z de l'AMR33");
    Serial.print("x =  "); Serial.println(x);
    matrix.show();

    x--; // Déplacer le texte vers la gauche
    if (x < -255) x = 56; // Réinitialiser à la fin
  }
  Serial.println("Fin afficherTexte");
}
*/

void decompte2() {
  Serial.println("Début decompte");
  matrix.fillScreen(0);
  for (int matriceIndex = 5; matriceIndex > 0; matriceIndex--) {
    allumerColonnesCouleurs(matriceIndex);
    Serial.print("N° index matrice "); Serial.println(matriceIndex);
    delay(1000); // Pause de 2 secondes entre les matrices
  }

  // Afficher "GO"
  Serial.println("Début GO");
  matrix.fillScreen(0);
  matrix.setTextColor(matrix.Color(0, 150, 0));
  matrix.setCursor(22, 0);
  matrix.print("GO");
  Serial.println("GO mémorisé");
  matrix.show();
  Serial.println("GO envoyé");
  delay(5000);

  matrix.fillScreen(0);
  matrix.show();
  Serial.println("fin décompte");
}

void allumerColonnesCouleurs(int matriceIndex) {
  int startIndexX = matriceIndex * 8; // Début de la matrice sur l'axe X
  for (int y = 0; y < 8; y++) {
    for (int x = 0; x < 4; x++) { // Colonnes 0 à 3 en rouge
      matrix.drawPixel(startIndexX + x, y, matrix.Color(255, 0, 0)); // Rouge
    }
    for (int x = 4; x < 8; x++) { // Colonnes 4 à 7 en bleu
      matrix.drawPixel(startIndexX + x, y, matrix.Color(0, 0, 255)); // Bleu
    }
  }
  matrix.show(); // Affiche les changements
}


le code avec Fast led:

#include <FastLED.h>
#include <SoftwareSerial.h>

// Configuration des LEDs
#define NUM_LEDS 448 // Nombre total de LEDs (7 matrices de 8x8)
#define DATA_PIN 3    // Broche où est connecté le signal des LEDs
CRGB leds[NUM_LEDS];

// Configuration Bluetooth
SoftwareSerial Bluetooth(8, 9); // RX, TX




void setup() {
  FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(20);
  FastLED.clear();
  FastLED.show();

  Serial.begin(9600);
  Bluetooth.begin(9600);

  Serial.println("Démarrage...");
}

void loop() {
  // Vérifier les commandes Bluetooth
  if (Bluetooth.available()) {
    char command = Bluetooth.read(); // Lire une commande
    handleBluetoothCommand(command);
  }
}

void handleBluetoothCommand(char command) {
  switch (command) {
    case 'R': // Commande pour allumer toutes les LEDs en rouge
      allumerToutesLesLEDs(CRGB::Red);
      break;

    case 'V': // Commande pour allumer toutes les LEDs en vert
      allumerToutesLesLEDs(CRGB::Green);
      break;

    case 'B': // Commande pour allumer toutes les LEDs en bleu
      allumerToutesLesLEDs(CRGB::Blue);
      break;

    case 'T': // Commande pour afficher un texte défilant
      afficherTexte("Bienvenue AMR33");
      break;

    case 'S': // Commande pour une séquence d'animation
      sequenceMatrices();
      break;

    default:
      Serial.print("Commande inconnue: ");
      Serial.println(command);
      break;
  }
}

void allumerToutesLesLEDs(CRGB couleur) {
  fill_solid(leds, NUM_LEDS, couleur);
  FastLED.show();
  delay(1000);
  FastLED.clear();
  FastLED.show();
}

void afficherTexte(const char* texte) {
  int largeurTexte = strlen(texte) * 8; // Largeur estimée du texte (8 pixels par caractère)
  int position = NUM_LEDS;             // Départ à droite de l'écran

  while (position > -largeurTexte) {
    FastLED.clear();

    for (int i = 0; texte[i] != '\0'; i++) {
      int lettreIndex = position + (i * 8);
      afficherLettre(lettreIndex, texte[i]);
    }

    FastLED.show();
    position--; // Déplacer vers la gauche
    delay(50);
  }
}

void afficherLettre(int position, char lettre) {
  // Fonction simplifiée pour afficher une lettre (à adapter selon votre matrice)
  // Exemple : écrire un pixel si la lettre est dans la zone visible
  if (position >= 0 && position < NUM_LEDS) {
    leds[position] = CRGB::Blue; // Une LED bleu comme exemple
  }
}

void sequenceMatrices() {
  for (int i = 5; i > 0; i--) { // Parcours des 7 matrices
    allumerMatrice(i, CRGB::Red); // Allumer une matrice en rouge
    delay(1000);
    //allumerMatrice(i, CRGB::Black); // Éteindre la matrice
  }
  for (int i = 0; i <8; i++){
  allumerMatrice(i, CRGB::Black); // Éteindre la matrice
  }
}

void allumerMatrice(int matriceIndex, CRGB couleur) {
  int startIndex = matriceIndex * 64;
  int mediumIndex = startIndex +56 ;// Chaque matrice a 64 LEDs
  int endIndex = startIndex + 64;

  for (int i = startIndex; i < mediumIndex; i++) {
    leds[i] = couleur;
  }
  for (int i = mediumIndex; i < endIndex; i++){
    leds[i] = CRGB::Black;
  }
  FastLED.show();
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.