Intro

Il y a un certain temps j'ai acheté ce truc-là chez mon honorable marchand chinois (Miniinthebox, qui livre en une dizaine de jours sans frais de ports - par contre envoie des mails de pub quasiment tous les jours, auxquels je n'ai pas réussi de me désabonner).

avec 5 boutons utilisables (select, gauche, haut, bas, droite) et un reset, + un afficheur 2 lignes de 16 caractères pour jouer avec mon arduino.

(Sur la photo ils ont caché la mention "DF Robot" au dessus de "Drive the Future". L'honorable commerçant aurait-il des problèmes de contrefaçons ? :-))

L'afficheur est représenté par une classe dans la bibliothèque LiquidCrystal, mais pour les boutons on est prié de se débrouiller en comparant la tension de la broche 0 avec divers seuils. J'ai essayé d'emballer ça dans une classe, pour faire beau.

Voyons comment on va l'utiliser :

 #include <LiquidCrystal.h>
 class Keypad {
  ...
 };
 LiquidCrystal lcd( 8,9, 4,5,6,7);
 Keypad keypad(0);                               // ici
 int compteur = 0;
 int direction = 1;
 void afficher() 
 {
   lcd.clear();
   lcd.setCursor(9,0);
   lcd.print(compteur);
 }
 void setup() 
 {
   lcd.begin(16,2);
   afficher();
 }
 void loop()
 {
    afficher();
    switch( keypad.getButton() )                                  // et là
    {
      case Keypad::UP:                                                // constante
         direction =  1;  
         break;
      case Keypad::DOWN :                                        // constante 
         direction = -1;  
         break;
    }
    compteur += direction;  
    delay(100);
 }


Voila la classe :

class Keypad {
protected:
    int m_pin;
 
public:
    enum { RIGHT, UP, DOWN, LEFT, SELECT, NONE };
 
    Keypad(int pin) 
      : m_pin(pin)
    {}  
 
    int getButton() {
       static const int values[] 
           = { 50, 195, 380, 555, 790 };  // pour v1.0
       //  = { 50, 250, 450, 650, 850 };  //  pour les heureux propriétaires de v1.1
       int value = analogRead(m_pin);
       if (value > values[4])                // cas le plus fréquent
          return NONE;
       for (int i = 0; i<5; i++) {
          if (value < values[i])
             return i;
       }  
    } 
 };