MTdoubleClock: Exemple 4

On veut réaliser une led clignotante, mais pour laquelle l'état allumé sera remplacé par 5 flashs. Cela donne en terme de chronogramme:

chronogramme d'une led qui clignote en flashant

On va utiliser une première hologe qui va délivrer 5 flashs et qui sera régulièrement mise en marche par une deuxième horloge.

5 flashs

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 50ms et éteint pendant 100ms il faut bien prendre un MTdoubleClock qui permet de différentier les deux temps différents:

MTdoubleClock CinqFlash( ...

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 100ms:

MTdoubleClock CinqFlash(100 milli_secondes, ... , allume, ...

Les temps étant exprimés obligatoirement en millisecondes, on a donc le nombre 100. 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 50ms. On aura donc:

MTdoubleClock CinqFlash(100 milli_secondes, 50 milli_secondes, allume, eteint, ... 

A chaque fois que l'on déclenche ce métronome, il faut ne faire que 5 flashs. On va donc programmer ce métronome pour qu'il s'arrête au bout de 10 actions (5 allumage et 5 extinctions):

MTdoubleClock CinqFlash( ..., 10 actions_et_arret, ...

actions_et_arret est aussi un mot commentaire.

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 CinqFlash( ...,  MT_OFF);

La définition complète du métronome est donc:

MTdoubleClock CinqFlash(100 milli_secondes, 50 milli_secondes, allume, eteint, 10 actions_et_arret, 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.

Déclenchement toutes les 2 secondes

Il faut maintenant déclencher le métronome CinqFlash toutes les deux secondes. Cela va donc se faire avec un deuxième métronome. Ce dernier n'ayant qu'une seule action régulière à faire, sera du type métronome simple, un MTclock. Toutes les deux secondes il va donc appeler la fonction start de CinqFlash. Bien que ce soit une méthode qui n'a pas de paramètre et qui ne retourne rien, on ne peut pas l'appeler directement car ce n'est pas une fonction avec une adresse fixe. Il va donc falloir appeler une autre fonction flash qui va se charger d'appeler CinqFlash.start(). Cela donne:

void flash(void)
{
  CinqFlash.start();
}

MTclock Metronome(2000 milli_secondes, flash);

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

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

Si on analysait la bibliothèque, on pourrait voir que l'appel #include "MTdoubleClock" ramènera aussi le code pour les MTclock et l'appel ci-dessus est facultatif. Mais cela nécessite une connaissance de la bibliothèque qui n'est pas nécessaire et cela ne change pas le code final. Par défaut c'est plus simple de mettre en #include tous les objets utilisés.

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 flasher 5 fois une led

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

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

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

MTdoubleClock CinqFlash(100 milli_secondes, 50 milli_secondes, allume, eteint, 10 actions_et_arret, MT_OFF);



void flash(void)
{
  CinqFlash.start();
}

MTclock Metronome(2000 milli_secondes, flash);

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

void loop(){}