Calcul temps entre chaque appuie de bouton

Bonjour à tous,
J’ai fait un petit montage ou j’aimerais calculer le temps écoulé entre chaque appuie de bouton, cela fonctionne cependant des fois quand j’appuie sur le bouton, cela s’affiche deux fois dans le moniteur donc une fois avec le temps correct et une deuxième fois avec un temps très faible comme si je faisais un deuxième appuie extrêmement rapidement après le premier or ce n’est pas le cas:

Exemple moniteur :
00:04:49.264 → La différence de temps entre les deux derniers appuies est de 0.76
00:04:50.042 → La différence de temps entre les deux derniers appuies est de 0.09

Programme
#include <math.h>
const int bouton = 2;
const int ledPin = 13;
unsigned long time_now;
int etatBouton = 0;
long temps1 =0;
long temps2=0;
int verifstate=0;
long difftemps=0;
void setup() {
Serial.begin(9600);
pinMode(bouton, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}

void loop()
{
time_now=millis();

etatBouton = digitalRead(bouton);

if(etatBouton == HIGH) // test si le bouton a un niveau logique HAUT
{
digitalWrite(ledPin, LOW); //le bouton est relâché, la LED est allumée
verifstate=0;

}
else // test si le bouton a un niveau logique différent de HAUT (donc BAS)
{
digitalWrite(ledPin, HIGH); //la LED reste éteinte
if(verifstate==0){
temps2=temps1;

temps1=time_now;
difftemps=temps2-temps1;
Serial.print("La différence de temps entre les deux derniers appuies est de ");
Serial.println(fabs(difftemps)/1000);
verifstate=1;
}

}

}
Montage

Comment puis-je régler ce problème ?

Il s'agit de rebonds du contact du bouton. Essaie d'utiliser la librairie bounce2.

Merci beaucoup,
si ça peut aider voici mon code avec la librairie Bounce2

#include <math.h> 
#include <Bounce2.h>
const int bouton  = 2;    
const int ledPin     = 13;  
unsigned long time_now; 
int etatBouton     = 0;        
long temps1 =0;
long temps2=0;
int verifstate=0;
long difftemps=0;
Bounce debouncer = Bounce();
void setup() {
  Serial.begin(9600);
  pinMode(bouton, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);  
  debouncer.attach(bouton,INPUT_PULLUP); // Attach the debouncer to a pin with INPUT_PULLUP mode
  debouncer.interval(25); // Use a debounce interval of 25 milliseconds
}
 
void loop()
{
    time_now=millis();  
    debouncer.update();
    
    etatBouton = digitalRead(bouton);

    
    if(etatBouton == HIGH) // test si le bouton a un niveau logique HAUT
    {
        digitalWrite(ledPin, LOW); //le bouton est relâché, la LED est allumée
        verifstate=0;

    }
    if ( debouncer.fell() ) {  // test si le bouton a un niveau logique différent de HAUT (donc BAS)
    
        digitalWrite(ledPin, HIGH); //la LED reste éteinte
        if(verifstate==0){
          temps2=temps1;
          
          temps1=time_now;
          difftemps=temps2-temps1;
          Serial.print("La différence de temps entre les deux derniers clics est de "); 
          Serial.println(fabs(difftemps)/1000);
          verifstate=1;
        }


    }


}

Je sens que tu dois urgemment lire les règles du forum qui figure dans les premiers sujets en haut de chaque page d’accueil… et faire les changements dans tes messages sinon >>>>>> poubelle

Bonjour Nestati,

Pour vous éviter les foudres et repésailles de la modération :

Bonjour,

Pour bien mettre votre code en bonne forme :slight_smile:

→ cliquez sur </> (en haut juste dans le coin gauche, au dessus des smiley)
→ des balises [ Code] et [ /Code] apparaissent.
(Sans les espaces que j’ai du ajouter sinon cela ne s’afficherait pas ici)

->Coller y votre Code entre. Voilà c’est fait!

Voir :

Cordialement,
bidouilleelec

ou : Faire un Nouveau Sujet ou le corriger avec les Balises... - Français - Arduino Forum