Afficheur 7 segments 4 digits + Arduino

J’ai récemment commandé chez Sparkfun un afficheur LED 4 digits, 7 segments. C’est bien pratique quand il s’agit d’afficher le résultat d’une mesure sans avoir à compter sur la connection série vers le PC. J’ai décidé de réaliser le montage le plus simpole possible avec le programme qui l’opère le plus compact, et ce afin de faciliter sa compréhension et pouvoir le reproduire rapidement.

Le composant

Pour plus de détails, on retrouvera les informations du composant ici. Je ne donne ici que les informations importantes pour l’utiliser. Pour commencer, il s’agit d’un afficheur à cathode commune, ce qui signifie que les cathodes de différentes LED sont reliées entre elles. Il est opéré via 12 pins : 1 pin commun pour chaque digit (la cathode commune d’un groupe de 8 LEDS), et 1 pin commun pour chaque segment tout digit confondu (y compris le symbole point séparateur de décimale) : soit 4 + 8 = 12 pins C’est le choix du pin « digit » et du pin « segment » qui permet de décider quel segment sur quel pin va s’allumer.

On comprend alors bien que si l’on choisit un chiffre à afficher et qu’on active les 4 digits, on retrouvera 4 fois le même chiffre. Comment faire donc pour afficher des chiffres différents sur les 4 digits : en allumant et éteignant successivement les 4 digits tour à tour, et suffisamment rapidement pour qu’on ne s’en rende pas compte. C’est le travail de la librairie que l’on va utiliser.

Le montage

On manipule des LEDs, donc on les protège avec une résistance, ici choisie à 220 ohms (mais l’on pourrait descendre à 120 ohms), que l’on place à la cathode de chaque digit. On câble ensuite :

– en jaune chacun des digits en sortie des résistances
– en rouge les digits en sortie de l’afficheur
– en blanc les 8 types de segments (7 segments + le point)

Voici le tableau complet du câblage avec les conventions du composant:

20140502_SevSeg_pinout

Voici la photo de la réalisation:

20140502_SevSeg_wiring

Et voici le câblage plus lisible:

20140502_SevSeg_display

Reste maintenant à programmer l’Arduino pour afficher un nombre.

Le programme

Le programme suivant se base principalement sur une librairie facile d’utilisation que l’on trouve ici. En seulement deux commandes, elle permet de préparer le nombre à afficher et de l’afficher. Pour conserver l’affichage, il faut souvent appeler la méthode PrintOutput. Si trop d’opérations sont effectuées entre deux appels de PrintOutput, l’affichage clignotera sensiblement plutôt que de rester stable.

Enfin, on remarque l’appel à Begin et sa longue liste d’argument. Avec les conventions et le câblage ci-dessus, il sera parfaitement fonctionnel. Mais pour un câblage légèrement différent, il faudra penser à changer l’ordre des arguments.

24 commentaire sur “Afficheur 7 segments 4 digits + Arduino

  1. Bonjour.

    J’ai un problème avec mon afficheur. Quelque soit les valeur dans sevseg.NewNum(), mon afficheur affiche 6.6.6.6.
    Je pense à une erreur de branchement, mais où ?

    Merci,
    Paul

    1. Première étape: on isole l’arduino et on alimente l’afficheur directement via les résistances de protection.
      1 digit et 1 pin à la fois. On doit pouvoir allumer l’ensemble des « bâtonnets ».
      Seconde étape: on refait le branchement et on vérifie qu’il n’y a pas de contact entre les connections associées aux digits (ce qui causerait l’affichage du même chiffre partout)
      Dernière étape: on vérifie que l’appel à sevseg.PrintOutput() est suffisamment fréquent, sinon, en condition normale de lumière, une fréquence de rafraîchissement trop faible pourrait rendre peu visible les chiffres et faire croire à un 6.6.6.6. Vérifier en condition de faible luminosité si l’affichage montre tout de même 6.6.6.6. Sinon, diminuer les résistances pour donner un peu plus de jus à l’afficheur et rendre visible les chiffres.

      1. Une erreur s’est glissé sur le schéma je pense, un « Via R » apparrait sous un pin de segment (le B) au lieu du pin du digit (2).
        Probablement pas lié à cette « panne ».

  2. Merci pour cet exemple instructif.
    Après l’avoir testé, j’ai regardé la librairie et quelques instructions ont changé avec la nouvelle version:
    NewNum() devient setNumber()
    PrintOutput() devient refreshDisplay()
    et l’initialisation se fait par le biais de tableaux :
    byte numDigits = 4;
    byte digitPins[] = {2, 3, 4, 5};
    byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
    sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins); (b minuscule pour begin et plus majuscule comme avant).

    Si cela peut compléter utilement et aider d’autres personnes…

  3. Bonjour, déjà, merci de ton tuto qui m’a permis de comprendre(enfin) l’affectation des broches de mon afficheur. cependant, la compilation du code échoue et j’ai ce message d’erreur? que je ne parvient pas à interpréter correctement : sketch_nov05a.ino:3:20: fatal error: SevSeg.h: No such file or directory
    compilation terminated.
    help please !!

    1. Pour que le code fournit fonctionne, il faut récupérer la librairie SevSeg qui se trouve ici. Il faut ensuite la placer dans le même répertoire que le code ou dans le répertoire où l’IDE Arduino saura la trouver (voir les réglages de l’IDE ici).

  4. Bonjour,

    Je débute en Arduino et dans mon kit de départ, j’ai reçu ce type d’afficheur, j’ai vu comment il fonctionne et merci pour ton article simple qui m’a permis de découvrir cette bibliothèque pour contrôler l’afficheur.

    J’ai par contre une interrogation car je pensais devoir protéger chaque segment plutôt que le digit?
    Datasheet de mon afficheur

    N.B. : Je vais regarder le reste de ton blog en espérant y trouver d’autres belles choses. Bonne continuation.

    1. Je me réponds tout seul.. Après recherche, le fait de faire clignoter les segments pour afficher le digit avec la persistance de vision permet de ne pas avoir de problème de courant. J’en déduis que la librairie SevSeg utilise ce procédé..

  5. bonjour,
    je débute encore avec arduino et j’ai un problème: j’ai fait le câblage et le code mais je n’arrive pas à télécharger votre librairie, je suis sous la dernière version de mac avec arduino.
    Est-ce que qqn pourrait m’aider svp?
    merci d’avance

    1. Je viens de vérifier, la librairie SevSeg est bien encore accessible. Pour les problèmes liées à l’utilisation de librairies tierces, un bon point de départ est cette page. Sinon le forum arduino.cc est assez fourni en problème et résolution de ce type. Bon courage !

  6. Si comme PAUL vous n’obtenez pas le même résultat que dans l’exemple , changer :
    sevseg.Begin(0,0,1,2,3,4,5,6,7,8,9,10,11); par
    sevseg.Begin(1,0,1,2,3,4,5,6,7,8,9,10,11);
    car le premier « 0 » correspond a Anode commune(0) et vous avez peut être un afficheur à cathode commune(1).

    1. merci ! cathode commune
      mais mon afficheur sur un nombre fixe genre sevseg.NewNum(1234,0); sa affiche 1234
      help please !!

  7. Merci beaucoup pour votre publication, votre travail m’a fait gagné beaucoup de temps.
    Et merci aussi à la personne ayant indiqué le détail « anode commune » ou « cathode commune ».

  8. Très très bon tuto et surtout très pédagogique, j’essais de le modifier un peu pour créer un « kicker » soit un compteur de coup qui marcherai avec 2 BP (un reset, et un compteur ) mais je n’y arrive pas après de nombreux essais (parfois c’est une erreur de prog et d’autre fois mon compteur reste sur 0 ou 9999).
    si vous aviez une piste à me conseiller, merci d’avance et encore bravo pour votre site.

  9. Bonsoir, comment afficher simplement le mot « MARS » sur mon afficheur 4 digits cathode commune qui possède 12 broches ? me faut il une carte arduino ? avez vous un schéma ?
    Merci pour votre aide

  10. J’ai fait tout ce qu’y est expliquer ci dessus mais j’aimmerais avoir le code pour faire un timer simple avec le code ci dessus, malgrès mais diverses tentatives je n’y parviens pas ! Quelqu’un peut m’éder ?

  11. Hey, premièrement merci pour ton article ! J’ai une question, peut on afficher une valeur récupérer d’une base de données ? Merci d’avance de ta réponse

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *