Pour la partie programme, c'est relativement simple, mais on va utiliser des astuces pour minimiser le programme et en faire un afficheur générique, tout à fait utilisable dans tout un tas de projets.
DÉCLARATIONS
// DÉCLARATIONS
// pour allumer un segment il faut positionner l'anode commune de l'afficheur à 1 et la cathode du segment à 0.
// une résistance de 330 ohms est insérée entre la broche de l'arduino et le segment pour une limitation du courant à 10ma.
const byte SEG[8]={1,5,8,9,3,0,2,7};
// déclare un tableau de 8 constantes de broches segments (G,F,E,D,C,B,A,dp) les poids forts sont à droite
const byte AFF[4]={11,10,19,18};
// déclare un tableau de 4 constantes des broches afficheurs - ANODES
// --- tableau des valeurs numériques en segments ---
const byte CODE[10]={126,48,109,121,51,91,31,112,127,115};
// 0 1 2 3 4 5 6 7 8 9
// les 10 chiffres de (base en décimal) (ex.: 7 == segments "A,B,C" == 01110000 = 64+32+16=112)
La déclaration du tableau "CODE" mérite peut-être quelques éclaircissements.
Si vous maîtrisez le binaire vous avez le droit de passer le chapitre qui suit.
petit rappel sur le binaire
L'idée est d'affecter un bit à chaque segment. Ça tombe bien nous avons 7+1 segments, ce qui nous fait tout juste 1 octet (byte).
nous donnons de manière arbitraire (enfin, pas tout à fait !), un bit pour chaque segment : ["dp"ABCDEFG] avec les poids faibles à droite.
Donc le segment G "pèse" 0 ou 1(10), le segment F "pèse" 0 ou 2(10), le segment E "pèse" 0 ou 4(10), etc...
Si un segment est utilisé, on le met à 1(binaire) sinon à 0(binaire). En fonction de sa place dans l'octet, son poids est ajouté à la somme total.
exemples : le chiffre "7" == segments "A,B,C" == 01110000(2) = 64+32+16(10) = 112(10)
le chiffre "4" == segm. "B,C,F,G" == 01100110(2) = 32+16+2+1 = 51(10)
Vous retrouverez toutes les valeurs dans le tableau "CODE".
Il nous reste à trouver une commande Arduino, capable d'extraire les bits de l'octet de codage, elle existe, c'est :
bitRead( octet , positionDuBit )
Une boucle de 0 à 7 suffira à "lire" l'octet que l'on récupérera dans la table "CODE[chiffre]".
Concernant le "dp", il suffira d'ajouter +128 à notre valeur renvoyée par "CODE[chiffre]".
Le programme est optimisé.
Fin de la digression... Vous pouvez reprendre la lecture à partir de là >
INITIALISATION
void setup() {
// met les 8 broches des segments en sortie à 1 (éteint)
for (int i=0; i<8; i++) { // boucle de défilement des 8 broches
pinMode(SEG[i], OUTPUT); //met la broche en sortie
digitalWrite(SEG[i],1);
}
// met les 4 broches des afficheurs en sortie à 0 (éteint)
for (int i=0; i<4; i++) { // boucle de défilement des 4 broches
pinMode(AFF[i], OUTPUT); //met la broche en sortie
digitalWrite(AFF[i],0);
}
}
FONCTION D'AFFICHAGE
void affichage(byte mot[4]) {
for (byte af = 0; af <= 3; af++) { // balayage des 4 afficheurs
digitalWrite(AFF[af],1); // activation des afficheurs à leur tour
for (byte sg = 0; sg <8; sg++) { // balayage des 8 segments
// "mot" contient les 4 caractères à afficher. On récupère dans CODE la séquence des segments à afficher
// attention les bits sont inversés, c'est un 0 qui allume le segment, d'où le "!"
digitalWrite(SEG[sg],!bitRead(CODE[mot[af]],sg)); // Voilà, tout le secret est ici !
// EXPLICATION : le chiffre contenu dans "mot[n]", indexe la table "CODE["chiffre"], qui renvoie la séquence des
// bits qui allument ou non, les segments utilisés pour le chiffre concerné. OUF !
}
delay(5); // 5ms par digit,
// la séquence d'affichage dure 20ms (4x5ms), ça suffit pour tromper notre œil qui croit voir les 4 digits allumés en
// même temps. Merci la persistance rétinienne.
digitalWrite(AFF[af],0); // l'afficheur en cours est éteint
}
}
loop
Enfin dans le programme principal, il suffit d'appeler la fonction :
void loop() {
byte MOT[4]={1,2,3,4}; // c'est un exemple
affichage ( MOT);
}
Vous apprécierez avec moi la concision du programme ;).
Cet afficheur en l'état peut déjà servir bien des projets : compteur, horloge, etc...
On peut jouer avec la table "CODE" pour par exemple, créer des caractères de l'alphabet. Bon c'est vrai avec quelques manquements et un mélange de minuscules et majuscules. Mais notre cerveau s'en accommode et est capable de lire des phrases défilantes (v. programme "alphanumerique.ino" proposé ci-dessous).
Une autre idée de l'utilisation pourrait aussi être un barregraphe stéréo (v. programme "barregraphe.ino"), ou un défilé de barres et de traits dans des séquences esthétiques.
Comme je suis sympa ;) Je vous donne 4 programmes, l'un utilise l'afficheur en mode barregraphe, un autre propose un chronomètre, le 3ème nous fait un texte défilant et enfin le programme de mon afficheur pour la moto.
Attention l'affectation des segments et anodes ne sont pas identiques, car j'ai utilisé là mon montage optimisé (v. le 2ème schéma) pour les 3 programmes de démonstration et le 1er schéma pour ma moto.