Afficheur 8 chiffres à 7 segments - tutoriel Arduino

Utilisation de capteurs et composants électroniques avec Arduino.
Une fiche de tutoriel pour chaque.

Afficheur 8 chiffres à 7 segments - tutoriel Arduino

Messagepar tiptop » Mer 21 Aoû 2013 22:35

Afficheur 8 chiffres à 7 segments - tutoriel Arduino

Image

Composant utilisés

Principe de fonctionnement
Image.Image

Ce module comporte 8 chiffres lumineux (à 7 segments et point décimal), un clavier à 8 boutons (S1 à S8) et 8 LEDs à double couleur vert/rouge (LED1 à LED8).
Il est compatible avec Arduino et d'autres micro contrôleurs.

On peut enchaîner en série plusieurs de ces afficheurs, pour faire défiler du texte de l'un à l'autre, ou afficher de plus longs messages.

Il suffit de 3 ports IO pour piloter le module qui utilise une puce TM1638 (communication série). Le microcontrôleur a juste besoin d'envoyer ou de lire les données sur la mémoire RAM du module.

Câblage à réaliser
Image

Entrée Module (input) --> Arduino
  • 1 VCC --> +5V
  • 2 GND --> GND
  • 3 CLK --> pin d9
  • 4 DIO --> pin d8
  • 5 STB0 --> pin d7
  • 6 STB1 --> non utilisé ici, mais on peut en monter jusqu'à 6 en série
  • 7 STB2 --> pour les cascades de modules suivants
  • 8 STB2 -->
  • 9 STB4 -->
  • 10 STB5 -->

Image

Image

Librairie TM1638
Cette librairie pour Arduino est développée par Ricardo Batista : "A library for interacting an arduino with a TM1638 or a TM1640"
https://code.google.com/p/tm1638-library/

Elle supporte les modules reliés en chaîne, la lecture de boutons appuyés simultanément, les affichages de chiffres, de binaire ou de texte et le contrôle des LEDs.

Télécharger et inclure la librairie
#include <TM1638.h>

Pour l'utiliser, indiquer les broches utilisées (data 8, clock 9, strobe 7) sous la forme
Code: Tout sélectionner
TM1638 module(8, 9, 7);


Modules en série
Image

Image

Si on enchaîne plusieurs modules identiques, on les relie entre eux par un fils de liaison en nappe avec connecteur 10 broches (fourni).
Le câblage sur l'Arduino consiste à rajouter un seul fil par module supplémentaire dans la chaîne.
Code: Tout sélectionner
TM1638 module1(8, 9, 7);  //premier module, piloté par pin 7
TM1638 module2(8, 9, 6);  //second module, piloté par pin 6


La référence complète de la librairie : https://code.google.com/p/tm1638-librar ... OfContents

On la télécharge ici, c'est le fichier TM1638 Library v2.1.3.zip à extraire dans le dossier arduino/libraries de l'IDE Arduino.
https://code.google.com/p/tm1638-library/downloads/list

Exemple de code avec 1 afficheur

Code: Tout sélectionner
/*
Library examples for TM1638.

Copyright (C) 2011 Ricardo Batista <rjbatista at gmail dot com>

This program is free software: you can redistribute it and/or modify
it under the terms of the version 3 GNU General Public License as
published by the Free Software Foundation.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <TM1638.h>

// define a module on data pin 8, clock pin 9 and strobe pin 7
TM1638 module(8, 9, 7);

void setup() {
  // display a hexadecimal number and set the left 4 dots
  module.setDisplayToHexNumber(0x1234ABCD, 0xF0);
}

void loop() {
  byte keys = module.getButtons();

  // light the first 4 red LEDs and the last 4 green LEDs as the buttons are pressed
  module.setLEDs(((keys & 0xF0) << 8) | (keys & 0xF));
}


Exemple de code avec 2 afficheurs en série
Code: Tout sélectionner
/*
Library examples for TM1638.

Copyright (C) 2011 Ricardo Batista <rjbatista at gmail dot com>

This program is free software: you can redistribute it and/or modify
it under the terms of the version 3 GNU General Public License as
published by the Free Software Foundation.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "TM1638.h"

// hello segments for display
const byte hello[] = {
  0b00000000, 0b01110110, 0b01111001, 0b00111000, 0b00111000, 0b00111111, 0b00000000, 0b00000000
};

// define the first module
TM1638 module1(8, 9, 7);
// to chain modules, use the same clk and data - just specify a different strobe pin
TM1638 module2(8, 9, 6);

unsigned long value = 0L;
boolean state = true;

void setup()
{
  // display the hello segments on module 1
  module1.setDisplay(hello);   
  // display the hello segments on module 2
  module2.setDisplay(hello);   

  // light the lower 5 red LEDs and the top 5 green LEDs
  module1.setLEDs(0b00011111 | 0b11111000 << 8);

  // light the 3rd red LED
  module2.setLED(TM1638_COLOR_RED, 3);
  // light the 5th green LED
  module2.setLED(TM1638_COLOR_GREEN, 5);
  // light the 7th red and green LEDs
  module2.setLED(TM1638_COLOR_RED | TM1638_COLOR_GREEN, 7);
}

void loop()
{
  byte key1, key2;

  // read the buttons from the first module
  key1 = module1.getButtons();
  // read the buttons from the second module
  key2 = module2.getButtons();

  // both pressed
  if (key1 != 0 && key2 != 0) {
    value = 0;

   // set the display to 0 on both modules if they have buttons pressed simultaneously
    module1.setDisplayToHexNumber(value, 0b10101010);
    module2.setDisplayToDecNumber(value, 0b01010101);
  } else {
   // check the first module buttons
    if (key1 != 0) {
      // show the pressed buttons of the first module on its display
      module2.setDisplayToBinNumber(key1, 0);
      // and on the LEDs
      module1.setLEDs(key1);

     // check to see if it's the last button pressed
      if (key1 & 128) {
         // toggle the display state on/off
        state = !state;
        delay(200); // just wait for button up
      }

     // set the intensity and display state
      module1.setupDisplay(state, key1 >> 1);
    }

   // check the second module buttons
    if (key2 != 0) {
      // just add it to the display value
      value += key2;

      // display it as an hexadecimal on the first module
      module1.setDisplayToHexNumber(value, 0b10101010);
      // and as a decimal on the second module
      module2.setDisplayToDecNumber(value, 0b01010101);

     // light the LEDs
      module2.setLEDs(key2 << 8);
    }
  }
}


Données techniques sur le module

Image

Principe de codage des segments
Segments
Les 8 segments de gauche à droite sont aux positions paires de la mémoire : 2 4 6 8 A C E
Pour chaque digit, le bit7 correspond au point décimal (virgule), les bits 0-6 correspondent aux segments a-g

LEDS
Les 8 LEDs témoins sont aux positions de la mémoire 1 3 5 7 9 B D F, un octet contrôle chaque led individuellement.
bit0 pour allumer la led en rouge
bit1 pour allumer la led en vert
bit0 et bit 1 pour allumer la led en rouge+vert (= orange)

Clavier
Le clavier complet à 8 touches, il est lu sur 4 octets.
Les quatre premières touches correspondant au bit le moins significatif (bit 0) des quatre octets lus.
Les quatre dernières touches correspondent à bit 3 du même octet.

Exemples d'utilisation

Affichage de chiffres (on peut afficher 0-9 et A-E en mode hexadécimal)
Afficher 98765432 et les 4 points décimaux de gauche :

Code: Tout sélectionner
module.setDisplayToHexNumber(0x98765432, 0xF0);


Afficher un texte avec un point ensuite

Image

Code: Tout sélectionner
String name = " Tiptop ";
 module.setDisplayToString(name, 0b00000010);


Eclairer une des LED
void setLED(byte color, byte pos);
couleur 0=éteint 1=vert 2=rouge 3=orange
position 0 à 7 de gauche à droite

Code: Tout sélectionner
    module.setLED(2, 3);  //4eme led allumée en rouge
    module.setLED(1, 4);  //5eme en vert
    module.setLED(3, 5);  //6eme en orange


Exemple de chenillard à 8 leds tricolores

Code: Tout sélectionner
 //== Chenillard de 8 leds tricolores
  int duree = 250;  //250 ms entre changements
for (  byte NumLed=0; NumLed<8; NumLed++)
{  //led défilant de gauche à droite
  module.setLED(1,NumLed);  //vert
  //Serial.println(NumLed);
  delay(duree);
  module.setLED(2,NumLed);  //passe en rouge
  delay(duree);
  module.setLED(3,NumLed);  //passe en orange
  delay(duree);
  module.setLED(0,NumLed);  //puis éteindre


Allumer plusieurs LEDs à la fois.
void setLEDs(word led);

MSB pour les LEDs à éclairer en vert, LSB pour celles à éclairer en rouge.

Code: Tout sélectionner
module.setLEDs(0x00FF);  //Tout allumer en vert
module.setLEDs(0xFF00); //Tout allumer en rouge
module.setLEDs(0xFFFF);  //Tout allumer en orange


Surveiller les boutons appuyés
De gauche à droite
Code: Tout sélectionner
byte getButtons();


Cette expression est vraie si on appuie le bouton de gauche
Code: Tout sélectionner
module.getButtons() == 0b00000001


Cette expression est vraie si on appuie le bouton de droite
Code: Tout sélectionner
module.getButtons() == 0b10000000


L'expression est vraie si on appuie les 2 boutons du milieu
Code: Tout sélectionner
module.getButtons() == 0b00011000


Exemple de lecture de boutons

Code: Tout sélectionner
 // lire les boutons, on récupère 1 2 4 8 16 32 64 128 selon le bouton appuyé
 byte appui;
 appui = module.getButtons();
  Serial.println(appui);


Afficher un message erreur
Code: Tout sélectionner
 module.setDisplayToError();


Afficher un nombre
Le point décimal est sous la forme 1 2 4 8 ... de droite à gauche
Mettre false pour ne pas afficher les zéros devant

Code: Tout sélectionner
 module.setDisplayToDecNumber(i, 8,true); 


Exemple de compteur de 0 à 10 000 qui défile rapidement

Code: Tout sélectionner
 //=== Compteur de 0 à 10000 qui défile rapidement
 for (unsigned long i=0;i<=10000;i++)
  {  //ne pas afficher les zéros devant
   module.setDisplayToDecNumber(i,0, false);  //Compteur sans point decimal 
  }


Vitesse d'affichage
J'ai chronométré une durée de 33101 ms pour 10 000 affichages soit 3.3 ms par rafraîchissement de l'affichage.

Références
Librairie TM1638 et ses différentes fonctions
https://code.google.com/p/tm1638-librar ... OfContents

Tutoriel en espagnol avec données techniques
http://dqsoft.blogspot.fr/2012/11/displ ... rte-2.html
tiptopboards - admin
Avatar de l’utilisateur
tiptop
Administrateur du site
 
Messages: 93
Inscription: Mar 13 Aoû 2013 20:38
Localisation: 38

Retourner vers Capteurs et composants

Qui est en ligne

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