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
Bonjour,
débutant en Arduino, je suis bloqué sur ce mini croquis.
il me manque un p’tit quelque chose dans ce croquis.
j’aimerai obtenir le résultat :
11 ou 76 ou 0A ou 5B ou C9 ou D6 etc.
soit 2 chiffres
soit un chiffre + A, B, C ou D
soit A, B, C ou D + un chiffre
Vous pouvez me dire comment procéder ?
Avec mes remerciements
Bonjour,
pour cela vous devez enregistrer les identifiants bouton dans un tableau de char de longueur deux.
char digits[2]
digits[i]=customKeypad.getKey()
Bonjour,
Je ne sais pas si la librairie a connu des changements, mais le code actuel ne fonctionne pas il y a un problème de taille je pense au niveau du « A0 » et de la taille de DLENGTH.
Avez-vous la version corrigé ?
Bonjour DLENGTH est bien égal à 2 et « A0 » a deux caractères.
Quel message d’erreur s’affiche?
Bonjour,
j’ai un probleme,
warning: initializer-string for array of chars is too long [-fpermissive]
char code[DLENGTH]= »A0″;
et quand je l’utilise j’ai ça comme sortie :
99
il y a un caractère bizarre a la fin quand j’appuie sur deux touches
je pense que c’est de ça que voulait parler ROUETET
Bonjour,
je n’ai pas la même erreur.
Pourriez-vous essayez avec cette définition?
char code[]= »A0″;
Quelle version de l’IDE Arduino utilisez-vous?
Bonjour, le code est niquel mais il y a un problème tous les chiffres fonctionnent sauf le 7,4,1 et 0,#,D pourtant l’étoile marche donc si vous pouvez me venir en aide ça serait super merci
Bonjour, ça ressemble à un problème de branchement.
je galère ???
pouvez vous m indiquer pour ce clavier vu de face :
les entrées numéros ligne 1,2,3,4 et colonnes 1,2,3,4.
merci de me venir en aide.
Alain