Problème répétition avec Bounce2

Bonjour à tous et à toutes,

Je rencontre un problème vraiment tout c** avec un code simple qui utilise la librairie Bounce2 et 4 boutons poussoirs. Le principe est très simple, on appuie sur un bouton, ça lance un séquence de tâches et chaque bouton a sa propre séquence. Je n’ai normalement pas besoin de gérer l’état de mes bouton car chaque appuie déclenche la séquence et rien d’autre. Les tâches ne sont pas détaillées ici car elles n’apporte rien à mon problème, j’ai juste mis une fonction_led() pour illustrer la séquence.

Voici le code en question :

#include <Bounce2.h>

int ledPin = 2;

int bpeh = 14;
int bpeb = 15;
int bpch = 16;
int bpcb = 17;

Bounce debouncerbpeh = Bounce();
Bounce debouncerbpeb = Bounce();
Bounce debouncerbpch = Bounce();
Bounce debouncerbpcb = Bounce();

void setup() {
	Serial.begin(9600);
	
	pinMode(ledPin, OUTPUT);
	
	pinMode(bpeh,INPUT_PULLUP);
	debouncerbpeh.attach(bpeh);
	debouncerbpeh.interval(8);
	
	pinMode(bpeb,INPUT_PULLUP);
	debouncerbpeb.attach(bpeb);
	debouncerbpeb.interval(8);	
	
	pinMode(bpch,INPUT_PULLUP);
	debouncerbpch.attach(bpch);
	debouncerbpch.interval(8);	
	
	pinMode(bpcb,INPUT_PULLUP);
	debouncerbpcb.attach(bpcb);
	debouncerbpcb.interval(8);	
}

void loop(){
	debouncerbpeh.update();
	debouncerbpeb.update();
	debouncerbpch.update();
	debouncerbpcb.update();
	
	int valuebpeh = debouncerbpeh.read();
	int valuebpeb = debouncerbpeb.read();
	int valuebpch = debouncerbpch.read();
	int valuebpcb = debouncerbpcb.read();
  
	if(valuebpeh == LOW){
		Serial.print("bpeh");
		Serial.print("\n");
                fonction_led();
	}
	if(valuebpeb == LOW){
		Serial.print("bpeb");
		Serial.print("\n");
		fonction_led();
	}
	if(valuebpch == LOW){
		Serial.print("bpch");
		Serial.print("\n");
		fonction_led();
	}
	if(valuebpcb == LOW){
		Serial.print("bpcb");
		Serial.print("\n");
		fonction_led();
	}
}

void fonction_led(){
	Serial.print("fonction LED");
	Serial.print("\n");
	digitalWrite(ledPin, LOW);
	delay(200);
	digitalWrite(ledPin, HIGH);
}

Mon problème est le suivant : lorsque j’appuie sur un bouton, n’importe lequel, ma fonction_led() est bien appelée, ainsi que le SerialPrint associé. Jusque là, tout va bien. Par contre, lorsque je relache le bouton, ma fonction_led() est appelée une nouvelle fois ! Donc à chaque appuie, ma fonction est appelée 2 fois, et de multiples fois si je reste appuyé.

Est-ce parce qu’il faut que j’utilise des variable d’état de mes bouton en plus ?

Deuxième question qui me vient à l’esprit, pourquoi faut-il que je mette ma LED à LOW pour qu’elle s’allume et à HIGH pour qu’elle s’éteigne ?

J’imagine que mes questions doivent paraître simple à certains, mais un peu d’aide serait grandement appréciée !

A bientôt.

Bonjour,
Il vaut mieux utiliser la foncion fell() à la place. Elle gère automatiquement les fronts en appliquant l’anti-rebond. read() ne fait que lire l’état de la pin d’entrée sans appliquer d’anti-rebond.

genre:

if debouncerbpeh.fell(){
                Serial.print("bpeh");
		Serial.print("\n");
                fonction_led();
}

Enfin moi je l’utilise ainsi et ça fonctionne très bien :slight_smile:

Bonjour

Un équivalent est disponible ici sur le forum

Globalement très similaire
un chouille moins gourmand en ram
moins de lignes à coder (pinMode et délai de debounce embarqués directement dans le constructeur)
francophone, avec des primitives du style if (bouton.vientDEtreEnfonce())

Bonjour,

Merci pour vos deux réponses. Je testes ça ce week-end et je fais un retour. Mais j'aurai une préférence pour la librairie de Bricoleau ! Si c'est français en plus pour une fois, il ne faut pas s'en priver !

Merci !

Bonjour

Cet échange m'a donné une nouvelle idée.

Je mettrai en ligne ce soir une version 3 de cette bibliothèque.
En ajoutant seulement une ligne dans le .h, la couverture du besoin le plus basique (détecter l'appui sur un bouton) sera d'une simplicité redoutable :slight_smile:

Voilà c'est publié

Malheureusement je n’ai pas eu le temps de tester ce week-end, mais merci pour ton partage. Effectivement on ne peut pas faire plus simple là !!