Mais avant tout, j'ai fait quelques tests afin de me familiariser avec mon nouveau gadget.

Après avoir installé la bibliothèque "keypad", j'ai expérimenté le sketch suivant, pour vérifier que tout fonctionnait convenablement: chaque fois qu'une touche est enfoncée, le nom de la touche est affiché dans le moniteur série. La seule modification notable par rapport au sketch fourni avec la librairie, c'est que j'ai dû régler le "debounce time" à une valeur assez élevée, car les touches avaient tendance à réagir deux fois quand mon intention était de ne les enfoncer qu'une seule fois.
Pour ce sketch, j'ai branché le connecteur 1 du clavier (voir schéma) à la pin 9 de l'Arduino, le connecteur 2 du clavier à la pin 8 de l'Arduino, et ainsi de suite jusqu'au connecteur 8 du clavier qui est branché à la pin 2 de l'Arduino.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Pour tester un keypad branché à l'Arduino: la touche enfoncée s'affiche dans le moniteur série. | |
http://electroniqueamateur.blogspot.com/2012/06/arduino-clavier-numerique-et-afficheur.html | |
*/ | |
#include <Keypad.h> | |
const byte ROWS = 4; //nombre de lignes | |
const byte COLS = 4; //nombre de colonnes | |
char keys[ROWS][COLS] = { | |
{'1','2','3','A'}, | |
{'4','5','6','B'}, | |
{'7','8','9','C'}, | |
{'*','0','#','D'} | |
}; | |
byte rowPins[ROWS] = {9, 8, 7, 6}; //entrées numériques où sont branchées les lignes | |
byte colPins[COLS] = {5, 4, 3, 2}; //entrées numériques où sont branchées les colonnes | |
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); | |
void setup(){ | |
keypad.setDebounceTime(500); | |
Serial.begin(9600); | |
} | |
void loop(){ | |
char key = keypad.getKey(); | |
if (key != NO_KEY){ | |
Serial.println(key); | |
} | |
} |
Ensuite, j'ai ajouté un afficheur à cristaux liquides afin que le clavier numérique contrôle ce qui était affiché à l'écran (une sorte de mini machine à écrire, si on veut). Dans ce sketch, la touche "*" permet d'effacer le dernier caractère affiché.
Ce fut l'occasion de faire l'essai de mon nouveau Arduino Mega car mon afficheur LCD a besoin de 6 ports numériques, alors que le clavier en nécessite 8!
Cette fois, le clavier est branché de la façon suivante:
pin 1 du clavier à la pin 39 du Mega
pin 2 du clavier à la pin 41 du Mega
pin 3 du clavier à la pin 43 du Mega
pin 4 du clavier à la pin 45 du Mega
pin 5 du clavier à la pin 47 du Mega
pin 6 du clavier à la pin 49 du Mega
pin 7 du clavier à la pin 51 du Mega
pin 8 du clavier à la pin 53 du Mega
(Voir cet article pour les branchements de mon afficheur LCD.)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/********************************************************* | |
ArduinoTypewriter: ce qu'on écrit sur le clavier numérique | |
s'affiche sur le LCD | |
Matériel: Arduino Mega, clavier numérique et LCD. | |
26 juin 2012. | |
http://electroniqueamateur.blogspot.com/2012/06/arduino-clavier-numerique-et-afficheur.html | |
**********************************************************/ | |
// include the library code: | |
#include <LiquidCrystal.h> | |
#include <Keypad.h> | |
// initialize the library with the numbers of the interface pins | |
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); | |
const byte ROWS = 4; //nombre de lignes | |
const byte COLS = 4; //nombre de colonnes | |
char keys[ROWS][COLS] = { | |
{'1','2','3','A'}, | |
{'4','5','6','B'}, | |
{'7','8','9','C'}, | |
{'*','0','#','D'} | |
}; | |
byte rowPins[ROWS] = {39, 41, 43, 45}; | |
//entrées numériques où sont branchées les lignes | |
byte colPins[COLS] = {47, 49, 51, 53}; | |
//entrées numériques où sont branchées les colonnes | |
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); | |
int ligne = 0; | |
int colonne = 0; | |
void setup() { | |
// nombre de colonnes et de lignes du LCD: | |
lcd.begin(16, 2); | |
keypad.setDebounceTime(300); | |
} | |
void loop() { | |
char key = keypad.getKey(); | |
if (key != NO_KEY){ | |
if (key == '*'){//on efface le dernier chiffre | |
if (colonne > 0){ | |
colonne = colonne - 1; | |
} | |
else { | |
ligne = !(ligne); | |
colonne = 15; | |
} | |
lcd.setCursor(colonne, ligne); | |
lcd.print(' '); | |
} | |
else{ // alors on a tapé un chiffre | |
lcd.setCursor(colonne, ligne); | |
lcd.print(key); | |
colonne=colonne+1; | |
if (colonne > 15){ | |
if (ligne == 0){// alors on saute à la ligne suivante | |
colonne = 0; | |
ligne = 1; | |
} | |
else{// alors on retourne au début | |
colonne = 0; | |
ligne = 0; | |
} | |
} | |
} | |
} | |
} | |
Finalement, j'ai conçu un petit "Quiz Mathématique" permettant de pratiquer mon calcul mental: si on presse la touche "A", l'afficheur nous propose une addition. On tape la réponse, on appuie sur la touche "#" et l'afficheur nous indique si notre réponse est correcte ou non. Pour se faire proposer une autre addition, on appuie à nouveau sur la touche "A"... ou sur la touche "B" si on préfère une soustraction (la touche "C" propose une multiplication, et la touche "D" propose une division). C'est un peu comme une calculatrice, mais à l'envers puisque c'est vous qui devez trouver la réponse. Encore une fois, la touche "*" permet d'effacer le dernier caractère affiché, afin de corriger une erreur d'entrée.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/********************************************************************** | |
On tente de résoudre un problème mathématique posé par Arduino. | |
Matériel: Arduino Mega, Afficheur LCD, Keypad numérique 4X4. | |
26 juin 2012 | |
http://electroniqueamateur.blogspot.com/2012/06/arduino-clavier-numerique-et-afficheur.html | |
**********************************************************************/ | |
// deux bibiliothèques sont utilisées: | |
#include <LiquidCrystal.h> | |
#include <Keypad.h> | |
// les broches associéees à l'afficheur | |
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); | |
// initialisation du keypad | |
const byte ROWS = 4; //nombre de lignes | |
const byte COLS = 4; //nombre de colonnes | |
char keys[ROWS][COLS] = { | |
{ | |
'1','2','3','A' }, | |
{ | |
'4','5','6','B' }, | |
{ | |
'7','8','9','C' }, | |
{ | |
'*','0','#','D' } | |
}; | |
byte rowPins[ROWS] = { | |
39, 41, 43, 45}; //entrées numériques où sont branchées les lignes | |
byte colPins[COLS] = { | |
47, 49, 51, 53}; //entrées numériques où sont branchées les colonnes | |
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); | |
int colonne = 0; | |
char derniereTouche; | |
int mode = 0; // 0: addition, 1: soustraction, 2: multiplication 3: division | |
long premierNombre = 0; | |
long deuxiemeNombre = 0; | |
long reponseSoumise = 0; | |
void setup() { | |
// nombre de colonnes et de lignes de l'afficheur LCD | |
lcd.begin(16, 2); | |
keypad.setDebounceTime(300); //fonctionne bien pour mon modèle | |
randomSeed(analogRead(0)); | |
AfficheQuestion(); | |
} | |
void loop() { | |
char key = keypad.getKey(); | |
if (key != NO_KEY){ | |
if (key == 'A'){ | |
mode = 0; // addition | |
AfficheQuestion(); | |
} | |
if (key == 'B'){ | |
mode = 1; // addition | |
AfficheQuestion(); | |
} | |
if (key == 'C'){ | |
mode = 2; // addition | |
AfficheQuestion(); | |
} | |
if (key == 'D'){ | |
mode = 3; // addition | |
AfficheQuestion(); | |
} | |
if (key == '*'){//on efface le dernier chiffre | |
if (colonne > 0){ | |
colonne = colonne - 1; | |
lcd.setCursor(colonne, 1); | |
lcd.print(' '); | |
reponseSoumise = (reponseSoumise-(int(derniereTouche)-48))/10; | |
} | |
} | |
if ((key == '0') || (key == '1') || (key == '2')|| (key == '3') | |
|| (key == '4')|| (key == '5')|| (key == '6')|| (key == '7') | |
|| (key == '8')|| (key == '9')){ // alors on a tapé un chiffre | |
if (colonne < 10){ | |
lcd.setCursor(colonne, 1); | |
lcd.print(key); | |
colonne=colonne+1; | |
reponseSoumise = reponseSoumise*10+(int(key)-48); | |
derniereTouche=key; | |
} | |
} | |
if (key == '#'){//on vérifie la réponse | |
lcd.clear(); | |
lcd.setCursor(0, 0); | |
colonne = 0; | |
if (mode == 0){ | |
if (reponseSoumise == (premierNombre+deuxiemeNombre)){ | |
lcd.print("Bravo:"); | |
lcd.setCursor(0, 1); | |
lcd.print("Bonne reponse!"); | |
} | |
else{ | |
lcd.print("NON! Reponse:"); | |
lcd.setCursor(0, 1); | |
lcd.print(premierNombre+deuxiemeNombre); | |
} | |
} | |
if (mode == 1){ | |
if (reponseSoumise == (premierNombre-deuxiemeNombre)){ | |
lcd.print("Bravo:"); | |
lcd.setCursor(0, 1); | |
lcd.print("Bonne reponse!"); | |
} | |
else{ | |
lcd.print("NON! Reponse:"); | |
lcd.setCursor(0, 1); | |
lcd.print(premierNombre-deuxiemeNombre); | |
} | |
} | |
if (mode == 2){ | |
if (reponseSoumise == (premierNombre*deuxiemeNombre)){ | |
lcd.print("Bravo:"); | |
lcd.setCursor(0, 1); | |
lcd.print("Bonne reponse!"); | |
} | |
else{ | |
lcd.print("NON! Reponse:"); | |
lcd.setCursor(0, 1); | |
lcd.print(premierNombre*deuxiemeNombre); | |
} | |
} | |
if (mode == 3){ | |
if (reponseSoumise == (premierNombre/deuxiemeNombre)){ | |
lcd.print("Bravo:"); | |
lcd.setCursor(0, 1); | |
lcd.print("Bonne reponse!"); | |
} | |
else{ | |
lcd.print("NON! Reponse:"); | |
lcd.setCursor(0, 1); | |
lcd.print(premierNombre/deuxiemeNombre); | |
} | |
} | |
} | |
} | |
} | |
void AfficheQuestion () | |
{ | |
long temp; | |
if (mode == 0){ // addition: deux nombres entre 0 et 99 | |
premierNombre = random(100); | |
deuxiemeNombre = random(100); | |
} | |
if (mode == 1){ // soustraction | |
premierNombre = random(100); | |
deuxiemeNombre = random(100); | |
if (deuxiemeNombre > premierNombre){ | |
temp = premierNombre; | |
premierNombre = deuxiemeNombre; | |
deuxiemeNombre = temp; | |
} | |
} | |
if (mode == 2){ //multiplication | |
premierNombre = random(11); | |
deuxiemeNombre = random(11); | |
} | |
if (mode == 3){ //division | |
deuxiemeNombre = random(1,10); | |
premierNombre = random(11)*deuxiemeNombre; | |
} | |
lcd.clear(); | |
lcd.setCursor(0, 0); | |
lcd.print(premierNombre); | |
if (mode == 0){ | |
lcd.setCursor(3, 0); | |
lcd.print('+'); | |
lcd.setCursor(5, 0); | |
} | |
if (mode == 1){ | |
lcd.setCursor(3, 0); | |
lcd.print('-'); | |
lcd.setCursor(5, 0); | |
} | |
if (mode == 2){ | |
lcd.setCursor(3, 0); | |
lcd.print('*'); | |
lcd.setCursor(5, 0); | |
} | |
if (mode == 3){ | |
lcd.setCursor(3, 0); | |
lcd.print('/'); | |
lcd.setCursor(5, 0); | |
} | |
lcd.print(deuxiemeNombre); | |
reponseSoumise = 0; | |
colonne = 0; | |
} | |
Yves Pelletier (Twitter: @ElectroAmateur)
Excellent site.
RépondreSupprimerBonjour,
RépondreSupprimerEt avec un uno puis-je utiliser les pin analogique ?
Merci
cool
RépondreSupprimermerci pour tout ces programmes que tu fais je t'e remercie
RépondreSupprimer