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
terwal
November 8, 2022, 5:19pm
2
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 :
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
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 ...
J-M-L
November 8, 2022, 6:09pm
4
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
lesept
November 8, 2022, 7:26pm
5
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?
lesept
November 8, 2022, 7:50pm
7
Utilise le gestionnaire de bibliothèques de l'IDE
J-M-L
November 8, 2022, 11:26pm
8
Je pense que toggle sera plus adaptée si vous voulez gérer le quadruple click
J-M-L
November 9, 2022, 9:01am
9
tenez pour vous montrer comme c'est simple avec la classe Toggle
essayez cette simulation
Run IoT and embedded projects in your browser: ESP32, Arduino, Pi Pico, and more. No installation required!
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;
}
}
jo_6466
November 9, 2022, 9:36am
10
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;
}
}
J-M-L
November 9, 2022, 9:40am
11
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;
}
}
jo_6466
November 9, 2022, 9:46am
12
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;
}
}
jo_6466
November 9, 2022, 9:55am
13
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?
J-M-L
November 9, 2022, 10:01am
14
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;
}
}
J-M-L
November 9, 2022, 10:03am
15
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
Run IoT and embedded projects in your browser: ESP32, STM32, Arduino, Pi Pico, and more. No installation required!
jo_6466
November 9, 2022, 10:08am
16
J-M-L:
#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;
}
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
J-M-L
November 9, 2022, 10:10am
17
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).
J-M-L
November 9, 2022, 10:12am
19
à quoi ressemble le circuit? vous avez bien une résistance externe de pulldown ? quelle valeur ? est-ce un pro-mini à 3.3V ou 5V ?
jo_6466
November 9, 2022, 10:12am
20
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é