Déclaration d'un objet statique, utilisation de onSelectFunction Voir Timer: Exemple-810-Timer-Statique.ino
Déclaration d'un objet dynamique globale, utilisation de onSelectFunction Voir Timer: Exemple-811-Timer-Dynamique.ino
Utilisation de actif, depart et duree_ms Voir Timer: Exemple-812-Maison-Timer-duree.ino.ino
Pour se détendre, utilisation de Timer et PushZone Voir Timer: Exemple-812-Maison-Timer-duree.ino.ino
Dans les deux premiers exemple, deux temporisateur changent la couleur de l'écran, noir 3 secondes,
couleur 1/2 seconde. Il y a plusieurs façons de le faire, on peut la plupart du temps n'utiliser que
la première forme. D'autres sont intéressantes si on a plusieurs temporisateurs identiques, mais dans
l'exemple simplifié, comme c'est la mise en place qui me préoccupe, les programmes sont réduits, et
l'intérêt de telles déclarations n'apparaît plus. Toutes les formes des appels sont semblables aux
appels de Clock pour lesquels tout est détaillé. Reportez-vous à cette
page pour plus de détail. Ici n'est décrit ce qui est le plus courant.
Le troisième exemple montre une utilisation des variables actif, depart et
duree_ms. De plus elle montre un cas rare ou scanEvent() n'est pas tout seul dans le
loop.
Premier exemple: déclaration statique
PecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-810-Timer-Statique\Exemple-810-Timer-Statique.ino (dans votre fichier téléchargé):
// Mise en place de deux temporisateur. L'un colorie l'écran au bout de 3
// secondes, l'autre efface l'écran au bout d'une demi-seconde. Il se déclenche
// l'un l'autre. Du coup, l'écran se colorie une seconde, s'éteint deux...
#include <PecheuxGraph.h> // Appel de la bibliothèque
// Déclarations statique des instances
Timer temporisateurQuiAllume(3000); // Déclaration d'un temporisateur, qui attendra 3s avant d'allumer l'écran
Timer temporisateurQuiEteint(500); // Déclaration d'un temporisateur, qui attendra 1/2s avant d'éteindre l'écran
// Déclaration des fonctions qui feront ce qu'il faut faire toutes les fin de comptage
void fautAllumer(void) // Action à faire au bout de 3s
{
clrscr(RANDOM_COLOR); // Allume l'écran
temporisateurQuiEteint.start(); // Démarre son copain
}
void fautEteindre(void) // Action à faire au bout d'une demi-seconde
{
clrscr(); // Eteint l'écran
temporisateurQuiAllume.start(); // Démarre son copain
}
void setup()
{
setGraphMode(PAYSAGE); // Pour pouvoir utiliser clrscr()
// Associations des fonctions
temporisateurQuiAllume.onTimeFunction=&fautAllumer;
temporisateurQuiEteint.onTimeFunction=&fautEteindre;
// Déclenchement la première fois d'un temporisateurs. Par défaut, ils sont désactivés.
// Quand, l'un s'arrête, il se désactive et active son copain. Par contre il faut initier
// la boucle
temporisateurQuiAllume.start();
}
void loop()
{
scanEvent(); // Gestion des boutons et des horloges, le plus souvent seul dans loop()
}
Deuxième exemple: Déclaration dynamique
PecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-811-Timer-Dynamique\Exemple-811-Timer-Dynamique.ino (dans votre fichier téléchargé):
// Mise en place de deux temporisateur. L'un colorie l'écran au bout de 3
// secondes, l'autre efface l'écran au bout d'une demi-seconde. Il se déclenche
// l'un l'autre. Du coup, l'écran se colorie une seconde, s'éteint deux...
#include <PecheuxGraph.h> // Appel de la bibliothèque
// Déclarations dynamique des instances
Timer *temporisateurQuiAllume = new Timer(3000); // Déclaration d'un temporisateur, qui attendra 3s avant d'allumer l'écran
Timer *temporisateurQuiEteint = new Timer(500); // Déclaration d'un temporisateur, qui attendra 1/2s avant d'éteindre l'écran
// Déclaration des fonctions qui feront ce qu'il faut faire toutes les fin de comptage
void fautAllumer(void) // Action à faire au bout de 3s
{
clrscr(RANDOM_COLOR); // Allume l'écran
temporisateurQuiEteint->start(); // Démarre son copain
}
void fautEteindre(void) // Action à faire au bout d'une demi-seconde
{
clrscr(); // Eteint l'écran
temporisateurQuiAllume->start(); // Démarre son copain
}
void setup()
{
setGraphMode(PAYSAGE); // Pour pouvoir utiliser clrscr()
// Associations des fonctions
temporisateurQuiAllume->onTimeFunction = &fautAllumer;
temporisateurQuiEteint->onTimeFunction = &fautEteindre;
// Déclenchement la première fois d'un temporisateurs. Par défaut, ils sont désactivés.
// Quand, l'un s'arrête, il se désactive et active son copain. Par contre il faut initier
// la boucle
temporisateurQuiAllume->start();
}
void loop()
{
scanEvent(); // Gestion des boutons et des horloges, le plus souvent seul dans loop()
}
Troisième exemple: Utilisation de actif, depart et duree_ms
PecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-812-Maison-Timer-duree\Exemple-812-Maison-Timer-duree.ino (dans votre fichier téléchargé):
// L'intérieur d'une maison est dessinée. Deux boutons de type PushZone
// permettent d'allumer la lumière pendant 6s
// En principe scanEvent() est seul dans loop(). Ici c'est une exception, on
// va profiter de loop pour afficher l'état du temporisateur.
#include <PecheuxGraph.h>
// Définition des objets
PushZone bouton1(186, 124, 212, 152); // Définit une zone cliquable, notre bouton de droite
PushZone bouton2(8, 124, 34, 152); // Définit une zone cliquable, notre bouton de gauche
Timer minuterie(6000); // Minuterie principale de 6 secondes
void aiguilleDuChronometre(void) // Le chronomètre au dessus de la porte
{
if (minuterie.actif) // Si on compte le temps
{
float angle = ((millis() - minuterie.depart) * PI) / (minuterie.duree_ms >> 1); // angle que fait la ligne à tracer
line(264, 26, 264 + 9 * sin(angle), 26 - 9 * cos(angle), RED); // Augmente le camembert rouge
}
}
// Quand on appuie sur un bouton, on déclenche la minuterie, on dessine le chronomètre,
// et on allume la lampe
void debutMinuterie()
{
// Démarre la temporisation
minuterie.start();
// Dessin de la minuterie (pour faire patienter)
fillCircle(264, 26, 10, GREY); // Corps du chronomètre (efface le rouge si il en avait)
circle(264, 26, 10, BLACK); // Monture
fillCircle(255, 17, 2); fillCircle(264, 13, 2); fillCircle(273, 17, 2); // 3 boutons
// On allume la lampe
fill(160, 30, YELLOW);
}
// Quand le temps est écoulé, on efface le chronomètre et on éteint la lampe
void finMinuterie()
{
fillRect(253, 11, 275, 36, GREY); // On efface le chronomètre
fill(160, 30, BLACK); // On éteint la lampe
}
void setup()
{
setGraphMode(PAYSAGE); // Initialisation
// Consigne tout en bas
setTextCursor(0, 180);
text(F("\n Appuyez sur les boutons de\n chaque côté de la fentêre"));
maison(1, 1); // On dessine l'intérieur de la maison
fillRect(253, 11, 275, 36, GREY); // Boite en plastique contenant le chronomètre
// Mise en place des comportements des objets
bouton1.onClicFunction = &debutMinuterie; // Bouton de droite, c'est le début de la minuterie
bouton2.onClicFunction = &debutMinuterie; // Bouton de gauche, c'est le début de la minuterie
minuterie.onTimeFunction = &finMinuterie; // En fin de temporisation tout s'arrête
}
void loop()
{
scanEvent(); // Lance le gestionnaire
aiguilleDuChronometre(); // dessine le camembert du chronmètre
}
Voir aussi:
- scanEvent(); Moteur de la gestion des évènements
- Clock; Métronome (actions régulières)
|