problème avec une matrice LED DMD

Bonjour,

J'ai besoin d'aide pour réaliser un projet d'afficheur de numéro de personne.

Pour cela j'utilise des bouton poussoir Grove qui me permettent d'augmenter, de diminuer ou de remettre à zéro un variable que j'ai appelé numero. Pour le moment j'ai aussi mis un écran LCD Grove pour vérifier que la variable change bien.

Je souhaiterais afficher cette variable sur une matrice LED VMA419 avec les bibliothèque fourni avec ( "DMD419.h" et "TimerOne.h")

J'arrive a afficher un texte en statique mais malheureusement je n'arrive pas à trouver le code qui me permet d'afficher une variable. En effet au lieu de m'afficher la variable, la matrice LED m'affiche une flèche.

Je vous joins mon programme. ATTENTION JE SUIS DEBUTANT, alors je suis désolé si mon programme à l'air brouillon.

Merci pour votre aide.

 #include "SPI.h"
#include "DMD419.h"     //Librairie pour la matrice LED VMA419
#include "TimerOne.h"   //Librairie pour la matrice LED VMA419
#include "Arial_black_16.h"<arial_black_16.h>   //Librairie de la police Arial utile pour la matrice LED
#include "SystemFont5x7.h"    //Librairie de la police 5x7 utile pour la matrice LED
#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include "rgb_lcd.h"    //Librairie pour l'écran LCD Grove RGB

#define DISPLAYS_ACROSS 1
#define DISPLAYS_DOWN 1
/* change these values if you have more than one DMD connected */

int numero;
rgb_lcd rgbLcd;

DMD419 dmd(DISPLAYS_ACROSS,DISPLAYS_DOWN);
void ScanDMD()
{
 dmd.scanDisplayBySPI();
}

void setup() {
  //ci-dessous le code indiqué pour faire fonctionner la matrice LED 
      Timer1.initialize( 500 );
/*period in microseconds to call ScanDMD. Anything longer than 5000 (5ms)
and you can see flicker.*/

      Timer1.attachInterrupt( ScanDMD );
/*attach the Timer1 interrupt to ScanDMD which goes to
dmd.scanDisplayBySPI()*/

      dmd.clearScreen( true );
/* true is normal (all pixels off), false is negative (all pixels on) */
      
      rgbLcd.begin(16,2);   //initialisation de l'écran LCD grove
      numero = 0;
      rgbLcd.clear();
    
    pinMode(2,INPUT);   //initialisation du bouton poussoir 1 permettant d'augmenter de 1 la variable numero
    pinMode(3,INPUT);   //initialisation du bouton poussoir 2 permettant de diminuer de 1 la variable numero
    pinMode(4,INPUT);   //initialisation du bouton poussoir 3 permettant de remettre à 0 la variable numero
    dmd.selectFont(SystemFont5x7);
    dmd.drawString( 4,0, "Num:", 5, GRAPHICS_NORMAL );    //Affichage sur la première ligne de la matrice du mot num en statique
}

void loop() {
   
    if(((digitalRead(2))==(1))){
        _delay(0.5);
        numero += 1;
    }
    if(((digitalRead(3))==(1))){
        _delay(0.5);
        numero += -1;
    }
    if(((digitalRead(4))==(1))){
        _delay(0.5);
        numero = 0;
    }
    _delay(0.1);
    dmd.drawString( 7,9, numero, 5, GRAPHICS_NORMAL );
    rgbLcd.clear();
    rgbLcd.setCursor(0,0);
    rgbLcd.print("numero :");   //affichage de la variable sur l'ecran LCD grove
    rgbLcd.setCursor(2,1);    //affichage de la variable sur la matrice LED. Malheureusement cela ne fonctionne pas et affiche une flèche
    rgbLcd.print(numero);
    _loop();
}

void _delay(float seconds){
    long endTime = millis() + seconds * 1000;
    while(millis() < endTime)_loop();
}

void _loop(){
    
}

En jetant un l'œil sur la bibliothèque DMA719 il semble qu'elle ne puisse afficher que du texte, soit un char soit une chaîne de caractères.

Donc pour afficher une variable, il faut construire une chaîne contenant cette variable. La fonction sprintf est ton amie.

Supposons que tu veuilles écrire la valeur de numéro qui est un int. Tu crées une chaîne, puis tu écris dedans et tu affiches la chaîne avec drawString

char* chaine ;
sprintf (chaine, "numero = %d") ;
dmd.drawString( 4,0, chaine, 5, GRAPHICS_NORMAL );

Si ça ne fonctionne pas, il faut peut-être donner une taille à la chaîne, assez grande pour contenir le message à afficher.

char chaine [16];

A tester...

char* chainecette déclaration déclare un pointeur sur une chaine mais il n'y a aucune déclaration de taille pour la chaine en question donc aucune zone mémoire réservée et tu dois écraser des variables vitales pour ton code.

Le plus simple c'est définir

char chaine[16];

16 est une valeur au hasard et devra éventuellement être adapté à la longueur maximale que va prendre ton numéro (+1 pour stocker le terminateur de chaine)

Merci beaucoup à vous deux,

grâce à vous et à quelques toutes petites modification, je viens enfin de réussir à faire fonctionner correctement mon programme.