Problème d'utilisation de la librairie simpleBouton par bricoleau

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

ce que j'aimerais faire c'est
-des boutons + et - qui augmentent ou diminuent 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 pendant 10 secondes, si je le relâche il éteint la del. si je triple clic (protection) il 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.

je rencontre 2 problèmes

  1. gérer le triple clics du fire et surveiller son appuis si supérieur à 10 secondes
  2. erreur de compilation avec boutonMoins.attacher(clicMoins, doubleClicMoins, tripleClicMoins);
    error: invalid conversion from 'void ()()' to 'void (*)()' [-fpermissive]

le code actuel sans le problème 1

#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 boutonFire2(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()
 {
 // boutonFire2.actualiser();
  boutonFire.actualiser();
 boutonPlus.actualiser();
 boutonMoins.actualiser();
// if (boutonFire2.vientDEtreEnfonce()) debutFire();
// if (boutonFire2.vientDEtreRelache()) stopFire();
// if (boutonFire2.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

Pour l'erreur de compil, je ne vois pas. Le code ci-dessus compile sans erreur chez moi.
Est-ce que tu peux :

  1. aller dans les préférences de l'IDE arduino
  2. cocher "Afficher les résultats détaillés pendant la compilation"
  3. compiler
  4. copier/coller ici l'intégralité du résultat de la compilation

buldo:
-d'un bouton fire, qui quand je l'enfonce, allume la del au maximum pendant 10 secondes, si je le relâche il éteint la del. si je triple clic (protection) il autorise ou pas son allumage.

Je ne sais pas si cela ne peut pas fonctionner, avec ou sans ma lib.

C'est juste une question de logique : un triple clic, c'est trois clics rapprochés.
Lorsque l'arduino détecte le tout premier clic, il ne sait pas encore s'il doit allumer la led ou bien attendre d'autres clics éventuels.

C'est pourquoi la classe boutonAction intègre un petit délai d'attente (par défaut à 1/2 seconde).
Si au bout de ce délai il n'y a pas eu de nouveau clic, alors on est bien sur un simple clic, et l'action associée est déclenchée. Mais du coup cela induit un retard d'1/2 seconde par rapport à l'appui sur le bouton, ce qui ne conviendra peut-être pas pour un bouton fire.
Et il n'y a aucun moyen de détecter un triple clic sans un delai d'attente. Ce délai peut éventuellement être réduit, mais pas trop sinon le triple clic risque d'être interprété comme une succession de trois clics simples.

NB : si on utilise boutonAction en attachant une seule fonction, associée au clic simple, alors la détection du double ou triple clic est désactivée, et il n'y a aucun retard entre l'appui sur le bouton et l'exécution de la fonction associée.

trop de caractères pour l'afficher ici https://www.dropbox.com/s/t1opqvuorvpe23m/erreur.txt?dl=0

le temps de latence est en effet embêtant pour un bouton fire, il va falloir gérer autrement ce triple clic que par l'utilisation de boutonAction. Utiliser certainement vientDEtreEnfonce, vientDEtreRelache, dureeEnfonce, dureeRelache

par contre l'erreur de compile je ne comprend pas, est-ce du au microcontrôleur ATtyni85 ?

nb ce projet concerne une box e-cigarette maison à base de ATtyni85, la del sera couplée à une résistance chauffante. l'idée du triple clic c'est pour éviter qu'elle ne se déclenche dans la poche

alors tu peux envisager plutot une séquence type click doubleclik click pour éviter un déclanchement intempestif

pour l'erreur de compilation, c'est à cause des options du compilateur quand on utilise pas un atmega, le flag -fpermissive n'est pas activé, et tout c qui n'est pas codé en c++ rigoureux ne compile plus... j'ai eu le même genre de soucis avec ma librairie yasm, j'ai du un peu me cramer des neurones pour le résoudre d'ailleurs :stuck_out_tongue:

@bricoleau : pour reproduire l'erreur, utilise "esp32" comme type de carte (il faut installer le support, il n'est pas inclus par défaut)

oui je suis arrivé à la même conclusion, mais ce qui m'embête c'est "n'est pas codé en c++ rigoureux"

Cela heurte mon amour-propre :smiley:

La vraie solution est de modifier la bibliothèque pour la rendre conforme, sauf qu'en première approche j'ai du mal à voir où intervenir.
Depuis quand la norme interdit-elle de passer une fonction void en paramètre d'une fonction ?
Ou peut-être passer par un typedef ?
Bref faut que je prenne un moment pour creuser l'affaire

moi c'était un soucis de déclarations, qui n'étaient pas exclusivement dans le .h au niveau des arguments par défaut. Tout con, en fait, mais sans JML, je serais encore en train de chercher...

Bon c'était un bête problème de typo (une parenthèse mal placée).

Voilà la bibliothèque est corrigée, remise en ligne, testée sous wemos.

Bonjour, d'abord super lib.

J'essai quelque chose de similaire au pb de ce post et je n'arrive pas à implémenter correctement.

J'ai compris qu'on ne peux pas utiliser actionButton pour gérer le multiclic et boutonsimple en même temps.

Voila ce que je cherche : 1 bouton qui pilote un mosfet et 1 led en même temps.

J'appuie sur le bouton (et en fonction d'un flag lock à true ou false) j'allume led + mosfet.
Si je reste longtemps (10 sec) je coupe les 2 et je fait blink la led.

Si je clique 3 fois sur le bouton je lock le bouton (mon flag lock) et je fais blinker la led 3 fois. Idem si je re appuye 3 fois. Enfin si je suis lock et que je clic 2 fois je fais blinker la led un certaint nombre de fois.

Je précise que j'utilise pas de delay dans le code.

Quand j'utilise actionBouton j'ai l'impression que le clic simple marche en mode "télérupteur".

Est ce que je peux utiliser cette lib pour faire ce que j'ai besoin ou ce n'est pas possible ?

Merci !