====== Jalon 2: Détecter les appuis courts, moyens et longs sur le bouton ======
[[in202:seance_7|Retour à la séance 7]]
Vous ajouterez à votre projet (ou vous dupliquez votre projet et vous ajoutez) le nouveau fichier correspondant à une classe ''Button'' un peu différente de la semaine dernière. La raison est que nous devons utiliser un bouton sans avoir de résistances. Nous utilisons donc un modèle différent qui fonctionne par ''cour-circuit'' mais qui occassionne beaucoup de bruit électronique, donc qui est un peu plus compliquer à mettre en oeuvre.
===== Phase 1 =====
Ajouter le bouton entre qui sera connecté à d'un coté un port entre 2 et 7 et de l'autre côté à la terre. Vous devriez avec un schéma de connexion de ce type :
+----- bouton -----+----- diode -----+
| | |
pin bouton terre pin diode
Le port ''pin bouton'' est configuré pour ête à ''3.3V'' par défaut, quand on appuie sur le bouton, on met le circuit en //court-circuit// (il est protégé par une résistance) et la tension mesurée tombe à ''0V''. Cependant, il y a pas mal de parasite, c'est pour cela qu'il faut un code plus //compliqué// que celui de la classe ''Button'' de la semaine dernière pour éliminer les parasites. (Parfois une résistance bien placée simplifie la vie!).
La classe ''Button'' implante nativement la gestion des évènements. Chaque fois que le bouton est appuyé, il déclenche une interruption ''FALLING'' (et oui, nous passons de 3.3V à 0V quand nous appuyons sur le bouton) puis une interruption ''RISING'' (pour détecter quand nous relachons le bouton pour passer de 0V à 3.3V).
Chaque fois qu'une interruption ''FALLING'' valide se produit (ie. le bouton est enfoncé), la méthode virtuelle ''OnButtonPressed(uint32_t theEventTime)''. La variable ''theEventTime'' indique le moment où l'on a appuyé sur le bouton (c'est le nombre de millisecondes qui se sont écoulés depuis le démarrage de la carte). De même quand l'interruption ''RISING'' se produit après une interruption ''FALLING'' valide, la méthode virtuelle ''OnButtonReleased(uint32_t theEventTime)'' est appelée. La variable ''theEventTime'' indique le moment où l'on a relâche le bouton.
==== Etape 1 ====
Connecter le bouton comme décrit précédemment et créer un petit programme qui teste si les méthodes ''OnButtonPressed'' et ''OnButtonReleased'' sont bien appelées.
==== Etape 2 ====
Nous souhaitons détecter des appuis courts (on appuie sur le bouton moins de 600 ms, long (moins de 1,5) et très long (plus de 1,5s).
Nous souhaiterons que losqu'un tel appui est détecté, les méthodes virtuelles suivantes que nous ajoutons à la classe soient appellées :
* ''virtual void OnShortButtonClick();''
* ''virtual void OnLongButtonClick();''
* ''virtual void OnVeryLongButtonClick();''
Proposer une modification des fonctions ''OnButtonPressed()'' et ''OnButtonReleased()'' afin de calculer la durée de l'appui et en fonction de cette durée d'appeller l'une des méthodes précédentes.
==== Etape 3 ====
Ajouter aux fonctions :
* ''virtual void OnShortButtonClick();''
* ''virtual void OnLongButtonClick();''
* ''virtual void OnVeryLongButtonClick();''
un code du type
virtual void OnShortButtonClick()
{
if(IsDebug())
Serial << name() << ": " << "short click\n";
}
====== Navigation ======
Précédent: ** Jalon 1: **[[.:jalon_1| La classe DimmableLed]]
Suivant: ** Jalon 3: **[[.:jalon_3|Commande de la Led dimmable à partir du bouton]]