Que ce soit une calculatrice ou le digicode d’un immeuble, nous nous servons couramment des claviers numériques. Le clavier numérique 4×4 est une matrice de 16 boutons dont les états peuvent être détectés par un microcontrôleur.
Matériel
- Ordinateur
- Arduino UNO
- Câble USB A Mâle/B Mâle
- Clavier numérique 4×4
Principe de fonctionnement
Clavier numérique est un ensemble de 16 boutons qui montés 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 autre. Lorsqu’on appuie sur un bouton l’entrée correspondant à la ligne est reliée à l’entrée correspondant à la colonne ce qui ferme le circuit. L’avantage de ce type de montage est que l’on peut gérer 16 boutons avec seulement 8 entrées du microcontrôleur.
Schéma
Le clavier numérique utilise 8 broches de l’Arduino. Il est possible de les brancher sur n’importe quelle broche. Les broches 0 et 1, utilisées pour la connexion série via le port USB, sont à éviter.
Code
Pour gérer le clavier numérique, le principe est de passer chaque entrée des colonnes à l’état haut et de lire la valeur des entrées qui correspondent aux lignes. Si une ligne à la même état que la colonne, c’est qu’un bouton est pressé. En pratique nous pouvons utilise la bibliothèque Keypad.h, qui permet de gérer une matrice de boutons de n’importe quelle taille.
//Libraries #include <Keypad.h>//https://github.com/Chris--A/Keypad //Constants #define ROWS 4 #define COLS 4 //Parameters const char kp4x4Keys[ROWS][COLS] = {{'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}}; byte rowKp4x4Pin [4] = {9, 8, 7, 6}; byte colKp4x4Pin [4] = {5, 4, 3, 2}; //Variables Keypad kp4x4 = Keypad(makeKeymap(kp4x4Keys), rowKp4x4Pin, colKp4x4Pin, ROWS, COLS); void setup() { //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); } void loop() { readKp4x4(); } void readKp4x4() { /* function readKp4x4 */ //// Read button states from keypad char customKey = kp4x4.getKey(); if (customKey) { Serial.println(customKey); } }
Résultat
Lorsqu’une touche du clavier est pressée, nous observons que le caractère associé s’affiche correctement dans le moniteur série.
Bonus: Enregistrer les caractères dans un tableau et les comparer
Pour enregistrer les caractères, nous allons créer un tableau ou array de la taille désirée digits et une variable contenant le nombre de touches appuyées index. Lorsque la chaine de caractères atteint sa taille maximale nous le comparons à une autre chaine de caractères, en utilisant strcmp(), et nous le remettons à zéro.
//Libraries #include <Keypad.h>//https://github.com/Chris--A/Keypad //Constants #define ROWS 4 #define COLS 4 #define DLENGTH 2 //Parameters const char kp4x4Keys[ROWS][COLS] = {{'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}}; byte rowKp4x4Pin [4] = {9, 8, 7, 6}; byte colKp4x4Pin [4] = {5, 4, 3, 2}; char digits[DLENGTH]; char code[]="A0"; int index=0; //Variables Keypad kp4x4 = Keypad(makeKeymap(kp4x4Keys), rowKp4x4Pin, colKp4x4Pin, ROWS, COLS); void setup() { //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); } void loop() { readKp4x4(); } void readKp4x4() { /* function readKp4x4 */ //// Read button states from keypad char customKey = kp4x4.getKey(); if (customKey) { //Serial.println(customKey); digits[index]=customKey; index=index+1; if(index==DLENGTH){ Serial.println(digits); index=0; if(strcmp(digits,code)==0){ Serial.println(F("Code bon !")); } } } }
Applications
- Créer une interface avec plusieurs boutons
- Créer une serrure actionnée par digicode
- Développer une alarme qui s’active ou se désactive à l’aide d’un mot de passe