Z-i-G-Z-a-G

Convertisseur binaire vers décimal [2/2] — Arduino


Il y a 15 jours, je vous proposais de confectionner un afficheur digital 3×7-segments, afin de lui attribuer un simple compteur. Aujourd’hui, nous allons voir comment brancher 8 commutateurs (ou boutons poussoirs pour cet exemple) sur notre carte Arduino afin de lui envoyer des valeurs binaires.
Pour cela c’est assez simple, il suffit d’ajouter les 8 switchs (boutons poussoirs) à la suite sur notre plaque d’essai. On les connecte au 5v d’un coté et aux broches analogiques A0 à A5 et numériques 12 et 13 comme suit:

7-segments_buttons

Voyons maintenant quelles lignes de code nous allons modifier et ajouter à notre programme précédant (voir Convertisseur binaire vers décimale [1/2] — Arduino).

Pour commencer nous allons indiquer au programme les différentes broches connectées, avec la fonction #define. Par défaut les broches A0 à A5 sont des entrées analogiques, mais il est possible de les transformer en entrées numériques en indiquant simplement au programme qu’il s’agit des broches numériques 14 à 19. Selon notre câblage, les boutons poussoirs (switch) 1 et 2 (de droite à gauche) sont associés respectivement aux broches numériques 12 et 13. Les suivants sont quant à eux branchés aux broches analogiques A0 à A5 (14 à 19), le troisième bouton poussoir correspond (toujours selon notre branchement) à la broche A5 (19) et ainsi de suite.

#define switch1 12
#define switch2 13
#define switch3 19
#define switch4 18
#define switch5 17
#define switch6 16
#define switch7 15
#define switch8 14

Nous créons ensuite huit variables, qui auront la valeur 0 comme cela:

int v1 = 0;
int v2 = 0;
int v3 = 0;
int v4 = 0;
int v5 = 0;
int v6 = 0;
int v7 = 0;
int v8 = 0;

Dans notre setup(), nous déclarons que les switchs 1 à 8 sont utilisés comme sorties (OUTPUT).

pinMode(switch1, OUTPUT);
pinMode(switch2, OUTPUT);
pinMode(switch3, OUTPUT);
pinMode(switch4, OUTPUT);
pinMode(switch5, OUTPUT);
pinMode(switch6, OUTPUT);
pinMode(switch7, OUTPUT);
pinMode(switch8, OUTPUT);

Dans le loop() cette fois-ci, nous créons d’autres variables puis nous leurs indiquons de lire la valeur haute ou basse des connecteurs (switch1 à switch8).

int BTN1 = digitalRead(switch1);
int BTN2 = digitalRead(switch2);
int BTN3 = digitalRead(switch3);
int BTN4 = digitalRead(switch4);
int BTN5 = digitalRead(switch5);
int BTN6 = digitalRead(switch6);
int BTN7 = digitalRead(switch7);
int BTN8 = digitalRead(switch8);

Ensuite nous allons ajouter des conditions à l’aide de if(), si la valeur des boutons poussoirs est égale à 1, alors on attribue les variables (v1 à v8) de la valeur correspondant à celle de leurs rangs selon la règle des puissances de 2 (pour le binaire), mais si ce n’est pas le cas (else()) leurs valeurs restent à 0.

if(BTN1 == 1) v1 = 1; else v1 = 0;
if(BTN2 == 1) v2 = 2; else v2 = 0;
if(BTN3 == 1) v3 = 4; else v3 = 0;
if(BTN4 == 1) v4 = 8; else v4 = 0;
if(BTN5 == 1) v5 = 16; else v5 = 0;
if(BTN6 == 1) v6 = 32; else v6 = 0;
if(BTN7 == 1) v7 = 64; else v7 = 0;
if(BTN8 == 1) v8 = 128; else v8 = 0;

Voilà, maintenant nous déclarons que toutes les valeurs (v1 à v8) doivent être additionnées pour permettre à notre afficheur d’indiquer la bonne valeur suivant l’état appuyé (1) ou relâché (0) des différents boutons poussoirs.

afficheur(v1+v2+v3+v4+v5+v6+v7+v8);
delay(5);

Vous pouvez supprimer les lignes que nous avions écris pour le compteur, cependant nous allons en garder une partie.

// ces lignes sont à supprimer
  /*for(int centaine=0; centaine < 10; centaine++) {
    for(int dizaine=0; dizaine < 10; dizaine++) {
      for(int unite=0; unite < 10; unite++) {
        unsigned long startTime = millis();
        for(unsigned long compteur=0; compteur < 1000; compteur = millis()-startTime) {
          chiffreLux1(chiffres[centaine]);
          delay(5);
          chiffreLux2(chiffres[dizaine]);
          delay(5);
          chiffreLux3(chiffres[unite]);
          delay(5);
        }
      }
    }
  }*/

Et nous créons la déclaration afficheur(), que nous avions invoqué précédemment. Dans cette déclaration, j’indique au programme les valeurs maximales contenues dans le rang des centaines, puis des dizaines et des unités, à l’aide du modulo (%). Merci à Loïc Horellou pour cette partie du code sans qui j’y aurais passé du temps.

void afficheur(int valeur) {
  int reste =0;
  int centaine = (valeur-valeur%100) /100;
  reste = valeur%100;
  int dizaine = (reste - reste%10) / 10;
  int unite = reste%10;
    
  chiffreLux1(chiffres[centaine]);
  delay(5);
  chiffreLux2(chiffres[dizaine]);
  delay(5);
  chiffreLux3(chiffres[unite]);
  delay(5);
}

C’est terminé, vous pouvez téléverser ce nouveau programme dans votre carte Arduino. Vous venez de créer un convertisseur binaire vers décimale, appréciez-le en appuyant sur un ou plusieurs boutons poussoirs et observez le résultat de la conversion.

Par exemple si vous pressez (de droite à gauche) le premier et le troisième bouton, vous verrez afficher 005, car 101 (en binaire) équivaut à 5 (en décimal). Pour aller plus loin, le premier bouton correspond au rang 1 (1×2^0) donc 1 et le troisième bouton correspond au rang 3 (1×2^2) ce qui donne 4; premier rang (1) plus troisième rang (4) égale 5. Vous ne pourrez qu’afficher la valeur maximale contenue dans 8 informations (nos 8 boutons poussoirs), c’est à dire 1 octet (8-bits) 255.

Share Button

Rubrique: Section 17 | Commenter




Laissez un commentaire