// 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.