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.