MTsoftPWM: Exemple 2
Ce programme va faire clignoter LED_BUILTIN avec des flashs
On va utiliser le PWM soft pour faire les flashs et un bouton type marche/arrêts pour commander le PWM. C'est le PWM qui fera donc les flashs et le bouton qu donnera le clignotement ou pas.
Le PWM
Cet objet va, quand on l'active, va faire des flashs (0,05s allumé, 0,05s éteint). Nous allons prendre un objet MTsoftPWM. Le signal va sortir sur la broche LED_BUILTIN (13):
MTsoftPWM Clignotant(LED_BUILTIN, ...
Cela va créer un objet (en gros une variable) de type MTsoftPWM qui fera nos 5 flashs.
Si l'on veut un cycle allumé pendant 0,05s et éteint pendant 0,05s en prenant un MTsoftPWM, il faut donner le temps de l'impulsion (état HIGH ou led allumée) et la période. Le temps à HIGH est de 0,05s et doit être exprimée en microsecondes. On peut écrire:
MTsoftPWM Clignotant(... 50000, ...
Mais pour documenter le code et pour rajouter des commentaires, nous allons donc écrire:
MTsoftPWM Clignotant(... impulsions_de 50000 micro_secondes, ...
Ainsi, nous saurons d'une part que c'est le temps de l'impulsion, et d'autre part que le temps est exprimé en microsecondes. Les mots impulsions_de et micro_secondes sont des mots commentaires ignorés 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.
De même pour donner la période, on préférera l'écriture:
MTsoftPWM Clignotant(... periodes_de 100000 micro_secondes, ...
Le paramètre suivant donne l'état de la led au début du clignotement, mais aussi l'état à l'initialisation. Comme on la préfère éteinte, il faut mettre ce paramètre à LOW:
MTsoftPWM Clignotant(..., on_commence_par LOW, ...;
L"expression on_commence_par est un mot commentaire.
Le paramètre suivant indique le nombre de niveaux avant l'arrêt du PWM. Ici, comme il ne doit pas s'arrêter seul (c'est le bouton qui demandera l'arrêt), on peut donner la valeur MT_INFINI ou ne rien donner du tout car c'est la valeur par défaut.
Le paramètre suivant donne le nom d'une fonction qui sera appelée quand le train d'impulsion sera terminé. Par défaut on n'appelle rien, ce qui nous convient ici.
Le paramètre d'après est l'état du PWM, en marche (par défaut) ou en arrêt à l'initialisation. A l'initialisation, je propose que la led ne clignote pas. Il faut donc impérativement le dire en donnant la valeur MT_OFF qui n'est pas la valeur par défaut. Comme on doit préciser ce paramètre, il faut préciser tous les paramètre précédents:
MTsoftPWM Clignotant(..., MT_INFINI, PAS_D_ACTION, MT_OFF);
La définition complète de notre PWM est donc:
MTsoftPWM Clignotant(LED_BUILTIN, impulsions_de 500000 micro_secondes, periodes_de 1000000 micro_secondes, on_commence_par LOW, MT_INFINI, PAS_D_ACTION, MT_OFF);
Il faut comme dans tous les programmes qui utilisent MTobjets, inclure la bibliothèque utile. Ici on utilise comme seul objet un PWM (le nom de l'objet est MTsoftPWM):
#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.
.Clignotement ou pas?
C'est le bouton qui va commander le PWM.
Pour la fonction j'appuie ça s'allume, je rappuie ça s'éteint correspond à l'objet MTcheckButton de base. C'est donc lui que nous allons utiliser.
On va commencer par donner des noms symboliques à 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, allume, eteint);
Cela définit un bouton nommé "Bouton". Il est du type MTcheckButton, il est du type case à cocher. 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 une première fois sur le bouton (appuis impairs)
- le nom de la fonction qui va être appelée si on appuie une seconde fois le bouton (appuis pairs)
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 "allume" et "eteint" qui doivent être définies auparavant. Il va donc falloir les définir avant cette ligne. Voici leur définition:
void allume(void) { Clignotant.start(); } void eteint(void) { Clignotant.stop(); }
En fait quand on va arrêter le PWM, la led peut être allumée ou éteinte. Il va donc falloir en plus imposer un état LOW au cas ou l'appui sur le bouton se ferait led allumée:
void eteint(void) { Clignotant.stop(); digitalWrite(LED_BUILTIN, LOW); // On ne sait pas quand on l'arrête }
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 comme seul objet un bouton va et vient (le nom de l'objet est MTcheckButton):
#include "MTcheckButton.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.
setup() et loop()
Il n'y a rien à faire de plus, setup() et loop() ne nous servent à rien. Il vont rester vide. Mais vous pouvez y mettre un autre programme, celui que nous avons fait est indépendant. Donc:
void setup(){} void loop(){}
J'ai tout mis sur la même ligne mais vous pouvez en prendre deux ou trois. Même si les fonctions sont vides et ne nous servent à rien apparemment, il faut les définir. En fait, loop() va servir de boucle d'attente car notre programme ne fait pus rien après initialisation.
Programme complet
Voici donc le programme complet:
// Ce programme fait clignoter une led avec un bouton marche arrêt #include "MTsoftPWM.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 MTsoftPWM Clignotant(LED_BUILTIN, impulsions_de 500000 micro_secondes, periodes_de 1000000 micro_secondes, on_commence_par LOW, MT_INFINI, PAS_D_ACTION, MT_OFF); void allume(void) { Clignotant.start(); } void eteint(void) { Clignotant.stop(); digitalWrite(LED_BUILTIN, LOW); // On ne sait pas quand on l'arrête } MTcheckButton Bouton(A0, allume, eteint); void setup(){} void loop(){}