Bonjour,
Ne trouvant pas de tuto clair en Français sur l’utilisation de la bibliothèque OneButton, mais plutôt des infos parsemées sur le forum et sur GitHub, j'ai écrit celui-ci Il se veut le plus simple possible mais n'hésitez pas à créer un topic si vous avez besoin d'aide!
Notez qu'ici quand je dis bibliothèque c'est juste la version française de l'anglicisme "librairie".
1. Pourquoi utiliser une bibliothèque pour des boutons ?
Gérer un bouton ce n'est pas toujours aussi simple qu'il y parait... En effet on pourrait se dire qu'il suffit de lire une entrée de la carte et de regarder si elle est à 0 ou 1... Dans les faits oui, dans la pratique pas vraiment à cause de ce que l'on appelle des rebonds.
Le bouton ne change pas immédiatement d'état lorsque vous cliquez dessus, c'est un système mécanique avec des imperfections, et celles-ci génère un "bruit" (le signal passe de 0 à 1 plusieurs fois avant de se stabiliser) pendant quelques millisecondes. Pour contrer cela on peut utiliser des anti-rebonds matériels (condensateurs), ou logiciel (et les bibliothèques nous évite d'avoir à les créer nous même
)
OneButton est l'une de ces bibliothèques. Elle inclut un anti-rebonds (pour ceux qui veulent en savoir plus il est basé sur une machine à état décrite ici), ainsi que des méthodes pour gérer des clics simples, doubles, long, etc.
Bien entendu il existe d’autres bibliothèques très bien conçues pour gérer les boutons, comme Toggle de @dlloyd, SimpleBouton de @bricoleau, Button dans easyRun, Bounce2 ou encore EasyButton par exemple... Le choix dépend de vos préférences et de vos besoins, ce tuto parle de OneButton.
2. Manipulation de la bibliothèque OneButton
2.1 Installation
Pour utiliser la bibliothèque OneButton, rien n’est plus simple ! Elle est disponible dans le gestionnaire de bibliothèques, il suffit donc de la chercher et de cliquer sur Installer.
Installation manuelle
Si vous préférez faire cela à la main, tout d’abord téléchargez le fichier .zip sur le GitHub.
Ensuite, décompressez le fichier et ajoutez le à votre code, en cliquant sur Croquis → Inclure une bibliothèque → Ajouter la bibliothèque .ZIP …
2.2 Utilisation basique
Dans votre code, vous incluez la bibliothèque avec la directive de préprocesseur #include
#include <OneButton.h>
Ensuite on veut créer une instance de la classe OneButton, un "objet bouton", et le rattacher à une pin en particulier de notre carte. Pour ce faire, on crée d'abord l'objet, puis dans la fonction setup de notre programme, on le configure.
// on crée l'objet du bouton (sans paramètre)
OneButton bouton;
void setup()
{
/*
- On indique que le bouton est sur la pin 2
Les paramètres suivants sont définis par défaut
- que cette pin est en mode INPUT_PULLUP
- que le bp est actif à `LOW` (il retourne `LOW` quand il est pressé)
*/
bouton.setup(2, INPUT_PULLUP, true);
}
void loop() {}
Pourquoi utiliser la fonction setup sur le bouton
Cette fonction existe depuis qu'un bug à été découvert (cf cette issue sur GitHub) - sur certaines cartes Arduino spéciales comme la NANO ESP32 par exemple, l'utilisation de pinMode dans le constructeur ne fonctionne pas comme espéré (le mode est perdu avant d'arriver au setup()), et donc la pin n'est pas configurée comme voulu pour le bouton.
Pour corriger cela, Matthias Hertel a modifié sa bibliothèque pour y intégrer une fonction appelée setup dans laquelle on peut passer
- La pin du bouton,
- Le mode (c'est-à-dire si la pin est en
INPUT_PULLUPou non) - Le sens dans lequel le bouton fonctionne (si il est actif à
LOWou àHIGH)
Bon, c'est bien beau, on a un objet bouton attaché à une pin de la carte mais pour l'instant si on clique dessus il ne se passe rien.
On doit maintenant attacher nos fonctions utiles, dites fonctions de callback (en anglais pour fonction de rappel) dans lesquelles on écrit ce qu'on veut faire pour un type de clic. OneButton est bien faite et propose des méthodes pour cela :
void fClicSimple()
{
// ici le code à exécuter en cas de clic simple
}
void fClicDouble()
{
// ici le code pour un clic double
}
void setup()
{
// après la création de l'objet bouton et son setup bien sûr
bouton.attachClick(fClicSimple);
bouton.attachDoubleClick(fClicDouble);
}
Cliquez pour la liste des types d'événements
Voici un tableau regroupant tous les événements que la bibliothèque peut gérer sur vos boutons.
| Attacher la fonction | Description |
|---|---|
attachClick |
Se déclenche dès qu'un seul clic est détecté. |
attachDoubleClick |
Se déclenche dès qu'un double clic est détecté. |
attachMultiClick |
Se déclenche dès que plusieurs clics ont été détectés. |
attachLongPressStart |
Se déclenche dès que le bouton est maintenu enfoncé pendant 800 millisecondes. |
attachDuringLongPress |
Se déclenche périodiquement tant que le bouton est maintenu enfoncé. |
attachLongPressStop |
Se déclenche lorsque le bouton est relâché après un long maintien. |
Notez que vous pouvez nommer les fonctions de callback comme vous le voulez! Il faut juste penser à les lier au(x) bouton(x) dans le setup (vous pouvez aussi changer la fonction attachée à un type de clic pendant le déroulement du programme, donc dans la loop)
Parfait, maintenant on peut exécuter une logique pour plusieurs type de clic sur un ou plusieurs boutons. Je lance le programme comme ça ?
Non, car si on lance le code tel quel, rien ne se passera. Pourquoi ? Parce qu'on a besoin que la bibliothèque "lise" régulièrement la pin du bouton pour détecter nos événements (les clics). Pour cela il existe la méthode tick, à appeler pour chaque objet bouton.
Notez que quand je dis régulièrement, c'est le plus souvent possible, donc on évite les codes bloquants au maximum. Si vous ne savez pas faire, renseignez vous sur millis.
void loop()
{
/*
C’est cet appel qui déclenchera l’appel de la fonction de callback
si une action pré enregistrée (donc ici le simple clic ou le
double clic) est activée
*/
bouton.tick();
}
Il existe d'autres méthodes dans cette bibliothèque, mais pour gérer un bouton c'est la base.
Pour en savoir plus, notamment pour interroger l'état du bouton ou modifier les timings (d'un clic long, d'un double clic ou même de l'anti-rebonds), rendez-vous sur le GitHub.
2.3 Petite synthèse
Donc, si on résume, pour utiliser un bouton que faut-il ?
Il faut importer la bibliothèque, puis créer un objet pour chaque bouton qu'on veut utiliser, puis dans le setup le configurer (pin, mode, etc.) et attacher aux événements dont on a besoin nos fonctions de callback. Enfin dans la loop, on appelle tick sur chaque objet bouton pour détecter nos événements. En code ça donne ça :
#include <OneButton.h>
OneButton bouton;
void fClicSimple()
{
Serial.println("Un clic simple a été détecté!");
}
void fClicDouble()
{
Serial.println("Un double clic a été détecté!");
}
void setup()
{
Serial.begin(115200);
bouton.setup(2);
bouton.attachClick(fClicSimple);
bouton.attachDoubleClick(fClicDouble);
}
void loop()
{
bouton.tick();
}



