MTdoubleClock: Exemple 3

Led clignotante avec marche/arrêt.

On va utiliser un bouton bistable qui commande un métronome double, un événement sur deux va allumer la led, un événement sur deux va l'éteindre. C'est un exemple classique qui peut servir de base à des tâches comme programmer un ventilateur, un moteur...

Le métronome

C'est ce métronome qui va allumer et éteindre la led pour la faire clignoter. Voici comment on peut définir une fonction qui allume la led et une fonction qui l'éteint:

void allume(void)
{
  digitalWrite(LED_BUILTIN, HIGH);
}

void eteint(void)
{
  digitalWrite(LED_BUILTIN, LOW);
}

Notre métronome va donc appeler alternativement chacune des deux fonctions. Si l'on veut un cycle allumé pendant 0,1s et éteint pendant 0,5s il faut bien prendre un MTdoubleClock qui permet de différentier les deux temps différents:

MTdoubleClock Metronome( ...

Cela va créer un objet (en gros une variable) de type MTdoubleClock.

Au début la led est éteinte. Il faut donc une première action (un appel à la fonction allume) au bout de 0,5s:

MTdoubleClock Metronome(500 milli_secondes, ... , allume, ...

Les temps étant exprimés obligatoirement en millisecondes, on a donc le nombre 500. Le milli_secondes est un mot commentaire ignoré par le compilateur. On reconnaît ces mots à la présence d'un caractère "_" au milieu de plein de lettres minuscules sans avoir ce caractère en début.

Et pour la deuxième action, ce sera au bout de 100ms. On aura donc:

MTdoubleClock Metronome(500 milli_secondes, 100 milli_secondes, allume, eteint, ... );

La led ne doit pas clignoter par défaut, mais seulement quand le bouton sera appuyé. Le métronome doit donc être inactif à l'initialisation. Il faut donc le préciser avec le dernier paramètre prenant la valeur MT_OFF:

MTdoubleClock Metronome( ...,  MT_OFF);

Si on précise ce paramètre, il faut aussi préciser le paramètre précédent. C'est le nombre d'actions qui ici va être donné comme infini. Il ne s'arrêtera pas au bout d'un compte d'actions, mais par une action extérieure (le bouton). La définition complète du métronome est donc:

MTdoubleClock Metronome(500 milli_secondes, 100 milli_secondes, allume, eteint, MT_INFINI, MT_OFF);

Il faut comme dans tous les programmes qui utilisent MTobjets, inclure la bibliothèque utile. Ici on utilise un double métronome (le nom de l'objet est MTdoubleClock):

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

Pour la fonction j'appuie ça clignote, je rappuie ça s'arrête correspond à l'objet MTcheckButton. C'est donc lui que nous allons utiliser.

On va commencer par donner un nom symbolique à la broche utilisée par le bouton:

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

Définissons notre bouton:

MTcheckButton Bouton(PIN_BUTTON, marche, arrêt);

Cela définit un bouton nommé "Bouton". Il est du type MTcheckButton car c'est un poussoir simple. Il y a trois paramètres à passer:
- le nom de la broche
- le nom de la fonction qui va être appelée si on appuie sur le bouton
- le nom de la fonction qui va être appelée si on rappuie le bouton
Les fonctions appelées ne doivent pas avoir de paramètres et ne doivent rien retourner.

MTcheckButton 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 marche et arret qui doivent être définis auparavant. Il va donc falloir les définir avant cette ligne. marche va permettre le clignottement. Cette fonction va donc appeler la fonction start du métronome ce qui fera clignoter la led. La fonction arret appellera le fonction stop du métronome, forçant ainsi l'arrêt du clignotement. Au cas où la led serait allumée quand on relâche le bouton, il faut éteindre la led par défaut. Voici la définition des deux fonctions:

void marche(void)
{
  Metronome.start();
}

void arret(void)
{
  Metronome.stop();
  eteint();
}

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.

Il faut comme dans tous les programmes qui utilisent MTobjets, inclure la bibliothèque utile. Ici on utilise un bouton bistable (le nom de l'objet est MTcheckButton):

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

setup()

Comme on utilise une broche pour commander une led, il faut la déclarer en sortie:

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

loop()

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 métronome.

Programme complet

Voici donc le programme complet:

// Ce programme fait clignoter LED_BUILTIN quand un bouton est appuyé

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

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



void allume(void)
{
  digitalWrite(LED_BUILTIN, HIGH);
}

void eteint(void)
{
  digitalWrite(LED_BUILTIN, LOW);
}

MTdoubleClock Metronome(500 milli_secondes, 100 milli_secondes, allume, eteint, MT_INFINI, MT_OFF);



void marche(void)
{
  Metronome.start();
}

void arret(void)
{
  Metronome.stop();
  eteint();
}

MTcheckButton Bouton(PIN_BUTTON, marche, arret);



void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop(){}