Afficheur 7 segments MAX7219 avec Arduino

Faire défiler un texte sur l’afficheur

Dans les paragraphes précédents, nous avons parcouru les principales méthodes de pilotage d’un afficheur 7 segments MAX7219 avec Arduino. Pour aller un plus loin, je partage avec vous le code logiciel permettant de faire défiler un texte à l’écran.

Le code logiciel de ce défilement repose sur deux principes:

  • Le message affiché est décalé d’1 cran sur la gauche toutes les 500ms.
  • La fin du message est raccordée avec son début afin de produire un effet de rotation de l’affichage.

Dans cet exemple le message affiché est « 1 2 3 … COUCOU JE SUIS LA  » . J’avoue j’étais en manque d’inspiration.

Les principales évolutions du code logiciel par rapport à ce que nous avons vu précédemment sont d’ordre algorithmique. Aussi je vous livre directement sans trop entrer dans les détails le code documenté:

// Déclaration des librairies utilisées
#include "LedControl.h" // Bibliothèque de gestion de l'afficheur MAX7219 7 segments

// Déclaration des fichiers du projet à inclure
#include "Caracteres7Segments.h"

// Constantes globales
#define AFFICHAGE_INTERVAL_DEFILEMENT 500

// Déclarations globales
LedControl afficheur_g=LedControl(11/*Broche DIN - Jaune*/, 12/*Broche CLK - Bleu*/, 10/*Broche CS - Vert*/); // Initialisation du contrôleur de l'afficheur 7 segments
unsigned long heure_affichage_g = 0;

void memoriser_heure_affichage()
{
    heure_affichage_g = millis();
}

bool temps_ecoule_depuis_affichage(unsigned long duree_p)
{
    bool retour_l = false;

    if((millis() - heure_affichage_g) >= duree_p)
    {
        retour_l = true;
    }
    return(retour_l);
}

void afficher_avec_defilement(char *message_p)
{
    static int index_affichage_l=0;
    char caractere_l;

    if(temps_ecoule_depuis_affichage(AFFICHAGE_INTERVAL_DEFILEMENT)) // L'intervalle de temps entre 2 affichages est-il écoulé ?
    {  
        afficheur_g.clearDisplay(0); 
        for(int ii_l=0;ii_l<8;ii_l++)
        {
            if ((index_affichage_l+ii_l)<strlen(message_p))
            {
                caractere_l = message_p[index_affichage_l+ii_l];
            }
            else
            {
                // Nous sommes à la fin de l'affichage du message, il est nécessaire d'afficher le début sur l'espace disponible
                caractere_l = message_p[(index_affichage_l+ii_l)-strlen(message_p)];
            }
            afficheur_g.setRow(0,7-ii_l,pgm_read_byte(&tab_caracteres7_segments[caractere_l]));
        }
        if(index_affichage_l<(strlen(message_p)+8)) // Le message a-t-il entièrement défilé sur l'écran ?
        {
            // Non le message n'a pas entièrement défilé sur l'écran
            index_affichage_l++;
        }
        else
        {
            // Oui le message a entièrement défilé sur l'écran, on réassigne donc l'index d'affichage
            index_affichage_l=9;
        }
        memoriser_heure_affichage();
    }
}

// Fonction de démarrage, s'exécute une seule fois:
void setup()
{
    afficheur_g.shutdown(0,false); // Allume l'afficheur
    afficheur_g.setIntensity(0,15); // Définit la luminosité (valeur de 0 à 15)
}

// Fonction principale du programme, s'exécute en boucle:
void loop()
{
    afficher_avec_defilement("1 2 3 ... COUCOU JE SUIS LA   ");  
}

Et voilà le résultat:

Si cet article vous a plus ou bien si vous avez des suggestions, n’hésitez pas à me laisser un commentaire !

Laisser un commentaire