Arduino Forum

International => Français => Tutoriels et cours => Topic started by: bricoleau on Jan 28, 2016, 06:29 pm

Title: [Partage] Boutons Poussoirs
Post by: bricoleau on Jan 28, 2016, 06:29 pm
Bonjour

Dans la série "petites librairies en français et simples d'usage à destination des débutants", voici la nouvelle version de ma librairie pour gérer facilement des boutons poussoirs.

Après téléchargement (http://forum.arduino.cc/index.php?action=dlattach;topic=375232.0;attach=282037) et installation, les exemples d'utilisation sont disponibles directement depuis l'IDE Arduino

Header :
Code: [Select]
//Librairie Arduino pour la gestion de boutons poussoirs
//Version 4.1
//
//Cablage : pin---BP---GND
//
//6 octets alloués en RAM pour un simpleBouton
//Les fonctions non utilisées sont dégagées à la compilation
//
//Bricoleau 2018

#ifndef simpleBouton_h
#define simpleBouton_h

#include <Arduino.h>

class simpleBouton
{
  public :
    //Constructeur
    simpleBouton(uint8_t pin, uint8_t delai_debounce_ms = 20);

    //Lecture hardware et mise à jour des variables internes
    //Idéalement, doit être appelée à chaque début de loop()
    bool actualiser(); //retourne true si l'état du bouton a changé

    //Informations de statut
    bool estEnfonce() const;
    bool estRelache() const;
    bool estStable() const;
    uint8_t pin() const;

    bool vientDEtreEnfonceOuRelache() const               {return !estStable();}
    bool vientDEtreEnfonce() const                        {return vientDEtreEnfonceOuRelache() && estEnfonce();}
    bool vientDEtreRelache() const                        {return vientDEtreEnfonceOuRelache() && estRelache();}

    //Informations de durée
    uint32_t dureeEtatActuel() const                      {return millis() - this->_millis_etat_actuel;}
    uint32_t dureeEnfonce() const                         {return estEnfonce() ? dureeEtatActuel() : 0;}
    uint32_t dureeRelache() const                         {return estRelache() ? dureeEtatActuel() : 0;}

    bool estStableDepuisAuMoins(uint32_t delai_ms) const  {return dureeEtatActuel() >= delai_ms;}
    bool estEnfonceDepuisAuMoins(uint32_t delai_ms) const {return estStableDepuisAuMoins(delai_ms) && estEnfonce();}
    bool estRelacheDepuisAuMoins(uint32_t delai_ms) const {return estStableDepuisAuMoins(delai_ms) && estRelache();}

    bool estStableDepuisPlusDe(uint32_t delai_ms) const   {return dureeEtatActuel() > delai_ms;}
    bool estEnfonceDepuisPlusDe(uint32_t delai_ms) const  {return estStableDepuisPlusDe(delai_ms) && estEnfonce();}
    bool estRelacheDepuisPlusDe(uint32_t delai_ms) const  {return estStableDepuisPlusDe(delai_ms) && estRelache();}

    uint8_t delaiDebounceMs() const                       {return this->_delai_debounce_ms;}

    //Et pour un usage minimaliste :
    operator bool() {return actualiser() && estEnfonce();}

  private :
    uint8_t  _statut, _delai_debounce_ms;
    uint32_t _millis_etat_actuel;
};

class boutonAction
{
  public :
    boutonAction(uint8_t pin, uint8_t delai_debounce_ms = 20);

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

    static uint16_t delai_max_interclic_ms;

    void activerRepetition(uint32_t (*delaiRepetitionPersonnalise)(uint32_t) = NULL);
    void desactiverRepetition();

    void actualiser();

  private :
    simpleBouton bouton;
    void (*_simpleClic)();
    void (*_doubleClic)();
    void (*_tripleClic)();
    uint8_t _statut;
    uint32_t _millis_dernier_clic, _millis_derniere_action;
    uint32_t (*_delaiRepetition)(uint32_t);
    //Prendre exemple sur la fonction ci-dessous dans le cpp pour définir une fonction personnalisée
    static uint32_t _delaiRepetitionParDefaut(uint32_t duree_enfonce);
};

#endif


V3 du 16/03/2018

Pour les cas d'utilisation les plus simples, vous pouvez à présent utiliser le bouton comme un simple booléen !
Impossible de faire plus facile à utiliser  :)

Par exemple :
Code: [Select]
#include "simpleBouton.h"
simpleBouton boutonTest(7);

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (boutonTest) Serial.println("Detection appui bouton");
}


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.

V4.1 du 16/11/2016

Compatibilité ESP8266 (testé sur wemos)

Attention : les exemples fournis sont basés sur les numéros de pin d'une arduino uno, à modifier pour fonctionner sur un wemos. Par exemple :
Code: [Select]
const uint8_t pin_bouton = 3;//cablage pin---BP---GND doit être modifié en
Code: [Select]
const uint8_t pin_bouton = D3;//cablage pin---BP---GND
Title: Re: [Partage] Librairie Boutons Poussoirs
Post by: bricoleau on Jan 28, 2016, 06:38 pm
Conseil :

Prenez une carte arduino uno, cablez deux boutons poussoirs :
pin7-----BP1-----GND
pin8-----BP2-----GND

Et parcourez les 11 exemples fournis.
Title: Re: [Partage] Librairie Boutons Poussoirs V2
Post by: Auden69 on Apr 18, 2016, 09:21 am
Un grand merci pour cette librairie... super pratique et efficace !

Par contre j'ai parfois un message d'erreur... mais ça finit par passer quand même...


Code: [Select]

const uint8_t masque_pin_simpleBouton = ~(masque_etat_simpleBouton | masque_chgt_simpleBouton);
Title: Re: [Partage] Librairie Boutons Poussoirs V2
Post by: bricoleau on Apr 18, 2016, 11:44 am
Quel message d'erreur ?

Si celui-ci n'est pas systématique, cela fait plutôt penser à un bug de l'IDE Arduino, dont les dernières versions sont truffées. Quelle version de l'IDE ?
Title: Re: [Partage] Librairie Boutons Poussoirs V2
Post by: Auden69 on Apr 18, 2016, 01:21 pm
Ce message :

const uint8_t masque_pin_simpleBouton = ~(masque_etat_simpleBouton | masque_chgt_simpleBouton);


Version 1.6.8
Title: Re: [Partage] Librairie Boutons Poussoirs V2
Post by: bricoleau on Apr 18, 2016, 01:27 pm
Ça ce n'est pas un message d'erreur mais juste une ligne de code de la bibliothèque
Title: Re: [Partage] Librairie Boutons Poussoirs
Post by: bricoleau on Mar 16, 2018, 07:06 pm
Publication de la version V3

Voir le descriptif en haut de ce topic
Title: Re: [Partage] Boutons Poussoirs
Post by: Diff on Mar 20, 2018, 10:22 am
Ta librairie fonctionne merveilleusement bien ! Incroyable de simplicité et avec des exemples très complets.

C'est du super boulot je te remercie du partage !
Title: Re: [Partage] Boutons Poussoirs
Post by: bricoleau on Mar 20, 2018, 07:14 pm
Merci ça fait plaisir d'avoir un avis en retour

Ce qui reste malheureusement assez rare quand je relis ce qui est écrit ci-dessus, surtout au regard des plus de 400 téléchargements de la version précédente.
Mais bon pas grave  :)

Tu trouveras peut-être aussi d'autres partages intéressants dans le lien que j'ai mis en signature.
Title: Re: [Partage] Boutons Poussoirs
Post by: Diff on Mar 26, 2018, 12:15 pm
Effectivement j'ai été surpris du manque de réaction face à la simplicité de ce que tu proposes. Dommage.

Merci pour les autres partages, toujours la même philosophie c'est top !
Title: Re: [Partage] Boutons Poussoirs
Post by: TAVAR320 on Apr 04, 2018, 10:24 pm
Merci beaucoup pour le partage.
J'ai un prototypage qui bloquait jusqu'à l'intégration du SimpleRTC. Du coup je viens de récupérer SimpleBouton.
Avec le transfert des certaines routines en librairies, la prog est beaucoup plus simple.
Encore merci.
Title: Re: [Partage] Boutons Poussoirs
Post by: J-M-L on Apr 07, 2018, 12:57 pm
bravo pour le boulot et le partage

je proposerais éventuellement de changer
Code: [Select]
  //Initialisation hardware
  pinMode(pin, INPUT);
  digitalWrite(pin, HIGH);
en
Code: [Select]
  //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"
Code: [Select]
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
Code: [Select]
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)

Title: Re: [Partage] Boutons Poussoirs
Post by: bricoleau on Apr 08, 2018, 06:04 pm
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  :)
Title: Re: [Partage] Boutons Poussoirs
Post by: J-M-L on Apr 08, 2018, 06:09 pm
"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  :)
J'aime bien les caprices de l'auteur - ça fait un peu artiste :)

Quote
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)
Title: Re: [Partage] Boutons Poussoirs
Post by: PPEMARINE on May 13, 2018, 11:17 am
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! :)
Title: Re: [Partage] Boutons Poussoirs
Post by: Limp47 on Oct 02, 2018, 06:14 pm
merci pour le partage, en tant que débutant tomber là dessus c'est bonheur !
Title: Re: [Partage] Boutons Poussoirs
Post by: buldo on Oct 30, 2018, 08:31 pm
Merci pour cette librairie francophone. Est-il possible de gérer simplement un double click voir un triple click sur un bouton ?
Title: Re: [Partage] Boutons Poussoirs
Post by: bricoleau on Oct 31, 2018, 11:47 am
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.
Title: Re: [Partage] Boutons Poussoirs
Post by: buldo on Nov 02, 2018, 05:31 pm
Oui je veux bien, rien d'urgent ...
Title: Re: [Partage] Boutons Poussoirs
Post by: bricoleau on Nov 03, 2018, 08:02 pm
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 (http://forum.arduino.cc/index.php?topic=375232)
Title: Re: [Partage] Boutons Poussoirs
Post by: bricoleau on Nov 03, 2018, 08:08 pm
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:
Title: Re: [Partage] Boutons Poussoirs
Post by: buldo on Nov 03, 2018, 08:34 pm
Merci beaucoup, je teste dans la semaine ...
Title: Re: [Partage] Boutons Poussoirs
Post by: buldo on Nov 04, 2018, 01:12 pm
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
Title: Re: [Partage] Boutons Poussoirs
Post by: J-M-L on Nov 04, 2018, 02:49 pm
@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...  :)
Title: Re: [Partage] Boutons Poussoirs
Post by: hbachetti on Nov 04, 2018, 04:33 pm
Code: [Select]
Serial.begin(115200);

Oh oui  :)
+1

@+
Title: Re: [Partage] Boutons Poussoirs
Post by: bricoleau on Nov 04, 2018, 06:48 pm
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  :)

Title: Re: [Partage] Boutons Poussoirs
Post by: J-M-L on Nov 04, 2018, 06:49 pm
@J-M-L & hbachetti : ok ok je vais modifier et reupload  :)
Merci  ;)  ;)
Title: Re: [Partage] Boutons Poussoirs
Post by: hbachetti on Nov 04, 2018, 07:23 pm
Cool.  8)
C'est bien de militer pour la disparition du 9600.
Title: Re: [Partage] Boutons Poussoirs
Post by: buldo on Nov 04, 2018, 07:49 pm
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]
Title: Re: [Partage] Boutons Poussoirs
Post by: bricoleau on Nov 04, 2018, 09:53 pm
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.

Title: Re: [Partage] Boutons Poussoirs
Post by: bricoleau on Nov 04, 2018, 11:56 pm
Merci  ;)  ;)
voilà c'est modifié  :)
Title: Re: [Partage] Boutons Poussoirs
Post by: J-M-L on Nov 05, 2018, 12:33 am
+karma :)
Title: Re: [Partage] Boutons Poussoirs
Post by: bricoleau on Nov 16, 2018, 10:57 am
V4.1 du 16/11/2016

Compatibilité ESP8266 (testé sur wemos)

Attention : les exemples fournis sont basés sur les numéros de pin d'une arduino uno, à modifier pour fonctionner sur un wemos. Par exemple :
Code: [Select]
const uint8_t pin_bouton = 3;//cablage pin---BP---GND
 doit être modifié en
Code: [Select]
const uint8_t pin_bouton = D3;//cablage pin---BP---GND

Retourner en début de topic pour accéder au téléchargement (http://forum.arduino.cc/index.php?topic=375232)
Title: Re: [Partage] Boutons Poussoirs
Post by: buldo on Nov 29, 2018, 09:33 pm
Merci beaucoup
Title: Re: [Partage] Boutons Poussoirs
Post by: J-M-L on Jan 01, 2019, 04:38 pm
J'avais noté de signaler cela:

Petite modification nécessaire ligne 15 --> rajoutez un cast sinon l'opération ~ va générer un int et on aura un warning à la compilation

Code: [Select]
const uint8_t masque_pin_simpleBouton = (uint8_t) ~(masque_etat_simpleBouton | masque_chgt_simpleBouton);
Title: Re: [Partage] Boutons Poussoirs
Post by: J-M-L on Jan 06, 2019, 03:20 pm
Salut @bricoleau

j'ai acquis il y quelques temps tout un lot de boutons momentanés avec LED intégrée

que je souhaitais utiliser dans le cadre de travaux pratiques de découverte, soit en simple bouton momentané, soit avec allumage de la LED, soit avec association d'un son par le biais d'un Piezo.



Comme je voulais simplifier initialement la gestion de ces boutons, je me suis dit que partir de votre librairie ne pouvait pas faire de mal - mais plutôt que de gérer la LED ou le PIEZO lors des actions, je me suis dit qu'il serait sympa d'intégrer ces boutons particuliers à votre librairie en tant que sous classe.

J'ai donc modifié un tout petit peu la classe simpleBouton pour modifier la déclaration de
Code: [Select]
bool actualiser(); //retourne true si l'état du bouton a changé
 en
Code: [Select]
virtual bool actualiser(); //retourne true si l'état du bouton a changé
de façon à pouvoir gérer correctement l'héritage

J'en ai aussi profité pour modifier une ligne dans le .cpp qui donne un warning avec la dernière version de l'IDE
Code: [Select]
const uint8_t masque_pin_simpleBouton = (uint8_t) ~(masque_etat_simpleBouton | masque_chgt_simpleBouton);

en rajoutant le cast en (uint8_t) parce que (masque_etat_simpleBouton | masque_chgt_simpleBouton) ou le résultat du complément à 1 est automatiquement promu en int (sur 2 octets).

J'ai donc créé deux nouvelles classes ledBouton et ledPiezoBouton qui héritent de simpleBouton
Code: [Select]
class ledBouton : public simpleBouton
class ledPiezoBouton : public ledBouton


Les constructeurs sont simples, pour le ledBouton on prend un paramètre en plus qui dit quelle est la pin associée à la LED et pour le ledPiezoBouton il y a encore une pin de plus qui dit quelle est la pin associée à son piezo.

Je voulais aussi pouvoir prendre l'approche "machine à état" et utiliser des callbacks, mais j'ai eu un peu la flemme de partir sur ce que vous aviez fait avec la classe boutonAction alors j'en propose une toute nouvelle boutonRetroAction qui reprend globalement l'intégralité de votre travail, sauf que cette classe attend en entrée de son constructeur un pointeur sur un simpleBouton (ou sous classe) déjà instancié. J'ai aussi profité de la modification pour changer la signature des clicks (simple, double, triple) pour passer en paramètre l'instance du bouton qui déclenche le callback. ça permet ainsi d'avoir la même fonction associée à plusieurs boutons et de différencier au sein de la fonction qui est le bouton appelant. Je trouve que ça donne comme cela plus de flexibilité.

Je mets un code de test + les 2 fichiers principaux de la nouvelle version en PJ dans le zip (trop gros pour poster directement) qui va avec ce petit montage



Le bouton vert (pin3) se comporte en simple bouton
Le bouton orange (pin 5) en bouton avec LED (pin 4)
Le bouton bleu (pin 7) déclenche en plus de la LED (pin 6)  un son sur le piezo (pin 12).

à noter un truc qui n'est pas trop conventionnel si vous achetez ce genre de boutons:
- d'une part sur certains sites ils sont notés 12v, ce n'est pas vrai du tout... ne dépassez pas les valeurs habituelles pour des LEDs, (3.3V ou 5V et utilisez une résistance de limitation de courant entre 200Ω et 300Ω)
- Pour savoir où est l'Anode et la cathode sur le bouton, ils ont mis un point rouge d'un côté... on associe souvent le rouge au pôle positif dans les montages, ben... ici c'est le contraire, le point rouge dénote la cathode de la LED (donc vous reliez cette partie à la masse).



Le code de démo comprend en plus un #define, suivant que vous l'activez ou pas vous allez utiliser la version "de base" ou la version avec les callbacks.
Title: Re: [Partage] Boutons Poussoirs
Post by: Kanter on Apr 26, 2019, 01:32 pm
Bonjour
Je suis en train de tester simpleBouton.h et un tutoriel sur la machien à état qui répond à mes attentes: action quand le bouton est appuyé (et non relâché) Merci à son auteur !


Peux-ton faire un callback avec cette librairie pour faire fonctionner ce code  ?
Code: [Select]
void simpleclick()//http://forum.arduino.cc/index.php?topic=470879.0
{
... // le code à exécuter quand on fait un click sur le bouton
}

void setup() {
  button.attachClick(simpleclick); // on associe le fonction callBack à l'appui sur le bouton
}


void loop() {
  button.tick();  // On vérifie l'état des boutons, ce qui déclenche les appels aux fonctions
}


A priori non car j'ai ce message
Quote
'class simpleBouton' has no member named 'attachClick'
Idem avec bouton_aller.attacher(clic);



Comment faire?
Code: [Select]
//essai state machine du 26/04
#include "simpleBouton.h"
#include <AccelStepper.h>

#define FULLSTEP 4
#define HALFSTEP 8

#define motorPin1  8     // Blue   - 28BYJ48 pin 1
#define motorPin2  9     // Pink   - 28BYJ48 pin 2
#define motorPin3  10    // Yellow - 28BYJ48 pin 3
#define motorPin4  11    // Orange - 28BYJ48 pin 4

#define motorPin5  4     // Blue   - 28BYJ48 pin 1
#define motorPin6  5     // Pink   - 28BYJ48 pin 2
#define motorPin7  6     // Yellow - 28BYJ48 pin 3
#define motorPin8  7     // Orange - 28BYJ48 pin 4

// Define two motor objects
// The sequence 1-3-2-4 is required for proper sequencing of 28BYJ48
AccelStepper stepper_ar(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper_camera(HALFSTEP, motorPin5, motorPin7, motorPin6, motorPin8);


simpleBouton bouton_aller(2);
simpleBouton bouton_retour(3);

enum {DEMARRE, ALLER, RETOUR} etatCourant;

// ------------------------------------------------------
// Cette fonction installe l'état initial
// ------------------------------------------------------
void demarre()
{
stepper_ar.moveTo(500);//4096 = 2 tours
 stepper_ar.setSpeed(400);
 etatCourant = DEMARRE;
}


// ------------------------------------------------------
// La fonction de call back, appellée automatiquement quand on clique
// ------------------------------------------------------
void clic()
{
  switch (etatCourant) {
    case ARRET: // on était au repos et on a un appui, on allume la verte
      stepper_ar.moveTo(2000);//4096 = 2 tours
      stepper_ar.setSpeed(400);
      etatCourant = ALLER; // on note le nouvel état de notre système
      break;

    case ALLER: // on était led verte allumée et on a un appui, on allume la jaune
      stepper_ar.moveTo(-2000);//4096 = 2 tours
      stepper_ar.setSpeed(-400);
      etatCourant = RETOUR;// on note le nouvel état de notre système
      break;
  }
}


void setup() {

  bouton_aller.attachClick(clic); // on associe le fonction callBack à l'appui sur le bouton
    bouton_retour.attachClick(clic); // on associe le fonction callBack à l'appui sur le bouton
   
  arret();

stepper_ar.setMaxSpeed(700.0);
stepper_ar.setAcceleration(400.0);
stepper_camera.setMaxSpeed(700.0);
stepper_camera.setAcceleration(400.0);
}



void loop() {
  bouton_aller.actualiser();
  bouton_retour.actualiser();

  stepper_ar.run();
stepper_camera.run();
}


Merci beaucoup !
Title: Re: [Partage] Boutons Poussoirs
Post by: J-M-L on Apr 26, 2019, 02:16 pm
Regardez la classe boutonAction de la librairie ou mon post #35 pour des évolutions
Title: Re: [Partage] Boutons Poussoirs
Post by: ThibaultH on May 08, 2019, 06:13 pm
Bonjour Bricoleau,

tout d'abord je tiens à te remercier de créer des bibliothèques pour simplifier la vie des débutants  :)

J'ai testé différents exemples avec deux boutons poussoirs et je remarque que chez moi il se passe l'inverse entre le code et l'action.
Je m'explique, si je prend l'exemple numéro 1 : état bouton. Au moment de l'appuie sur mon BP j'ai le message Relache sur le moniteur série et quand je le relache j'ai le message Enfonce.

J'ai ce soucis sur tout les exemples, une idée de ce que je fais de mal ?

J'utilise le Grove Button v1.2 de seedstudio

Merci
Title: Re: [Partage] Boutons Poussoirs
Post by: fdufnews on May 08, 2019, 06:50 pm
Si j'en crois les informations sur le site seeedstudio
Quote
This new version of button twig contains one independent button, which are configured with pull-down resistor
le bouton est câblé au plus avec une résistance de tirage à la masse. Donc le branchement est l'inverse de ce que préconise bricoleau dans ses explications. Donc c'est normal que tu trouves un comportement inverse.
Title: Re: [Partage] Boutons Poussoirs
Post by: Kanter on May 20, 2019, 07:56 am
Regardez la classe boutonAction de la librairie ou mon post #35 pour des évolutions
Merci ça marche nickel

Je remercie Bricoleau pour sa libraire : je suis cependant étonné qu'elle fonctionne sans utiliser de debounce et resistance
J'ai teste de nombreux codes/library de boutons et je devais créer un debounce (hardware c'est plus facile pour moi) pour que les boutons fonctionnent à 100%
Avec la librairie de Bricoleau et un circuit ultra basique, nul besoin de quoique ce soit : les boutons lancent les actions à coup certain !
Bizarre...J'ai quand même envie de faire un debounce au cas où...

Qu'en pensez-vous?
Title: Re: [Partage] Boutons Poussoirs
Post by: J-M-L on May 20, 2019, 08:05 am
Je suis cependant étonné qu'elle fonctionne sans utiliser de debounce et resistance
J'ai teste de nombreux codes/library de boutons et je devais créer un debounce (hardware c'est plus facile pour moi) pour que les boutons fonctionnent à 100%
Avec la librairie de Bricoleau et un circuit ultra basique, nul besoin de quoique ce soit : les boutons lancent les actions à coup certain !
Bizarre...J'ai quand même envie de faire un debounce au cas où...

Qu'en pensez-vous?
Lisez le code en détail :)
Title: Re: [Partage] Boutons Poussoirs
Post by: bricoleau on May 20, 2019, 03:12 pm
Hello

Oui d'où le nom de simpleBouton.h  :)

La bibliothèque intègre un debounce logiciel de 20 ms par défaut, valeur que l'on peut changer lors de la déclaration du bouton.

Pour les mordus du fer à souder, il est toujours possible d'ajouter un debounce physique avec une capa en parallèle du bouton.
Et dans ce cas, réduire le délai de debounce logiciel, qui ne sert plus à rien.
Title: Re: [Partage] Boutons Poussoirs
Post by: Kanter on May 20, 2019, 08:07 pm
Bonjour


J'ai regardé le code en question histoire d'être moins bête et je pense avoir trouvé :
Code: [Select]
  //Filtrage temporel
  uint32_t maintenant = millis();
  if (etat_courant != etat_precedent)
  {
    uint32_t delai = maintenant - this->_millis_etat_actuel;
    if (delai < this->_delai_debounce_ms)
    {
      etat_courant = etat_precedent;
    }
  }


Quote
La bibliothèque intègre un debounce logiciel de 20 ms par défaut, valeur que l'on peut changer lors de la déclaration du bouton.
Merci beaucoup !
Je vous donne un karma à tous les deux !
Title: Re: [Partage] Boutons Poussoirs
Post by: SijoreSSuS on May 23, 2019, 02:31 pm
Bonjour Bricoleau,
Je viens de m'inscrire sur le forum juste pour te féliciter pour cette bibliothèque !
Moi qui galérais avec un programme avec l'habituelle "Bounce2", en 2 minute grâce a ton travail, mon programme est opérationnel !

Encore Bravo et Merci !


SijoreSSuS
Title: Re: [Partage] Boutons Poussoirs
Post by: carranen on Aug 24, 2019, 01:38 pm
salut

quel exemple dois-je prendre dans l'IDE pour piloter 4 leds à l'aide de 3 boutons ? Chaque bouton allumant sa led correspondante et éteignant les autres, la 4ème led s'allumant ( et éteignant les autres) en pressant deux fois consécutives sur n'importe quel des trois boutons.

Merci pour le partage. Salutations.
Title: Re: [Partage] Boutons Poussoirs
Post by: J-M-L on Aug 24, 2019, 01:57 pm
Il n'ya Pas d'exemple identique - à vous de le programmer.

Un bouton c'est soit au repos soit appuyé (parfois avec des rebonds entre les 2 positions quand on appuie ou relâche) - à vous de voir quand vous voulez déclenchez l'action - lors de la transition d'appui ou lorsqu'on relâche
Title: Re: [Partage] Boutons Poussoirs
Post by: Velizy_Hills on Aug 28, 2019, 07:42 pm
Bonjour Bricoleau,

Nouveau venu sur le forum et débutant en montages Arduino, je tenais à vous remercier pour le partage de cette librairie et des exemples fournis. C'est clair et cela fonctionne !