[TUTORIEL] Afficheur 7 segments

Informations et questions sur les composants tiers de la boutique (émetteur/récepteur RF, capteurs...)

[TUTORIEL] Afficheur 7 segments

Message non lude Laetitia » Mer 27 Mar 2013 14:56

Bonjour,

Voici un exemple d'utilisation d'un afficheur 7 segments : un compteur d'impulsions.
A chaque appui sur un bouton poussoir on incrémente la valeur du compteur et on envoie le résultat sur l'afficheur 7 segments. Rien de bien compliqué au niveau des données qui rentrent mais ça va nous permettre de nous concentrer sur l'afficheur ;)
Tout d'abord, pour le brochage de l'afficheur, je vous invite à aller lire la documentation disponible sur le forum, pour le reste, c'est en dessous !

- MATÉRIEL -

- Arduino Uno (x1)
- Afficheur 7 segments (x1)
- Bouton poussoir (x1)
- Résistance 10 kOhms (x1)

- SCHÉMA DU MONTAGE -

compteur_aff7seg_schéma.png
compteur_aff7seg_schéma.png (55.01 Kio) Vu 3447 fois


Pour rappel :
pinout_aff7seg.png
pinout_aff7seg.png (11.02 Kio) Vu 3447 fois

:!: Ici nous avons un afficheur à anode commune, si vous en avez un à cathode commune il faut modifier le montage : toutes les broches reliées au +5V doivent aller à la masse (GND) et il faut mettre des résistances de 150 Ohms entre les broches de l'Arduino et celles de votre afficheur. Il y a également une légère modification à apporter au code (voir ci-dessous). Vous aurez aussi remarqué que nous alimentons l'afficheur avec du 3.3V depuis l'Arduino : si vous souhaitez l'alimenter en 5V il vous faudra ajouter des résistances de 150 Ohms entre les pins de votre afficheur et celles de l'Arduino !

- CODE -

Code: Tout sélectionner
/*
 * Compteur d'impulsions modulo 10 avec afficheur 7 segments
 */

// Bouton poussoir relié à pin D13 de l'Arduino
#define bouton 13

// déclaration des constantes liées au bouton
int compte = 0;
int etatBouton = LOW;
int etatPrecedent = LOW;

// Définition des segments à allumer pour l'affichage des chiffres :
// Seuls la barre centrale "G" et le point décimal sont éteints pour afficher 0, etc.
const byte nombre[10] =
{
 //ABCDEFG° 
  B11111100, // 0
  B01100000, // 1
  B11011010, // 2
  B11110010, // 3
  B01100110, // 4
  B10110110, // 5
  B10111110, // 6
  B11100000, // 7
  B11111110, // 8
  B11110110, // 9
};

// Tableau pour stocker les pins reliées aux segments (°, G, F, E, D, C, B, A)
// segments[0] correspond au bit de poids faible (LSB), ci-dessus il s'agit du point décimal
// donc on fait la déclaration dans l'ordre inverse
const int segments[8] = {5, 9, 8, 7, 6, 4, 3, 2};

void setup()
{
  pinMode(bouton, INPUT);
 
  // optimisation du setup grâce à une boucle for pour éviter les multiples pinMode() et digitalWrite();
  for (int i=0; i<8; i++)
  {
    pinMode(segments[i], OUTPUT);
    digitalWrite(segments[i], HIGH);
  }
}

void loop()
{
  etatBouton = digitalRead(bouton);
  // si l'état du bouton a changé
  if (etatBouton != etatPrecedent)
  {
    // et qu'il est haut (= on appuie dessus)
    if (etatBouton == HIGH)
    {
      // on incrémente le compteur
      compte++;
      // sauf s'il a dépassé 9...
      if (compte > 9)
      {
        // ...auquel cas on le réinitialise
        compte = 0;
      }
    }
  }
  // on affiche le nombre souhaité
  affichage(compte);
  // et on stocke l'atat du bouton pour le prochain tour
  etatPrecedent = etatBouton;
}

void affichage(int chiffre)
{
  // variable servant à stocker l'état des différents segments
  boolean segState;
 
  for (int seg = 0; seg < 8; seg++)
  {
    // lecture des bytes pour déterminer l'état des segments
    segState = bitRead(nombre[chiffre], seg);
    // inversion (afficheur à anode commune uniquement)
    segState = !segState;
    // affichage
    digitalWrite(segments[seg], segState);
  }
}


- EXPLICATIONS -

On cherche à savoir quels segments allumer pour chacun des chiffres. Or nous avons défini des bytes (un byte = un "mot" de 8 bits) correspondant à l'état des segments pour chacun des chiffres que l'on veut afficher.
Nous utilisons donc la fonction bitRead(x, n), avec x = variable à étudier, n = quel bit lire. Cette fonction renvoie un "0" ou un "1" selon la valeur du bit sélectionné. En utilisant une boucle for(), on lit successivement tous les bits du premier (point décimal) au dernier (segment G). On peut donc remonter les différents états dans lesquels doivent être les différents segments, il ne nous reste plus qu'à les afficher !

:!: On inverse ici l'état de la variable booléenne car on a un afficheur à anode commune (pins actives à l'état LOW), il vous faudra supprimer cette ligne si vous utilisez un afficheur à cathode commune.

Note : le point décimal n'étant pas utilisé dans ce sketch, on aurait pu initialiser la boucle for() avec seg=1 pour ne pas le prendre en compte dans la lecture des bits, en économisant du temps de calcul ;)

- VIDÉO -



C'est tout pour cette fois ! J'espère que ce tutoriel vous aura plu, et bonne bidouille en attendant le prochain !
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 291
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Retourner vers Composants tiers

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron