Composant utilisés
- 1 module afficheur 8 chiffres à 7 segments avec leds et boutons .
- 1 carte Arduino Uno
- Fils de câblage Femelle/Femelle
- 1 barrette à broches
Principe de fonctionnement
.
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
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 -->
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
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
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
- 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