Multi-actions par un seul bouton

Quelle serait la meilleure façon pour faire ceci? :

Dans la boucle
Si je presse un bouton 1 fois de suite je fais une action A
Si je presse un bouton 2 fois de suite je fais une action B
Si je presse un bouton 3 fois de suite je fais une action C
Si je presse un bouton 4 fois de suite je fais une action D

Je mettrais un compteur pour savoir depuis combien de temps une pression a était fait et j'attendrais un certains temps avant de faire l'action en fonction de la somme des appuis

Oui un compteur :

  1. si on veut choisir de faire l'action C, on appuie à son rythme sur le bouton et on compte le nombre de pression .. après 3 pressions on attend la validation du choix par pression sur un autre bouton

ou bien

  1. on appuie à son rythme sur le bouton jusqu'à 3 pressions .. puis s'il n'y a plus de pressions après 3 secondes on continue la boucle

Si vous pensez à autre chose ...

pour simplifier votre gestion des boutons, éventuellement utilisez la bibliothèque Button dans easyRun de @bricoleau ou OneButton de Matthias Hertel ou encore Toggle de @dlloyd.

cette dernière bibliothèque permet de gérer les appuis multiples. voir cet exemple Toggle/Press_Code.ino at main · Dlloydev/Toggle · GitHub

Une idée un peu alambiquée : d'abord faire une fonction qui lit un bouton et attend qu'il soit relâché pour renvoyer un booléen. Elle peut renvoyer true si le bouton est relâché avant un timeout et false sinon. Je suppose le bouton câblé en INPUT_PULLUP (renvoie LOW si enfoncé)

bool lectureBP (int pinBP, int timeout, int& compte) {
  while (digitalRead(pinBP));  // on attend l'appui (on pourrait mettre un timeout ici aussi)
  delay (30); // debounce
  unsigned long chrono = millis();
  while (millis()-chrono < timeout) 
    if (digitalRead(pinBP)) {
        ++ compte;
        return true;
    }
  return false;
}

(tapé comme ça, donc à vérifier...)
Ensuite :

byte compte = 1;
while (compte < 5 && lectureBP (pinBP, timeout, compte)) ;

On sort du while soit après 4 appuis soit après qu'un appui attend plus longtemps que le timeout.

J'ai bon ???

Attends je vais d'abord essayer d'utiliser la bibliotheque EasyRun de bricoleu qui a travers les exemples me semblent faire exactement ce que je souhaite

Mais comme d'habitude je peste à l'installation des bibliotheques

  • j'ai téléchargé le button.h
  • j'ai fait un copier-coller dans le repertoire /documents/arduino/librairies
  • Mais impossible de le voir dans le gestionnaire de librairies

Je n'arrive pas à comprendre ce qu'il faut faire vraiment pour y parvenir?

Utilise le gestionnaire de bibliothèques de l'IDE

Je pense que toggle sera plus adaptée si vous voulez gérer le quadruple click

tenez pour vous montrer comme c'est simple avec la classe Toggle

essayez cette simulation

voici le code

#include <Toggle.h>

const byte pinBouton = 2;
Toggle bouton;

void click1() {Serial.println(F("1 click"));}
void click2() {Serial.println(F("2 clicks"));}
void click3() {Serial.println(F("3 clicks"));}
void click4() {Serial.println(F("4 clicks"));}

void setup() {
  Serial.begin(115200);
  bouton.begin(pinBouton);
}

void loop() {
  bouton.poll();
  switch(bouton.pressCode()) {
    case 0xF1: click1(); break;
    case 0xF2: click2(); break;
    case 0xF3: click3(); break;
    case 0xF4: click4(); break;
    default: break;
  }
}

J'ai adapté ton code et le telechargement s'est bien passé .. mais rien ne se passe ni sur le serial moniteur ni sur mes led ... que manque-t-il?

const byte pinBouton = 4;
Toggle bouton;

void click1() {Serial.println(F("1 click"));}
void click2() {Serial.println(F("2 clicks"));}
void click3() {Serial.println(F("3 clicks"));}
void click4() {Serial.println(F("4 clicks"));}
const int ledbleue = 2; 
const int debridage = 3;

void setup() {
  Serial.begin(115200);
  bouton.begin(pinBouton);
  pinMode(debridage, OUTPUT);
  pinMode(ledbleue, OUTPUT);
  pinMode(pinBouton, INPUT);
}

void loop() {
  bouton.poll();
  switch(bouton.pressCode()) {
    case 0xF1: click1(); break;
    case 0xF2: click2(); break;
    case 0xF3: click3(); break;
    case 0xF4: click4(); break;
    default: break;
  }
}

virez pinMode(pinBouton, INPUT);

le bouton doit être en INPUT_PULLUP, donc connecté à la pin 4 d'un côté et à GND de l'autre. le begin() sur le bouton se charge de régler cela

il manque aussi le #include <Toggle.h> en début de sketch

#include <Toggle.h>
Toggle bouton;

const byte ledbleue = 2; 
const byte debridage = 3;
const byte pinBouton = 4;

void click1() {Serial.println(F("1 click"));}
void click2() {Serial.println(F("2 clicks"));}
void click3() {Serial.println(F("3 clicks"));}
void click4() {Serial.println(F("4 clicks"));}

void setup() {
  Serial.begin(115200);
  bouton.begin(pinBouton);
  pinMode(debridage, OUTPUT);
  pinMode(ledbleue, OUTPUT);
}

void loop() {
  bouton.poll();
  switch(bouton.pressCode()) {
    case 0xF1: click1(); break;
    case 0xF2: click2(); break;
    case 0xF3: click3(); break;
    case 0xF4: click4(); break;
    default: break;
  }
}

J'ai mal fait mon copier-coller ... le voici complet
Mais mon signal est 0 et devient 1 à l'appui sur le BP ... je dois adapter la biblotheque?

#include <Toggle.h>

const byte pinBouton = 4;
Toggle bouton;

void click1() {Serial.println(F("1 click"));}
void click2() {Serial.println(F("2 clicks"));}
void click3() {Serial.println(F("3 clicks"));}
void click4() {Serial.println(F("4 clicks"));}
const int ledbleue = 2; 
const int debridage = 3;

void setup() {
  Serial.begin(115200);
  bouton.begin(pinBouton);
  pinMode(debridage, OUTPUT);
  pinMode(ledbleue, OUTPUT);
}

void loop() {
  bouton.poll();
  switch(bouton.pressCode()) {
    case 0xF1: click1(); break;
    case 0xF2: click2(); break;
    case 0xF3: click3(); break;
    case 0xF4: click4(); break;
    default: break;
  }
}

Dans la librairie Toogle.h je lis ceci :

class Toggle {

  public:

    enum class inputMode : uint8_t {input = 0, input_pullup = 2, input_pulldown = 9, input_byte = 250};

    Toggle();
    Toggle(uint8_t *in);
    Toggle(uint8_t inA, uint8_t inB = 255) {
      _inA = inA;
      _inB = inB;
    };

Où dois-je introduire ce chiffre 9?

essayez

#include <Toggle.h>
const byte pinBouton = 4;
Toggle bouton(pinBouton);

void click1() {Serial.println(F("1 click"));}
void click2() {Serial.println(F("2 clicks"));}
void click3() {Serial.println(F("3 clicks"));}
void click4() {Serial.println(F("4 clicks"));}

void setup() {
  Serial.begin(115200);
  bouton.begin(pinBouton);
  bouton.setInputInvert(true);
  pinMode(pinBouton, INPUT);
}

void loop() {
  bouton.poll();
  switch(bouton.pressCode()) {
    case 0xF1: click1(); break;
    case 0xF2: click2(); break;
    case 0xF3: click3(); break;
    case 0xF4: click4(); break;
    default: break;
  }
}

vous avez bien un pull down externe sur le bouton? ou est-ce que vous utilisez une carte dont les pins savent faire un pulldown?

avec une résistance externe

Non .. toujours rien
Dans la biblitheque on peut choisir le input mode mais je ne sais pas comment et où le placer?

   void setInputMode(inputMode inputMode);            // input, input_pullup, input_pulldown, input_byte
    void setInputInvert(bool invert);                  // normal(0), inverted(1)

Lorsque je presse le BP, le niveau passe de 0 à 5v ... cette entrée a été testée 1000 fois et est prise en compte par le arduino

quelle est la carte Arduino?

comme vous avez 50 fils de discussion ouverts sur le même projet, on s'y perd (et vous aussi).

Arduino pro mini

à quoi ressemble le circuit? vous avez bien une résistance externe de pulldown ? quelle valeur ? est-ce un pro-mini à 3.3V ou 5V ?

J'ai essayé de continuer le fil de l'autre coté mais impossible car on m'y a dit que j'y avais trop posté