// But : Attendre – avec l’instruction while() – que le bouton poussoir soit relâché avant de continuer le programme
// Auteur : Alain Boudreault
// Documenté par : Karine Moreau
// Date : Septembre 2022
#define PUSH_BUTTON 7 // Le bouton poussoir est connecté sur la broche digitale 7
#define PAUSE 300 // Durée d'attente en milleseconde
#define DELAI_ANTI_REBOND 5 // Temps d'attente en ms pour éliminer la période de bruit du bouton
void setup() {
Serial.begin(9600);
Serial.println("Setup : Debut du programme");
pinMode(PUSH_BUTTON,INPUT); // Configurer le microncontrôleur pour que la broche digitale 7 soit en entrée, le microcontrôle reçoit de l'information de la part du bouton
}
void loop() {
// Pour éviter que la variable soit remise constamment à 0 à chaque passage dans la loop
// on utilise le mot static au moment de sa déclaration
static unsigned int nbFoisAllume = 0; // Déclaration d'une variable pour compter le nombre de fois qui est initialisée à 0 une seule fois au moment de sa déclaration.
// il faut déclarer une variable et utiliser la fonction digitalRead pour stocker l'état du bouton dans la variable
int etatBouton = digitalRead(PUSH_BUTTON); // Appel de la fonction digitalRead en lui passant le numéro de la broche qu'il faut lire en paramètre.
// si le bouton est dans l'état enfoncé, on augmente le nombre de fois de 1
if (etatBouton == HIGH) {
delay(DELAI_ANTI_REBOND); // Délai pour stabiliser le bouton poussoir et éviter les variations entre le 0 et 1 (voir explications fin du programme)
//nbFoisAllume = nbFoisAllumé + 1; // Augmente le nombre de fois de 1
nbFoisAllume++; // En C++, comme en informatique c'est souvent que l'on augmente une variable de 1, il y a un raccourci qui est ++
// On affiche le nombre de fois dans la console
Serial.print("Le bouton a été enfoncé ");
Serial.print(nbFoisAllume); // imprime dans la console le nombre de fois que le bouton a été enfoncé
Serial.print(" fois\n");
// Le but du programme-ci est d'enlever le délai établi arbitrairement et de faire attendre la fonction loop tant que le bouton n'est pas relâché par l'utilisateur
// delay(PAUSE);
// Première boucle while dont on peut ensuite réduire le code pour être plus efficace ...
/* while(etatBouton == HIGH) {
// On relit l'état du bouton pour savoir s'il a changé en cours de route : est-ce que l'utilisateur l'a relâché
etatBouton = digitalRead(PUSH_BUTTON);
} // fin du while
*/
// ... Ou de façon plus courte et plus efficace car moins d'instructions exécutées (comparaison et affectation)
while(digitalRead(PUSH_BUTTON));
delay(DELAI_ANTI_REBOND); // Délai pour stabiliser le bouton poussoir et éviter les variations entre le 0 et 1
} // fin du if
}// fin de loop
// Quand on exécute ce programme, plusieurs messages "Le bouton a été enfoncé x fois" s'affichent en même temps quand on appuie
// ou on relâche le bouton. C'est l'effet de la mécanique du bouton poussoir qui pendant un laps de temps très court (1 à 5 ms)
// oscille entre 0 et 1 avant de se stabiliser correctement. Pour éviter de lire la broche à ce moment d'instabilité, on va mettre
// un court delai de 5 ms au début et à la fin du if.