[Partage] Boutons Poussoirs

bravo pour le boulot et le partage

je proposerais éventuellement de changer

  //Initialisation hardware
  pinMode(pin, INPUT);
  digitalWrite(pin, HIGH);

en

  //Initialisation hardware PULLUP
  pinMode(pin, INPUT_PULLUP);

pour être plus à la page avec les dernières versions de l'IDE?

et aussi de mettre une valeur par défaut (15ms ou 20ms) pour delai_debounce_ms dans le constructeur ce qui permettrait d'instancier le bouton juste avec son N° de pin pour les débutants qui n'auraient pas d'idée de ce qu'est une valeur raisonnable pour les boutons qu'on trouve couramment sur le marché

A mon avis la "cuisine interne"

const uint8_t bit_etat_simpleBouton = 7;
const uint8_t bit_chgt_simpleBouton = bit_etat_simpleBouton - 1;
const uint8_t masque_etat_simpleBouton = 1 << bit_etat_simpleBouton;
const uint8_t masque_chgt_simpleBouton = 1 << bit_chgt_simpleBouton;
const uint8_t masque_pin_simpleBouton = ~(masque_etat_simpleBouton | masque_chgt_simpleBouton)

n'a pas trop lieu d'être car vous ne pouvez pas dire tiens je prends maintenant les bits 2 et 3 pour les états et les autres bits pour le N° de pin.. le code a besoin des bits de poids faible dédiés au N° de pin, donc autant mettre

const uint8_t masque_etat_simpleBouton = B10000000;
const uint8_t masque_chgt_simpleBouton = B01000000;
const uint8_t masque_pin_simpleBouton  = B00111111;

ce serait directement plus lisible non? (même si ça ne change rien effectivement à la mémoire utilisée)

Hello

Merci pour la revue

Oui pour le INPUT_PULLUP, effectivement c'était resté en "vieux code". Je le modifierai lorsque je mettrai en ligne une nouvelle version.

Valeur par défaut pour le debounce dans le constructeur => elle y est déjà (dans le header)

"Cuisine interne" du .cpp : y a pas grande différence. J'aime bien ma recette, qui ne change de toute manière rien au résultat compilé. C'est vrai que c'est moins lisible, mais voyons-y le caprice de l'auteur :slight_smile:

bricoleau:
"Cuisine interne" du .cpp : y a pas grande différence. J'aime bien ma recette, qui ne change de toute manière rien au résultat compilé. C'est vrai que c'est moins lisible, mais voyons-y le caprice de l'auteur :slight_smile:

J'aime bien les caprices de l'auteur - ça fait un peu artiste :slight_smile:

Valeur par défaut pour le debounce dans le constructeur => elle y est déjà (dans le header)

ah oui j'avoue ne pas avoir lu le header en détail! (et c'est le bon endroit pour la déclaration)

Merci beaucoup pour ce partage! Un membre du forum m'a renvoyé vers ce lien et son utilisation m'a totalement facilité la tâche. Débutante d'arduino, je ne suis pas à l'aise avec les boutons et je suis ravie d'avoir pu utiliser cette alternative! :slight_smile:

merci pour le partage, en tant que débutant tomber là dessus c'est bonheur !

Merci pour cette librairie francophone. Est-il possible de gérer simplement un double click voir un triple click sur un bouton ?

Bonjour

En l'état cette bib ne gère pas les actions associées aux appuis bouton.
Mais elle dispose de toutes les primitives permettant d'ajouter une surcouche dans ce sens.

J'avais déjà commencé à écrire cette surcouche. Je peux la mettre en ligne d'ici demain.

Oui je veux bien, rien d'urgent ...

Et voilà

V4 du 03/11/2018

Ajout d'une classe boutonAction, qui permet d'associer une fonction à exécuter au clic sur un bouton.

Cette classe permet aussi de gérer le double ou le triple clic avec une fonction associée à chacun.
Le délai maximum entre deux clics est par défaut à 500 ms.

La répétition est activable sur un appui long (comme une touche d'un clavier d'ordi).
Par défaut, la cadence de répétition est progressive, mais il est possible de faire prendre en compte une fonction de cadencement personnalisée.

Et bien sûr, la répétition fonctionne aussi avec les clics multiples :slight_smile:

Les exemples 11 à 15 illustrent les nouvelles possibilités.
Je recommande particulièrement l'exemple 14 : réglage d'une valeur via un seul bouton.

Retourner en début de topic pour accéder au téléchargement

buldo:
Merci pour cette librairie francophone. Est-il possible de gérer simplement un double click voir un triple click sur un bouton ?

Hop c'est ajouté !
Sauf qu'en francophone, on parle plutôt d'un clic :smiling_imp:

Merci beaucoup, je teste dans la semaine ...

bonjour, je dois mi prendre comme un pied...
mon cahier des charges:
3 boutons : Fire, plus et moins; une del commandée par un mosfet

  • le bouton fire allume la del, si il est appuyé plus de 10s la del s'éteind
  • un triple clic sur fire verrouille/déverrouille l'allumage de la del
  • les boutons + et - règlent l'intensité de la del
  • un triple clic sur + ou - verrouille/déverrouille le réglage de l'intensité de la del

1er problème comment déclarer le même bouton avec simpleBouton et boutonAction ?
conflicting declaration 'boutonAction boutonFire'
simpleBouton boutonFire(fire); pour pouvoir tester vientDEtreEnfonce,vientDEtreRelache et estEnfonceDepuisPlusDe
boutonAction boutonFire(fire); pour gérer le triple clic

2ème problème lors de la compilation il n'arrive pas à traduire
error: invalid conversion from 'void ()()' to 'void (*)()' [-fpermissive]
boutonFire.attacher(clicFire, doubleClicFire, tripleClicFire);

Arduino : 1.8.5 (Windows 10), Carte : "Digispark (Default - 16.5mhz)"

box_tiny:16: error: conflicting declaration 'boutonAction boutonFire'

 boutonAction boutonFire(fire);

                             ^

box_tiny:15: error: 'boutonFire' has a previous declaration as 'simpleBouton boutonFire'

 simpleBouton boutonFire(fire);

              ^

d:\Users\Buldo.buldo-PC\Desktop\diy\box_tiny\box_tiny.ino: In function 'void setup()':

box_tiny:27: error: 'class simpleBouton' has no member named 'attacher'

   boutonFire.attacher(clicFire, doubleClicFire, tripleClicFire);

              ^

box_tiny:28: error: invalid conversion from 'void (*)()' to 'void* (*)()' [-fpermissive]

   boutonPlus.attacher(clicPlus, doubleClicPlus, tripleClicPlus);

                                                               ^

In file included from d:\Users\Buldo.buldo-PC\Desktop\diy\box_tiny\box_tiny.ino:1:0:

D:\Program Files (x86)\Arduino\libraries\simpleBouton/simpleBouton.h:64:10: error:   initializing argument 2 of 'void boutonAction::attacher(void (*)(), void* (*)(), void* (*)())' [-fpermissive]

     void attacher(void (*clic)(), void (*clicClic()) = NULL, void (*clicClicClic()) = NULL);

          ^

box_tiny:28: error: invalid conversion from 'void (*)()' to 'void* (*)()' [-fpermissive]

   boutonPlus.attacher(clicPlus, doubleClicPlus, tripleClicPlus);

                                                               ^

In file included from d:\Users\Buldo.buldo-PC\Desktop\diy\box_tiny\box_tiny.ino:1:0:

D:\Program Files (x86)\Arduino\libraries\simpleBouton/simpleBouton.h:64:10: error:   initializing argument 3 of 'void boutonAction::attacher(void (*)(), void* (*)(), void* (*)())' [-fpermissive]

     void attacher(void (*clic)(), void (*clicClic()) = NULL, void (*clicClicClic()) = NULL);

          ^

box_tiny:29: error: invalid conversion from 'void (*)()' to 'void* (*)()' [-fpermissive]

   boutonMoins.attacher(clicMoins, doubleClicMoins, tripleClicMoins);

                                                                   ^

In file included from d:\Users\Buldo.buldo-PC\Desktop\diy\box_tiny\box_tiny.ino:1:0:

D:\Program Files (x86)\Arduino\libraries\simpleBouton/simpleBouton.h:64:10: error:   initializing argument 2 of 'void boutonAction::attacher(void (*)(), void* (*)(), void* (*)())' [-fpermissive]

     void attacher(void (*clic)(), void (*clicClic()) = NULL, void (*clicClicClic()) = NULL);

          ^

box_tiny:29: error: invalid conversion from 'void (*)()' to 'void* (*)()' [-fpermissive]

   boutonMoins.attacher(clicMoins, doubleClicMoins, tripleClicMoins);

                                                                   ^

In file included from d:\Users\Buldo.buldo-PC\Desktop\diy\box_tiny\box_tiny.ino:1:0:

D:\Program Files (x86)\Arduino\libraries\simpleBouton/simpleBouton.h:64:10: error:   initializing argument 3 of 'void boutonAction::attacher(void (*)(), void* (*)(), void* (*)())' [-fpermissive]

     void attacher(void (*clic)(), void (*clicClic()) = NULL, void (*clicClicClic()) = NULL);

          ^

exit status 1
conflicting declaration 'boutonAction boutonFire'

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

le code fautif

#include "simpleBouton.h"

const int mosfet=0;
const int led=1;
const int fire=2;
const int plus=3;
const int moins=4;
int pwm=70;
int pas=10;
bool blocageFire=false;
bool blocagePwm=false;
unsigned long tempsFire=0;
unsigned long dureFire=10000;

simpleBouton boutonFire(fire);
boutonAction boutonFire(fire);
boutonAction boutonPlus(plus);
boutonAction boutonMoins(moins);

void setup() {
  pinMode(led, OUTPUT);
  pinMode(mosfet, OUTPUT);

  clignoteLed(6);
  stopFire();
  
  boutonFire.attacher(clicFire, doubleClicFire, tripleClicFire);
  boutonPlus.attacher(clicPlus, doubleClicPlus, tripleClicPlus);
  boutonMoins.attacher(clicMoins, doubleClicMoins, tripleClicMoins);
  boutonPlus.activerRepetition();
  boutonMoins.activerRepetition();
} 

void loop()
 {
  boutonFire.actualiser();
 boutonPlus.actualiser();
 boutonMoins.actualiser();
 if (boutonFire.vientDEtreEnfonce()) debutFire();
 if (boutonFire.vientDEtreRelache()) stopFire();
 if (boutonFire.estEnfonceDepuisPlusDe(dureFire)) stopFire();
}
// bouton fire
void debutFire() {
  if (blocageFire==false){
      analogWrite(mosfet,pwm);
      digitalWrite(led,HIGH); 
  } else stopFire();
}
void stopFire() {
    digitalWrite(mosfet,LOW); 
    digitalWrite(led,LOW);
}
void clicFire() {
} 
void doubleClicFire() {
} 
void tripleClicFire() {
 blocageFire=!blocageFire;
 clignoteLed(3);
} 
// bouton fire

// bouton plus
void clicPlus() {
 if (blocagePwm==false){
 pwm=pwm+pas;
 digitalWrite(led,HIGH);
 delay(10);
 digitalWrite(led,LOW);
 }else digitalWrite(led,LOW);
} 
void doubleClicPlus() {
}
void tripleClicPlus() {
 blocagePwm=!blocagePwm;
 clignoteLed(4);
}
// bouton plus

// bouton moins
void clicMoins() {
 if (blocagePwm==false){
 pwm=pwm-pas;
 digitalWrite(led,HIGH);
 delay(10);
 digitalWrite(led,LOW); 
 }else digitalWrite(led,LOW);
} 
void doubleClicMoins() {
} 
void tripleClicMoins() {
 blocagePwm=!blocagePwm;
 clignoteLed(4);
} 
// bouton moins


uint8_t clignoteLed(int cligno){
 uint8_t y=0;
 while (y < cligno){
 digitalWrite(led,HIGH);
 delay(200);
 digitalWrite(led,LOW);
 delay(200);
 y++;
 }
}
// End

@bricoleau

sympa de faire vivre la librairie.

suggestion pour les exemples: virer les Serial.begin(9600);pour mettre à la placeSerial.begin(115200);au minimum puisqu'aujourd'hui les arduino modernes n'ont aucun soucis avec ces débits.

raison: aider les petits nouveaux qui commencent en regardant des exemple à ne pas rester coincé dans le passé où aller au delà de 9600 bauds était périlleux... :slight_smile:

Serial.begin(115200);

Oh oui :slight_smile:
+1

@+

Bonsoir

@buldo :

Tu ne peux pas déclarer deux objets ou deux variables de même nom

simpleBouton boutonFire(fire);
boutonAction boutonFire(fire);

Soit tu déclares un simpleBouton sur une pin, et tu gères ce qu'il y a à faire en cas d'appui/relâchement
Soit tu déclares un boutonAction sur la pin, en lui associant une fonction clic, et éventuellement une fonction double clic et triple clic.
Regarde les exemples fournis avec la bibliothèque

Supprime les delay de ton programme (dans clignoterLed & co) sinon la lecture des boutons ne sera pas assez fluide.

Je crois aussi qu'il y a une erreur de logique dans ce que tu veux faire.
Pour savoir si on est sur un simple ou double clic, il faut nécessairement attendre un peu après le premier clic.
Donc la méthode .vientDEtreEnfonce() n'est pas appropriée pour un bouton multi clics.

J'ai du mal à voir ce que tu souhaites faire avec les double et triple clic.

@J-M-L & hbachetti : ok ok je vais modifier et reupload :slight_smile:

bricoleau:
@J-M-L & hbachetti : ok ok je vais modifier et reupload :slight_smile:

Merci :wink: :wink:

Cool. 8)
C'est bien de militer pour la disparition du 9600.

ce que j'aimerais faire c'est
-des boutons + et - qui augmente ou diminue la variable correspondant à l'intensité de ma del qui est commandée par le mosfet, et pouvoir bloquer/débloquer ce réglage par un triple clic. J'aurais besoin pour cela d'un boutonAction clic et triple clic.
-d'un bouton fire, qui quand je l'enfonce, allume la del au maximum 10 secondes, si je le relâche éteint la del. si je triple clic, autorise ou pas son allumage. J'aurais besoin pour cela de détecter, le bouton enfoncé, relaché, enfoncé depuis plus de 10s et du triple clic. Et c'est là où ça se corse.

  • le clignoterLed me permet juste de "visualiser" si les commande sont bien passées, c'est le voyant intégré à la carte, ce n'est pas la del qui est commandée en intensité par le mosfet.

edit:
j'ai commenté les lignes du code correspondant au bouton fire, j'ai toujours une erreur sur ce type de ligne
boutonMoins.attacher(clicMoins, doubleClicMoins, tripleClicMoins);
error: invalid conversion from 'void ()()' to 'void (*)()' [-fpermissive]

stp ouvre un nouveau sujet sur le forum pour ton pb de mise au point, histoire de ne pas polluer ce sujet

Poste ton code exact qui génère l'erreur de compil "invalid conversion" car là je ne vois pas ce qui cloche.

Pourquoi veux-tu associer une action à un triple clic et aucune au double clic?
La bibliothèque permet de gérer :
soit le clic simple
soit le clic simple + double
soit le clic simple + double + triple

mais pas le clic simple + triple. Si vraiment tu y tiens tu peux associer une fonction qui ne fait rien au double clic.

et j'insiste : pour faire clignoter les led, n'utilise pas de delay (mais on pourra voir ça à la fin).

J'ai l'impression qu'il te faut un simpeBouton pour le fire, et un boutonAction pour plus et moins.

J-M-L:
Merci :wink: :wink:

voilà c'est modifié :slight_smile: