Site icon AranaCorp

Utilisation d’un afficheur 4×7 segments avec Arduino

Afin d’obtenir des informations provenant de l’Arduino sans le brancher à l’ordinateur, il est courant d’utiliser une interface comme l’afficheur 4×7 segments. Nous allons voir dans ce tutoriel comment brancher et programmer l’Arduino afin de faire apparaitre des informations sur l’afficheur.

Il est possible de brancher directement l’afficheur 7 segments sur les broches de l’Arduino. Afin de conserver des broches libres pour d’autres fonctionnalités, nous utilisons un registre à décalages 74HC595.

Matériel

Principe de fonctionnement

Les afficheurs 7 segments consiste en une série de LED placé pour former des chiffres. Ces LEDS sont gérer via les broches de l’afficheur(1-12).

Les groupements de LED ou digits sont activés via les broches D1,D2,D3,D4 et les leds sont allumées via les broches A,B,C,D,E,F,G et DP pour le point décimal.

Il existe deux types d’afficheurs, avec cathode commune (série A en Haut) ou avec anode commune (série B en bas). Pour la série anode, il faut connecté le commun à 5V pour activer le digit et passer la broche à l’état BAS pour allumer une LED. Dans le cas d’une cathode commune, il faut connecter les communs à la masse et passer la broche à l’état HAUT pour allumer la LED.

Vérifiez bien le modèle que vous avez. Dans ce tutoriel, nous utilisons l’afficheur 4×7 segments 5461BS avec anode commune.

Schéma

Nous utilisons un registre à décalage 74HC595 dont nous connectons les sorties Q0-6 et Q7 aux entrées de l’afficheur A-F et DP respectivement.

Code

#define NUM_OF_DIGITS 4

int latch = 4; //74HC595  pin 9 STCP
int cs = 5; //74HC595  pin 10 SHCP
int data = 3; //74HC595  pin 8 DS
int dPins[4] = {11, 10, 9, 8};

//  DP G F E D C B A
//0: 1 1 0 0 0 0 0 0 0xc0
//1: 1 1 1 1 1 0 0 1 0xf9
//2: 1 0 1 0 0 1 0 0 0xa4
//3: 1 0 1 1 0 0 0 0 0xb0
//4: 1 0 0 1 1 0 0 1 0x99
//5: 1 0 0 1 0 0 1 0 0x92
//6: 1 0 0 0 0 0 1 0 0x82
//7: 1 1 1 1 1 0 0 0 0xf8
//8: 1 0 0 0 0 0 0 0 0x80
//9: 1 0 0 1 0 0 0 0 0x90
unsigned char table[] =
{0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

void setup() {
  Serial.begin(115200);
  pinMode(latch, OUTPUT);
  pinMode(cs, OUTPUT);
  pinMode(data, OUTPUT);
  for (int j = 0; j < NUM_OF_DIGITS; j++) pinMode(dPins[j], OUTPUT);
}

void loop() {
  //Count from 0 to 9 on each digit
  for (int i = 0; i < NUM_OF_DIGITS; i++) {
    for (int j = 0; j < 10; j++) {
      Display(i, j);
      delay(500);
      Serial.println(j);
    }
    delay(500);
  }
}

void Display(int id, unsigned char num)
{
  digitalWrite(latch, LOW);
  shiftOut(data, cs, MSBFIRST, table[num]);
  digitalWrite(latch, HIGH);
  for (int j = 0; j < NUM_OF_DIGITS; j++) digitalWrite(dPins[j], LOW);
  digitalWrite(dPins[id], HIGH);
}

Une fois le code téléversé, l’afficheur devrait compter de 0 à 9 sur chaque digit.

Bonus: Affichage sur les 4 digits

Afin d’afficher un nombre sur les 4 digits, nous allons convertir le nombre en 4 chiffre de base 10 en utilisant les instructions suivantes:

      number = k;
      for (int i = 0; i < NUM_OF_DIGITS; i++)
      {
        digit_data[i] = number % 10;
        number /= 10;
      }

Nous allons aussi utiliser la fonction millis() afin de s’assurer que l’affichage est rafrachit correctement.

#define NUM_OF_DIGITS 4

int latch = 4; //74HC595  pin 9 STCP
int cs = 5; //74HC595  pin 10 SHCP
int data = 3; //74HC595  pin 8 DS

int dPins[4] = {11, 10, 9, 8};

//  DP G F E D C B A
//0: 1 1 0 0 0 0 0 0 0xc0
//1: 1 1 1 1 1 0 0 1 0xf9
//2: 1 0 1 0 0 1 0 0 0xa4
//3: 1 0 1 1 0 0 0 0 0xb0
//4: 1 0 0 1 1 0 0 1 0x99
//5: 1 0 0 1 0 0 1 0 0x92
//6: 1 0 0 0 0 0 1 0 0x82
//7: 1 1 1 1 1 0 0 0 0xf8
//8: 1 0 0 0 0 0 0 0 0x80
//9: 1 0 0 1 0 0 0 0 0x90
unsigned char table[] =
{0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};


int digit_data[NUM_OF_DIGITS] = {0};

unsigned int number = 0;
unsigned long previousUpdate = 0, updateTime = 200;

void setup() {
  Serial.begin(115200);
  pinMode(latch, OUTPUT);
  pinMode(cs, OUTPUT);
  pinMode(data, OUTPUT);

  for (int j = 0; j < NUM_OF_DIGITS; j++) pinMode(dPins[j], OUTPUT);
}

void loop() {
  //Count from 0 to 999 on each digit
  unsigned int k = 0;
  while (k < 1000) {
    updateDigits();
    if (millis() - previousUpdate > updateTime) {
      k++;
      previousUpdate = millis();
      number = k;
      Serial.print(k); Serial.print(" (");
      for (int i = 0; i < NUM_OF_DIGITS; i++)
      {
        digit_data[i] = number % 10;
        number /= 10;
        Serial.print(digit_data[i]);
      }
      Serial.println(")");
    }
  }
}

void Display(int id, unsigned char num)
{
  digitalWrite(latch, LOW);
  shiftOut(data, cs, MSBFIRST, table[num]);
  digitalWrite(latch, HIGH);
  for (int j = 0; j < NUM_OF_DIGITS; j++) digitalWrite(dPins[j], LOW);
  digitalWrite(dPins[id], HIGH);
}

void updateDigits() {
  for (int j = 0; j < NUM_OF_DIGITS; j++)
  {
    Display(j, digit_data[j]);
    delay(5);
  }
}

Le nombre devrait s’incrémenter toutes les 200 millisecondes et s’afficher sur les 4 digits.

Sources

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Quitter la version mobile