Comment faire fonctionner le digicode et l'adapter à tous vos projets ?

Introduction

Le keypad, ou digicode, est une matrice de bouton dont l’état (0 ou 1) peut être détecté par un microcontroleur comme la carte Arduino.

Le keypad est sous forme de matrice, c’est à dire que tous les boutons d’une colonne sont reliés une entrée et tous les boutons d’une même ligne sont reliés à une 2ème entrée. Lorsqu’on appuie sur un bouton il ferme le circuit en reliant l’entrée correspondant à la ligne à l’entrée correspondant à la colonne.

L’avantage de ce type de montage est que l’on peut gérer 16 boutons avec seulement 8 entrées du microcontrôleur.

Comment fonctionne un keypad ?

Le keypad est divisé en deux parties : les lignes et les colonnes. Chaque intersection entre une ligne et une colonne représente un bouton.

Lorsqu’on appuie sur l’une des touches, la ligne et la colonne correspondantes sont reliées.
Arduino détecte le bouton appuyé par une technique appelée “balayage matriciel” :
Arduino passe chaque broche de ligne à l’état bas (LOW), et lit les broches des colonnes. Lorsque le bouton a été appuyé il y a 
passage à l’état bas (LOW) de la broche colonne –  en raison du court-circuit réalisé par l’appui bouton.
C’est de qui permet à Arduino d’identifier le bouton appuyé.

Pour pouvoir faire les projets que l’on vous propose vous aurez besoin de la librairie keypad. On va voir tout de suite comment l’installer.

Comment installer la librairie keypad ?

La librairie keypad va vous permettre de faire fonctionner n’importe quelle matrice de boutons.

Pour cela vous devez d’abord télécharger la bibliothèque.

Une fois la bibliothèque téléchargée, vous devez vous rendre sur le logiciel Arduino ide dans le manageur de librairie. Choisissez les librairies en zip :

Ensuite on sélectionne la librairie précédemment téléchargée. Puis on reçoit un message qui nous indique que la librairie a bien été installée :

Comment faire son propre digicode ?

Si vous n’avez pas de digicode, vous pouvez en faire vous même à l’aide de plusieurs boutons poussoir.

Nous avons expliqué tous les détails dans notre cours sur les boutons poussoirs.

Afficher les chiffres appuyés sur la console Arduino

Remarque : Pour construire vos propres schémas vous pouvez télécharger l’image du digicode sur Fritzing. Puis pour la mettre sur Fritzing vous pouvez regarder notre cours dessus.

Vous devez ensuite téléverser le code suivant afin que le moniteur série reconnaisse quelle touche vous avez appuyée :

#include <Keypad.h>

const byte Ligne = 4; //quatre ligne sur le digicode
const byte Colonne = 4; //quatre colonne sur le digicode
//On définit maintenant les symboles correspondant à chaque bouton
char hexaBouton[Ligne][Colonne] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte Ligne_Pins[Ligne] = {9, 8, 7, 6}; // On connecte la ligne du digicode 
byte Colonne_Pins[Colonne] = {5, 4, 3, 2}; // On connecte la colonne du digicode

//On initialise la librairie avec nos paramètres ( la taille de la matrice et symboles)
Keypad mon_keypad = Keypad( makeKeymap(hexaBouton), Ligne_Pins, Colonne_Pins, Ligne, Colonne); 

void setup(){
  Serial.begin(9600);
}
  
void loop(){
// On demande à la librairie le chiffre tapé.
  char keypad_matrix = mon_keypad.getKey();
  
  if (keypad_matrix){
    Serial.println(keypad_matrix);
  }
}

Voici le résultat lorsqu’on appuie sur les touches du clavier :

Code secret sur un digicode

On va maintenant voir comment faire un code secret avec un digicode.

Ceci pourra vous servir pour déverrouiller un coffre fort par exemple, ouvrir un portail…

Voici comment le programme fonctionne :

 La led rouge est d’abord allumée. Puis en tapant le code 0123 puis D pour confirmer le code, la led verte va s’allumer. Si le code est mauvais et que vous appuyer sur D; la led rouge va clignoter.

Enfin, si vous vous êtes trompé de chiffre, vous pouvez appuyer sur le touche A pour recommencer le code.

Voici le schéma du projet :

Voici le code associé au projet :

#include <Keypad.h>
int compteur =0; // Permet de compte le nombre de touche appuyée
// Définit les 2 leds 
const int led_rouge = 11; 
const int led_verte = 12; 
const byte Ligne = 4; // 4 lignes sur le digicode
const byte Colonne = 4; // 4 colonnes sur le digicode
// Définit maintenant les symboles correspondant à chaque bouton
char hexaBouton[Ligne][Colonne] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
char code[5]; // Contient les touches tapées par l'utilisateur
byte Ligne_Pins[Ligne] = {9, 8, 7, 6}; // Connecte la ligne du digicode 
byte Colonne_Pins[Colonne] = {5, 4, 3, 2}; // Connecte la colonne du digicode 
//int compteur =0;
// Initialise la librairie avec nos paramètres (la taille de la matrice et symboles)
Keypad mon_keypad = Keypad( makeKeymap(hexaBouton), Ligne_Pins, Colonne_Pins, Ligne, Colonne); 

void setup(){
  pinMode(led_rouge,OUTPUT); // La led rouge est en sortie
  pinMode(led_verte,OUTPUT); // La led verte est en sortie
  digitalWrite(led_rouge, HIGH); // Met par défaut la led car le coffre est verouillé par défaut
}
  
void loop(){
  char keypad_matrix = mon_keypad.getKey(); // Récupère la touche appuyé
  if (keypad_matrix){ // Si une touche est appuyée
    code[compteur] =keypad_matrix; // Met la valeur dans la liste
    compteur+=1; // Incrémente pour que l'on se déplace dans la liste des valeurs
    if (keypad_matrix =='A'){// Si on appuie sur A, on réintialise les valeurs
    	compteur=0;
    }
    if (compteur ==5){ // Si on a 4 valeurs, on vérifie si le code est bon sinon on remet le compteur à 0
      if (code[0] =='0' && code[1] =='1' && code[2] =='2' && code[3] =='3' && code[4] =='D'){ // Si le code est bon
      	digitalWrite(led_rouge, LOW); // Eteint la led rouge
      	digitalWrite(led_verte, HIGH); // Allume la led verte
      }
      
      if (code[0] !='0' || code[1] !='1' || code[2] !='2' || code[3] !='3' && code[4] =='D'){ // Si le code n'est pas bon
        digitalWrite(led_verte, LOW); // Eteint la led verte si elle était allumée
       // Fait clignoter la led rouge
        digitalWrite(led_rouge, LOW);
         delay(500);
         digitalWrite(led_rouge, HIGH);
         delay(500);
           }
      compteur=0; // Rétablit le compteur à 0 si l'utilisateur veut retenter sa chance
      }
  }
}