Afficheur 7 segments MAX7219 avec Arduino
Cet article détaille le pilotage par Arduino d’un afficheur 7 segments équipé du circuit intégré MAX7219. Vous y apprendrez également à définir vos propres caractères et à faire défiler un message.
J’ai récemment réalisé l’électronique d’un flipper avec un Arduino UNO pour un passionné. Dans les années 90, les flippers étaient présents dans presque tous les cafés. Pour conserver l’effet « rétro » nous avons choisi d’utiliser un afficheur 7 segments MAX7219. C’est l’occasion de rédiger un article sur son utilisation.
L’afficheur 7 segments choisi intègre 1 puce MAX7219 et 2 afficheurs « basiques » 3461AS:
- L’afficheur « basique » 3461AS, fabriqué par l’entreprise XLITX, est un afficheur 7 segments de 4 chiffres (fiche technique).
- Le circuit intégré MAX7219 de l’entreprise Maxim (aujourd’hui Analog Devices) simplifie le pilotage d’afficheurs 7 segments. Il offre une interface série de 3 fils au microcontrôleur (Arduino dans notre cas) et permet de piloter jusqu’à 8 chiffres (soit 2 afficheurs 3461AS). Pour plus de détail, voici la fiche technique.
Le matériel nécessaire
Pour cette réalisation, vous avez besoin:
Câblage de l’afficheur 7 segments MAX7219 avec la carte Arduino
Le circuit intégré MAX7219 (et donc la carte d’affichage) offre une interface SPI unidirectionnelle permettant la transmission des informations à afficher:
- La broche DIN est reliée à la sortie 11 de l’Arduino. C’est par cette connexion que l’Arduino transmet ses données au MAX7219.
- La broche CS est reliée à la sortie 10 de l’Arduino. Elle permet à ce dernier de signaler au MAX7219 que les données actuellement émises sont à prendre en compte.
- La broche CLK est reliée à la sortie 12 de l’Arduino. C’est le signal d’horloge qui va permet au MAX7219 d’être synchronisé avec le microcontrôleur.
Pour l’alimentation de l’afficheur vous reliez:
- La broche VCC de l’écran au 5V de l’Arduino.
- Les deux masses ensemble (GND).

Bibliothèque de gestion de l’afficheur 7 segments MAX7219
Je vous invite à installer la bibliothèque nommée « LedControl by Eberhard Fahle » dans votre environnement de développement Arduino. Cette bibliothèque LedControl simplifie l’utilisation des afficheurs à base de circuits intégrés MAX7219 et MAX7221.
Si vous souhaitez connaitre la procédure d’installation d’une bibliothèque sous Arduino, je vous invite à vous reporter au chapitre « Installation d’une bibliothèque pour l’écran OLED » de l’article « Température et humidité avec Arduino ».
Le code logiciel
Pour construire le code logiciel de ce projet nous allons passer par 3 étapes:
- Afficher un compteur numérique (lien).
- Définir des caractères (page 2).
- Faire défiler un texte sur l’afficheur (page 3).
Afficher un compteur numérique
Cette première partie est une découverte du pilotage de l’afficheur 7 segments MAX7219 sous Arduino. Elle consiste en l’écriture du code logiciel d’un compteur numérique.
Comme d’habitude, nous démarrons par l’ossature de code Arduino suivante:
// Fonction de démarrage, s'exécute une seule fois: void setup() { } // Fonction principale du programme, s'exécute en boucle: void loop() { }
Puis nous indiquons au compilateur l’utilisation de la bibliothèque LedControl par la ligne :
// Déclaration des bibliothèques utilisées #include "LedControl.h"
Si vous le souhaitez, les informations d’utilisation de la bibliothèque « LedControl » sont disponibles à ce lien.
Pour initialiser cette bibliothèque, nous appelons le constructeur « LedControl() » en lui indiquant en paramètres les ports d’entré/sortie utilisés pour le câblage:
// 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
Ensuite, dans la fonction « setup« , nous allumons l’écran à l’aide de la méthode « shutdown() » qui fait sortir l’afficheur du mode veille. Le réglage de la luminosité des DEL se réalise à l’aide de la méthode « setIntensity() ».
Les méthodes « shutdown » et « setIntensity », comme toutes les méthodes de l’objet « LedControl », prennent pour 1er paramètre le numéro d’afficheur 7 segments MAX7219 ou MAX7221. Dans cet article, ce paramètre est toujours à la valeur 0 car nous n’utilisons qu’un afficheur 7 segments MAX7219 pour notre projet:
// Fonction de démarrage, s'exécute une seule fois: void setup() { afficheur_g.shutdown(0,false); // Allume l'afficheur afficheur_g.setIntensity(0,7); // Définit la luminosité (valeur de 0 à 15) }
L’afficheur 7 segments MAX7219 de ce projet possède 8 chiffres. Un entier non-signé de 32 bits est donc suffisant pour stocker la valeur de notre compteur.
Concernant le déroulement du programme le compteur va démarrer à 0, s’incrémenter jusqu’à son maximum ‘99999999’, puis redémarrer à partir de 0.
Nous pouvons partir de la fonction « loop » suivante avant d’ajouter les appels au méthodes de gestion de l’afficheur:
// Fonction principale du programme, s'exécute en boucle: void loop() { static uint32_t compteur_l = 0; if(compteur_l==99999999) { compteur_l=0; } else { compteur_l++; } }
Cette fonction « loop() » va d’abord être complétée par la méthode « clearDisplay() » pour effacer l’écran:
afficheur_g.clearDisplay(0); // On efface l'écran
Affin de nous permettre de visualiser la valeur inscrite sur l’afficheur, nous ajoutons une attente de 200ms à l’intérieur de notre boucle:
delay(200); // 200ms pour visualiser la valeur affichée
Concernant l’affichage en lui même, Il est important de comprendre que la bibliothèque « LedControl » ne permet pas de piloter l’afficheur dans son ensemble mais seulement 1 chiffre de l’afficheur. Nous devons donc isoler chaque chiffre du compteur « compteur_l » avant l’affichage. Pour réaliser cette décomposition, nous utilisons la division par 10 et l’opérateur « % » qui permet d’obtenir le reste d’une division entière.
Pour l’affichage de chaque chiffre, nous utilisons la méthode « setDigit() » qui prend pour paramètres:
- Le numéro d’afficheur.
- L’index du chiffre de l’afficheur concerné (0 à 7 dans notre cas).
- La valeur numérique à afficher.
La fonction « loop » devient alors:
// Fonction principale du programme, s'exécute en boucle: void loop() { static uint32_t compteur_l = 0; uint32_t valeur_tampon_l; afficheur_g.clearDisplay(0); // On efface l'écran valeur_tampon_l = compteur_l; for(int ii_l=0; ii_l<8; ii_l++) { afficheur_g.setDigit(0, ii_l, valeur_tampon_l % 10, false); valeur_tampon_l = valeur_tampon_l / 10; } if(compteur_l==99999999) { compteur_l=0; } else { compteur_l++; } delay(200); // 200ms pour visualiser la valeur affichée }
C’est le moment de tester ! Je vous invite à compiler votre programme puis à le transférer dans l’Arduino. Vous observerez le résultat suivant:
Qu’en pensez-vous ?
- Mon avis est que les « zéros » affichés à gauche du nombre sont inutiles et rendent difficile la lecture.
- J’aimerai également ajouter un effet de clignotement sur certaines valeurs clef (par exemple les centaines) pour rendre notre compteur plus « vivant ».
Pour la suppression des « zéros » inutiles, il suffit de modifier la boucle « for() » afin de stopper l’affichage dès que l’ensemble des chiffres significatifs a été affiché. Pour cela, remplacez les conditions de la boucle « for() » par:
for(int ii_l=0; (ii_l<8)&&(valeur_tampon_l!=0); ii_l++)
Concernant le clignotement, celui-ci va être réalisé par coupure de l’affichage puis le ré-allumage à deux reprises, à l’aide de la méthode « shutdown() »:
switch(compteur_l%100) // L'afficheur est éteint à 99, ré-allumé à 100, ré-éteint à 101 et ré-allumé à 102 { case 99: case 01: afficheur_g.shutdown(0,true); // Eteint l'afficheur break; case 00: case 02: afficheur_g.shutdown(0,false); // Allume l'afficheur break; }
Maintenant que l’afficheur numérique est terminé, je vous invite à passer à la prochaine étape pour découvrir comment définir vos propres caractères (page suivante).
Salut Nico et merci pour ce post bien utile, serait-il possible d’avoir également ton code Arduino pour Flipper sur ce type d’afficheur, je suis en train de m’en faire un et je suis à la recherche de modèles de code. Merci encore et bonne année 2021 !
Pierre
Bonjour Pierre,
Tout d’abord, je te remercie pour ton commentaire.
L’électronique de flipper dont je parle dans cet article est un programme plutôt complexe pour être détaillé dans ce blog. Cette réalisation inclue des composant supplémentaires : des cartes d’extension MCP23017 ainsi que des switchs pour les cibles et les couloirs.
Cela fait partie des prestations facturées que je propose. (Si tu es intéressé par ces prestations, je te laisse me contacter directement ici : https://tropratik.fr/contact).
Bonjour,
Ecoutez, je n’ai qu’un mot à dire : « Génial »
Tout est bien explicite, clair et imagé.
J’ai lu tous vos articles (et j’ai commandé les accessoires nécessaires. Il me tarde de les recevoir (Commandé sur AliExpress délai très long malheureusement) pour mettre en pratique vos expèrience.
Merci à vous pour ce travail.
Cordialement Guy
Merci pour les encouragement Guy.
Afin de soutenir le site (frais d’hébergement, matériel et temps passé), n’hésitez pas à commander sur la boutique https://tropratik.fr/boutique.
De plus l’ensemble des produits de la boutique est stocké en France et expédiés en moins de 24h.
« La broche CLK est reliée à la sortie 12 de l’Arduino » ; oh que NON , CLK est la BROCHE 13 ; çà ne marchera jamais si CLK=12 …mais bon
Bonjour Joël,
je vous laisse faire l’essai, ce montage fonctionne parfaitement.
L’Arduino Uno possède une ressource matérielle dédiée pour le bus SPI, cependant les caractéristiques de l’afficheur 7 segments MAX7219 ne justifient pas la nécessité de l’utiliser.
Dans ce tutoriel nous avons choisi la librairie “LedControl by Eberhard Fahle” qui utilise des ressources logicielles, ce qui laisse la souplesse de faire son propre choix des broches SPI à utiliser.
Vous pouvez le vérifier en étudiant son code logiciel disponible ici.
Libre à vous de changer le brochage si vous le souhaitez. Il suffit simplement de changer les paramètres du constructeur LedControl.