Go Down

Topic: [Partage] Boutons Poussoirs (Read 6706 times) previous topic - next topic

Limp47

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

buldo

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

bricoleau

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.
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

buldo

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

bricoleau

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  :)

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
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

bricoleau

#20
Nov 03, 2018, 08:08 pm Last Edit: Nov 03, 2018, 08:09 pm by bricoleau
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  :smiley-twist:
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

buldo

Merci beaucoup, je teste dans la semaine ...

buldo

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);

Code: [Select]
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

Code: [Select]
#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

J-M-L

#23
Nov 04, 2018, 02:49 pm Last Edit: Nov 04, 2018, 02:49 pm by J-M-L
@bricoleau

sympa de faire vivre la librairie.

suggestion pour les exemples: virer les
Code: [Select]
Serial.begin(9600);pour mettre à la place
Code: [Select]
Serial.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...  :)
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

hbachetti

Code: [Select]
Serial.begin(115200);

Oh oui  :)
+1

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

bricoleau

#25
Nov 04, 2018, 06:48 pm Last Edit: Nov 04, 2018, 06:48 pm by bricoleau
Bonsoir

@buldo :

Tu ne peux pas déclarer deux objets ou deux variables de même nom
Code: [Select]
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  :)

Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

J-M-L

@J-M-L & hbachetti : ok ok je vais modifier et reupload  :)
Merci  ;)  ;)
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

hbachetti

Cool.  8)
C'est bien de militer pour la disparition du 9600.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

buldo

#28
Nov 04, 2018, 07:49 pm Last Edit: Nov 04, 2018, 08:25 pm by buldo
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]

bricoleau

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.

Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

Go Up