délai de pression sur bouton poussoir

étudiez ce code

J'AI MIS 2 BUG DANS LE CODE
A VOUS DE LES TROUVER POUR COMPRENDRE LA LOGIQUE

le délai pour tenir le bouton enfoncé est de 5 secondes pour le test car pas la patience d'attendre 20 secondes. c'est réglable dans le define DELAI_PRESSION

// NOTE j'utilise le bouton pour connecter la pin au GROUND avec un INPUT_PULLUP.
// donc quand la pin voit HIGH c'est que le bouton n'est PAS appuyé
// quand la pin voit LOW c'est que le bouton est appuyé
// la "logique" est inversée
const int bpPin = 8; // le bouton est connecté sur la pin 8 configurée en PULLUP.
#define BOUTON_ENFONCE LOW // pour la lisibilité du code
#define DELAI_PRESSION 5000UL // le UL pour dire unsigned Long (j'ai mis 5 secondes pour tester, mettre 20000UL pour 20 secondes)
boolean boutonAppuye; // vrai si le bouton est appuyé

unsigned long tempsDebut; // pour mesurer le temps d'appui
boolean enCoursDeDecompte; // vrai si le bouton a été appuyé plus de DELAI_PRESSION ms

#define DUREE_DECOMPTE 20000UL      // on va décompter 20 secondes
long compteur; // la variable qui contient le nombre de secondes restantes quand on décompte
unsigned long debutTempsDecompte;   // le moment de démarrage du décompte


void setup() {
  Serial.begin(115200);
  pinMode(bpPin, INPUT_PULLUP);
  boutonAppuye = false ;
  enCoursDeDecompte = false;
}

void testAppuiLong()
{
  byte positionDuBouton =  digitalRead(bpPin);

  if (( positionDuBouton == BOUTON_ENFONCE) && (!boutonAppuye)) { // le ! veut dire NOT
    // le bouton est enfoncé et ne l'était pas avant, donc c'est un appui
    boutonAppuye = true;
    tempsDebut = millis();

    // CODE DE DEBUG ----------------------------------------------
    Serial.print("\n\nBouton appuye tps =");
    Serial.print(tempsDebut);
    Serial.println(" ms");
    // ------------------------------------------------------------

  } else if (( positionDuBouton != BOUTON_ENFONCE) && (boutonAppuye) ) {
    // le bouton n'est plus enfoncé et l'était  avant, donc c'est un relachement.    boutonAppuye = false;

    // CODE DE DEBUG ----------------------------------------------
    Serial.println("bouton off");
    // ------------------------------------------------------------
  }

  if ((!enCoursDeDecompte) && boutonAppuye && (millis() - tempsDebut >= DELAI_PRESSION)) {
    enCoursDeDecompte = true;
    debutTempsDecompte = millis();
    compteur = (DUREE_DECOMPTE / 1000UL);

    // CODE DE DEBUG ----------------------------------------------
    Serial.print("Bingo - bouton appuye assez longtemps (");
    Serial.print(millis() - tempsDebut);
    Serial.println(" ms)\n\n");
    // ------------------------------------------------------------
  }
}

void effectuerDecompte()
{
  static unsigned long dernierMomentAffichage = 0UL;

  if (millis() - dernierMomentAffichage >= 1000UL) { // une seconde s'est elle écoulée?
    // on affiche quelque chose toutes les secondes et on met à jour le dernierMomentAffichage avec millis()
    dernierMomentAffichage = millis();
    if (compteur > 0) {
      // CODE DE DEBUG ----------------------------------------------
      Serial.print("Temps restant = ");
      Serial.print(compteur);
      Serial.println(" s");
      // ------------------------------------------------------------

      // on décrémente le temps restant d'une seconde compteur--;

    } else {
      // CODE DE DEBUG ----------------------------------------------
      if (compteur == 0) Serial.println("BOUM!"); else Serial.print(".");
      // ------------------------------------------------------------

      compteur--; // le compteur passe négatif et contient le nombre de secondes depuis l'expiration du délai
    }
  }
}


void loop() {
  if (enCoursDeDecompte) {
    // faire ici le décompte
    effectuerDecompte();
  } else {
    // on regarde s'il y a un long appui
    testAppuiLong();
  }
}

Pour tester, chargez le code sur votre arduino, connectez la console à 115200, connectez un bout de fil sur la pin 8 et touchez la masse (connectez à une pin ground) pour simuler l'appui sur le bouton.

quand vous aurez compris le code et enlevé les 2 bugs; vous pourrez voir cela (j'ai appuyé 1 fois pas assez longtemps et suffisamment longtemps la 2ème fois)

Bouton appuye tps =12692 ms
bouton off


Bouton appuye tps =15979 ms
Bingo - bouton appuye assez longtemps (5000 ms)


Temps restant = 20 s
Temps restant = 19 s
Temps restant = 18 s
Temps restant = 17 s
Temps restant = 16 s
Temps restant = 15 s
Temps restant = 14 s
Temps restant = 13 s
Temps restant = 12 s
Temps restant = 11 s
Temps restant = 10 s
Temps restant = 9 s
Temps restant = 8 s
Temps restant = 7 s
Temps restant = 6 s
Temps restant = 5 s
Temps restant = 4 s
Temps restant = 3 s
Temps restant = 2 s
Temps restant = 1 s
BOUM!
.................