MTdoubleButton: Exemple 2

Un bouton est branché entre A0 et GND. Le programme va faire clignoter la led LED_BUILTIN sur double clic et l'éteindre sur simple clic.

Le clignotement

Tout d'abord intéressons nous au clignotement de la led. La façon la plus simple est d'utiliser un objet qui va directement mettre des états LOW et HIGH sur une sortie. C'est un PWM. Mais à la différence d'analogWrite, l'objet MTsoftPWM permet de choisir sa fréquence. On ne peut pas prendre un MThardPWM car la sortie 13 qui nous intéresse ne permet pas le PWM câblé chez la Nano et la Uno.

MTsoftPWM Led(...

Ceci va créer un objet Led qui est un MTsoftPWM. Notez au passage le L majuscule qui respecte la convention d'écriture pour les objets.

Le premier paramètre à donner est le nom de la broche qui sera utilisé. Ici c'est la LED_BUILTIN:

MTsoftPWM Led(LED_BUILTIN, ... );

Le deuxième paramètre c'est la largeur de l'impulsion, soit encore le temps que dure l'état HIGH. Ici on va choisir par exemple 0,1s allumé et 0,1s éteint. La durée de l'impulsion c'est donc 0,1s. Elle doit être exprimée en micro-secondes:

MTsoftPWM Led( ... impulsions_de 100000 micro_secondes, ... );

On aurait pu mettre:

MTsoftPWM Led( ... 100000, ... );

Mais la lecture est moins évidente. Un bon commentaire est apprécié. impulsions_de et micro_secondes sont des mots commentaires et sont ignorés par le compilateur. On les reconnaît car ils ne contiennent que des minuscules et ont un caractère "_" au milieu.

Le troisième paramètre est la période:

MTsoftPWM Led( ... periodes_de 200000 micro_secondes, ... );

Ici aussi periodes_de et micro_secondes sont des mots commentaires ignorés par le compilateur.

On peut ensuite définir l'état au démarrage.Comme la led doit être éteinte au lancement du programme, il faut que ce soit un état LOW. Par défaut la valeur est HIGH, et de toutes façon on doit spécifier ce paramètre car on a besoin de spécifier les paramètres suivants:

MTsoftPWM Led( ... on_commence_par LOW, ... );

A nouveau, on utilise le mot commentaire on_commence_par pour donner la signification du LOW.

Le clignotement étant continu (il ne doit pas faire quelques flashs, mais doit durer tant que l'on ne l'arrête pas), on va l'indiquer dans le paramètre suivant par un MT_INFINI:

MTsoftPWM Led(... MT_INFINI, ...);

C'est la valeur par défaut que l'on pourrait ne pas mettre, si l'on pouvait ne pas spécifier les paramètres suivants.

Il n'y a pas de fonctions à appeler quand on a fait toutes les impulsions, le paramètre suivant indique donc qu'il n'y a pas de fonction callback:

MTsoftPWM Led(... PAS_D_ACTION, ... );

Enfin au démarrage, la led doit être éteinte, et donc le pwm doit être arrêté (par défaut, il fonctionnerait, il faut donc spécifier ce paramètre):

MTsoftPWM Led(... MT_OFF);

La déclaration complète de Led est donc:

MTsoftPWM Led(LED_BUILTIN, impulsions_de 100000 micro_secondes, periodes_de 200000 micro_secondes, on_commence_par LOW, MT_INFINI, PAS_D_ACTION, MT_OFF);

On n'a pas besoin de déclarer la broche LED_BUILTIN en sortie, c'est l'initialisation de Led qui le fait exactement comme pour les analogWrite. Par contre comme on utilise un objet MTsoftPWM il faut inclure le code correspondant:

#include "MTsoftPWM.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.

Le bouton

On va commencer par donner un nom symboliques à la broche utilisée:

const uint8_t PIN_BUTTON = A0; // Bouton câblé entre GND et A0

Puis définissons notre bouton:

MTdoubleButton Bouton(PIN_BUTTON, clignote, eteint);

Cela définit un bouton nommé "Bouton". Il est du type MTdoubleButton car on a besoin de reconnaître les doubles clics. Il y a trois paramètres à passer:
- le nom de la broche
- le nom de la fonction qui va être appelée si on fait un double clic
- le nom de la fonction qui va être appelée si on fait un simple clic
Les fonctions appelées ne doivent pas avoir de paramètres et ne doivent rien retourner.

MTdoubleButton admet un dernier paramètre qui doit donner l'état de repos. Il est plus simple de brancher le bouton entre A et GND (pas besoin de résistance) et c'est cet état qui est pris par défaut, on n'a donc pas besoin de rajouter ce paramètre. On pourrait aussi ne pas préciser la deuxième fonction si ce n'était pas le bouton qui éteignait la led.

Notez que dans la définition de Bouton on parle de clignote et eteint qui doivent être définies auparavant. Il va donc falloir les définir avant cette ligne. Pour faire clignoter la led, il suffi simplement d'activer le pwm en appelant la fonction strat de LED. Pour arrêter le clignotement, il suffit d'appeler la fonction stop. Cette dernière fonction remet en plus la sortie dans son état de repos et éteint donc la led. Voici les définitions des deux fonctions clignote et eteint:

void clignote(void)
{
  Led.start();
}

void eteint(void)
{
  Led.stop();
}

Pas plus de commentaires avec des noms explicites. Notez que l'on peut définir ces deux fonctions dans l'ordre qui nous convient, mais il faut les mettre avant la définition du bouton.

On utilise un objet MTdoubleButton il faut inclure le code correspondant:

#include "MTdoubleButton.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects

Setup et loop

On a tout fait pour le bouton, la led est initialisée par la création de LED. Dans le setup(), il n'y a plus rien à faire:

void setup(){}

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, il faut la définir.

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(){}

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 et ne s'occupe pas à changer l'état de la led.

Programme complet

Voici donc le programme complet:

// Ce programme fait clignoter une led si on fait un double clic  et éteint
// la led sur un simple clic. 

#include "MTsoftPWM.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects
#include "MTdoubleButton.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects

const uint8_t PIN_BUTTON = A0; // Bouton câblé entre GND et A0


// Le clignotement est fait par un PWM
MTsoftPWM Led(LED_BUILTIN, impulsions_de 100000 micro_secondes, periodes_de 200000 micro_secondes, on_commence_par LOW, MT_INFINI, PAS_D_ACTION, MT_OFF);


//Puis définition du bouton
void clignote(void)
{
  Led.start();
}

void eteint(void)
{
  Led.stop();
}

MTdoubleButton Bouton(PIN_BUTTON, clignote, eteint);



void setup(){}

void loop(){}