MTbutton: Exemple 4
Ce programme allume une led si on appuie sur un bouton et l'éteint si on appuie une deuxième fois ou si 5 secondes se sont écoulées
Le bouton
Analysons le fonctionnement. Intéressons nous à l'action faite par le bouton. Quand on appuie sur le bouton, l'action va dépendre de l'état de la led. On ne va pas allumer une fois sur deux et éteindre une fois sur deux car la temporisation peut elle aussi éteindre la led. Il est possible, si on répète les appuis assez régulièrement, que le bouton se comporte comme un va et vient (pour chaque appui: j'allume j’éteins, j'allume, j’éteins...). Mais il est possible aussi que l'appui sur le bouton ne fasse qu'allumer la led. On doit donc prendre un bouton de type sonnette, et agir en fonction de l'état de la led. Pour la définition du bouton ce sera donc:
void change(void) { if (digitalRead(LED_BUILTIN)) // Si c'est allumé digitalWrite(LED_BUILTIN, LOW); // On éteint else digitalWrite(LED_BUILTIN, HIGH); // Sinon on allume } MTbutton Bouton(A0, change); // Un clic on allume, un clic on éteint
On aurait pu aussi écrire:
void change(void) { digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // Inversion } MTbutton Bouton(A0, change); // Un clic on allume, un clic on éteint
Mais restons en à la première forme. On simplifiera à la fin si on peut encore.
Il ne faudra pas oublier de définir le nom symbolique du bouton:
const uint8_t PIN_BUTTON = A0; // Bouton câblé entre GND et A0
La temporisation
Pour faire un temporisateur, on va utiliser une horloge (MTclock) qui ne va pas répéter à l'infini son action comme un métronome, mais qui une fois déclenchée ne va avoir qu'une seule action: éteindre la led.
Voici comment on peut le définir:
void eteint(void) { digitalWrite(LED_BUILTIN, LOW); } // Temporisation de 5s qui va éteindre MTclock Temporisateur(5000 milli_secondes, eteint, 1 action_et_arret, MT_OFF);
La fonction eteint éteint la led, il n'y a pas à en dire plus, elle est quasi auto-commentée.
pour la définition du temporisateur de 5s, c'est un objet MTclock qui va s'appeler Temporisateur:
MTclock Temporisateur(...
Notez au passage la lettre majuscule sur le nom, c'est une convention pour différentier les objets des variables qui sont écrites tout en minuscule. Il faut ensuite donner le temps en millisecondes:
MTclock Temporisateur(5000 milli_secondes, ...
Le mot milli_secondes est un mot commentaire propre à MTobjets. Ce sont des mots ignorés par le compilateur qui vont faciliter la lecture. Dans le cas présent en rajoutant ce mot, on va comprendre que 5000 est un temps et qu'il représente 5s. Les mots commentaires de MTobjets sont en minuscule avec le caractère "_" en dedans mais pas aux extrémités (aux extrémités c'est "réservé" pour les variables de la bibliothèque).
Il faut ensuite donner le nom de la fonction (callback) qui sera appelée en fin de temporisation:
MTclock Temporisateur(5000 milli_secondes, eteint, ...
Il faut ensuite spécifier le nombre d'actions que cette horloge va faire. Ici, elle ne va faire qu'une seule action. Par défaut c'est des actions qui se répète à l'infini (MT_INFINI), ici c'est 1 On rajoutera le mot commentaire action_et_arret qui facilite la compréhension:
MTclock Temporisateur(5000 milli_secondes, eteint, 1 action_et_arret ...
Enfin le dernier paramètre possible indique que le temporisateur est à l'arrêt au départ. On utilise MT_OFF. Par défaut ou avec MT_ON, le temporisateur compterait à l'initialisation et éteindrait la led 5s après la mise sous tension. Ce serait possible car éteindre une led éteinte n'a pas d'effet visible et un allumage de la led par le bouton réenclencherait le temps. Mais c'est peut être plus parlant. Cela donne donc pour la définition complète:
MTclock Temporisateur(5000 milli_secondes, eteint, 1 action_et_arret, MT_OFF);
Il faut en plus que le temporisateur soit armé (déclenché) quand on allume la led (on pourait aussi l'armer quand le bouton est appuyé). Dans la définition de l'action change appelée par le bouton on va avoir l'appel à la fonction start du temporisateur:
void change(void) { if (digitalRead(LED_BUILTIN)) // Si c'est allumé digitalWrite(LED_BUILTIN, LOW); // On éteint else digitalWrite(LED_BUILTIN, HIGH); // Sinon on allume Temporisateur.start(); }
Recoller les morceaux
Pour le programme final, il faut coller ensemble les lignes correspondantes au bouton et au temporisateur. Ici, comme dans la fonction change il y a un appel au temporisateur, il faut que ce dernier soit défini avant. On définira donc le temporisateur avant le bouton.
il reste encore des petits détails, tout d'abord ajouter la bibliothèque pour définir les deux objets utilisée:
#include "MTbutton.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects #include "MTclock.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects
Je conseille fortement de laisser le commentaire, si une autre personne voulait essayer le programme, elle aurait directement un lien de téléchargement. C'est valable pour toutes les bibliothèques que vous utilisez.
Il faut aussi s'occuper de la led. Dans le setup(), il faut la définir en sortie:
void setup() { pinMode(LED_BUILTIN, OUTPUT); }
Il n'y a rien à faire de plus, loop() ne nous sert à rien. Il va rester vide. Mais vous pouvez y mettre un autre programme, celui que nous avons fait est indépendant. Donc:
void loop(){}
J'ai tout mis sur la même ligne mais vous pouvez en prendre deux ou trois. Même si la fonction est vide et ne nous sert à rien apparemment, il faut la définir. En fait, elle va servir de boucle d'attente quand notre programme ne va pas s'intéresser au bouton.
Programme complet
Voici donc le programme recollé complet:
// Ce programme allume une led si on appuie sur un bouton et l'éteint si on // appuie une deuxième fois ou si 5 secondes se sont écoulées #include "MTbutton.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects #include "MTclock.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects const uint8_t PIN_BUTTON = A0; // Bouton câblé entre GND et A0 void eteint(void) { digitalWrite(LED_BUILTIN, LOW); } // Temporisation de 5s qui va éteindre MTclock Temporisateur(5000 milli_secondes, eteint, 1 action_et_arret, MT_OFF); void change(void) { if (digitalRead(LED_BUILTIN)) // Si c'est allumé digitalWrite(LED_BUILTIN, LOW); // On éteint else { digitalWrite(LED_BUILTIN, HIGH); // Sinon on allume Temporisateur.start(); } } MTbutton Bouton(PIN_BUTTON, change); // Un clic on allume, un clic on éteint void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() {}