Site icon AranaCorp

Utilisation d’un Clavier numérique 4×4 avec Arduino

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

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

Sources

Quitter la version mobile