Arduino : une classe pour le LCD Keypad Shield
Par Michel Billaud, dimanche 24 mai 2015 à 19:42 :: La maison :: #75 :: rss
Il y a une classe `LiquidCrystal` pour piloter l'afficheur du LCD Keypad Shield, mais elle gère seulement l'affichage. Pour les boutons, on est priés de se débrouiller avec analogRead(). Pas très sympa. D'où l'idée de faire une petite classe pour s'occuper des boutons.
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;
}
}
};
Commentaires
Aucun commentaire pour le moment.
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.