Appuie prolongé sur un bouton

Bonjour / Bonsoir :slight_smile:

À partir d'une fonction booléenne qui dit si un bouton est appuyé et de la fonction millis() (je ne sais pas s'il existe d'autres moyens, la fonction delay() étant bloquante), je cherche à créer une fonction (booléenne toujours) qui puisse me dire si un bouton a été appuyé pendant plusieurs secondes... voici une ébauche qui ne fonctionne pas :

bool press(int Bouton) //Renvoie vrai si le bouton passé en paramètre est pressé. OK.
{
      return(digitalRead(Bouton) == HIGH);
}

//////

bool pressProlong(int Bouton, int temps)
{
      int t1 = millis();
      int t2 = millis();
      bool pressed;
      while (t2-t1 > temps)
      {
         if (press(Bouton))
            {
              pressed=true;
            }
       }

      return(pressed);
}

Je suis bien conscient que cette fonction n'est pas infaillible : je pense qu'elle ne prend en considération que l'état du bouton à t2-t1 = temps (corrigez moi). Je pense avoir une idée : créer une variable qui va s'annuler si le bouton est relâché. Je m'explique : si press(Bouton) = true, on multiplie un entier par exemple 1, sinon on le multiplie par 0. Finalement, on regarde si cette variable est nulle et on retourne un Boolean. Qu'en pensez-vous ? Avez-vous une autre solution ?

J'ai trouvé sur la toile une fonction faisant intervenir les classes (une notion que je maitrise moyennement, n'étant qu'un débutant).

Merci d'avance ! :slight_smile:

Bonsoir
ça peux marcher?

bool pressProlong(int Bouton, int temps)
{
      int t1 = millis();
      while (millis()-t1 < temps) if (!press(Bouton)) return(false);

      while (press(Bouton));// attend le relâchement du Bouton, à mettre peut être
                           //après l'action à accomplir si le bouton est appuyé temps millis
      return(true);
}

A vérifier!

attention au rebonds, donc à voir comment vous appelez cette fonction pressProlong()
le problème aussi c'est que la fonction est bloquante tout le long de l'appui, si c'est un souci, l'approche serait de noter millis() au dernier appui et au dernier relâchement au fil de l'eau et de comparer la différence (soit avec millis() pour le temps d'appui, soit avec la valeur notée lors du relâchement suivant comment vous voulez que l'interface fonctionne)

sinon pour simplifier votre gestion des boutons, éventuellement utilisez la librairie de @bricoleau ou alors la librairie OneButton de Matthias Hertel.

Merci savoriano pour la réponse ! Ça fonctionne bien ! Merci J-M-L, mais je n’ai pas besoin de faire tourner quelque chose en parallèle, je me contenterai de la fonction delay() ici. C’est juste pour pouvoir lancer un programme.

OK - alors pas de problème autant faire simple !