Cooldwn sur un bouton poussoir

Bonjour,
Je débute dans le codage arduino et je rencontre une difficulté :
j'utilise 3 bouton et un LCD I2C pour faire un simple compteur de clique, sauf que certain clique compte double ou triple. Existe il un moyen d'intégrer un cooldown pour éviter de comptabiliser les appuis long?
Voici mon code actuel

#include <rgb_lcd.h>

int reseau = 0;

int affiche = 0;

int BAO = 0;

rgb_lcd lcd;

void setup() {
  lcd.begin(16, 2);
  pinMode(4, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);

  reseau = 0;
  affiche = 0;
  BAO = 0;
}

void loop() {
  if (digitalRead(4) == 1) {
    reseau = (reseau + 1);
  }
  if (digitalRead(2) == 1) {
    affiche = (affiche + 1);
  }
  if (digitalRead(3) == 1) {
    BAO = (BAO + 1);
  }

  lcd.setCursor(0, 0);
  lcd.print("Res  Aff   BAO");
  lcd.setCursor(0, 2);
  lcd.print(reseau);
  lcd.setCursor(5, 2);
  lcd.print(affiche);
  lcd.setCursor(11, 2);
  lcd.print(BAO);
  delay(100);
}

ça s'appelle du rebond.

sinon pour bien débuter avec l'arduino, un bon point de départ c'est de lire les tutos d'eskimon. il y a un tuto sur les boutons.

Il faut aussi regarder / lire le tuto de base sur le C++ de OpenClassroom

une fois que vous aurez compris le principe, vous pourrez utiliser une bibliothèque qui simplifie la vie ➜ par exemple bibliothèque Button dans easyRun de @bricoleau ou OneButton de Matthias Hertel ou encore Toggle de @dlloyd et autre Bounce2

J'avais déjà regarder ses tutos pour essayer de comprendre mais je n'ai pas trouver de solution qui me conviens. Est il possible de régler ce problème par code car j'utilise des composant Grove?

c'est ce que font les bibliothèques que j'ai mentionnée

Vous n'avez pas dû passer assez de temps sur

Désolé :sweat_smile:
Je Vien de trouver une solution en rajoutant du délais après mes incrémentation :

#include <rgb_lcd.h>

int reseau = 0;

int affiche = 0;

int BAO = 0;

rgb_lcd lcd;

void setup() {
  lcd.begin(16, 2);
  pinMode(4, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);

  reseau = 0;
  affiche = 0;
  BAO = 0;
}

void loop() {
  if (digitalRead(4) == 1) {
    reseau = (reseau + 1);
    delay(500);
  }
  if (digitalRead(2) == 1) {
    affiche = (affiche + 1);
    delay(500);
  }
  if (digitalRead(3) == 1) {
    BAO = (BAO + 1);
    delay(500);
  }

  lcd.setCursor(0, 0);
  lcd.print("Res  Aff   BAO");
  lcd.setCursor(0, 2);
  lcd.print(reseau);
  lcd.setCursor(5, 2);
  lcd.print(affiche);
  lcd.setCursor(11, 2);
  lcd.print(BAO);
  delay(100);
}

Merci quand même pour vos réponses rapide
Bonne journée

et si vous tenez le bouton appuyé 501 ms il se passe quoi ?

ce n'est pas une solution

Bonjour lucador

Mouai :woozy_face: ajouter un délais n'est pas vraiment la solution, alors qu'il existe pléthores de bibliothèques comme JC_Button
image

qui facilitent le traitement des boutons.

Voilà un exemple pour tes boutons:

#include <JC_Button.h> // https://github.com/JChristensen/JC_Button

const int btnReseauPin = 4;
const int btnAffichePin = 2;
const int btnBAOpin = 3;

Button btnReseau(btnReseauPin); // Défiition du bouton réseau
Button btnAffiche(btnAffichePin); // Défiition du bouton affiche
Button btnBAO(btnBAOpin); // Défiition du bouton BAO

int reseau = 0;
int affiche = 0;
int BAO = 0;

void setup() {
	Serial.begin(115200);

	btnReseau.begin(); // "Démarrage" du bouton
	btnAffiche.begin();
	btnBAO.begin();

	reseau = 0;
	affiche = 0;
	BAO = 0;
}

void loop() {
	btnReseau.read(); // Lecture du bouton
	btnAffiche.read(); // Lecture du bouton
	btnBAO.read(); // Lecture du bouton

	if (btnReseau.wasPressed()) // Si le bouton Réseau a été pressé
	{
		reseau += 1;
		Serial.println("Resesau = " + String(reseau));
	}

	if (btnAffiche.wasPressed())
	{
		affiche += 1;
		Serial.println("Affiche = " + String(affiche));
	}

	if (btnBAO.wasPressed())
	{
		BAO += 1;
		Serial.println("BAO = " + String(BAO));
	}
}

L'écriture de ce programme pourrait être facilitée par l'usage de tableaux.
Mets la console à 115200:
image
pour voir l'affichage des compteurs.

A+
Cordialement
jpbbricole

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.