Gérer un bouton poussoir On / Off sur Arduino
Dans cet article je vais présenter la manière de gérer un bouton pousssoir avec une action ON – OFF en prenant l’exemple d’une LED mais qui sera adaptable pour n’importe quelle autre projet plus avancé type :
- faire tourner un servo moteur ou l’arrêter
- action de changement d’affichage sur un écran
- etc (Voir mes autres articles)
Quand on débute sur Arduino, notre premier réflexe est souvent de vouloir allumer et éteindre une LED grâce à un bouton poussoir. Mais dans la plupart des tutoriels voici ce qui se passe : Lorsqu’on appuie sur le bouton la LED s’allume mais lorsqu’on le relâche, la LED s’éteint.
Avec cet exemple de LED on veut donc :
- Que la LED s’allume lorsqu’on appuie sur le bouton poussoir et qu’elle reste allumée tant qu’on a pas de nouveau appuyé sur le bouton.
- Que la LED s’éteigne lorsqu’on appuie de nouveau sur le bouton poussoir
- et ainsi de suite.
Le montage electronique
Pour réaliser ce montage il vous faut :
- 2 résistances de 220ohm
- Un bouton poussoir
- Une LED
- Des fils de connexion
- une breadboard (planche à pain).
- Un Arduino ( oui oui ).
Ici, rien d’exotique et de compliqué, le but étant de comprendre le code qui suit. Notons simplement que notre LED est reliée au pin 8 de notre Arduino Uno et que le bouton poussoir est relié au pin 4.
Le code pour manager le boutton on / off
// *** affectation des variables ***
int ledPin = 8; // ma led = pin 8 du arduino
int buttonPin = 4; // le bouton = pin 4
int timeDelay = 500; // mon temps de delai
// L'état initial de mon bouton poussoir (ici éteint)
bool buttonState = false;
void setup()
{
pinMode(ledPin, OUTPUT); // init de ma led
pinMode(buttonPin, INPUT); // init de mon bouton
}
void loop()
{
// condition 1 : bouton appuyé ET état actuel du bouton éteint
if (digitalRead(buttonPin) == HIGH && !buttonState)
{
digitalWrite(ledPin, HIGH); // j'allume ma led
buttonState = !buttonState; // je change l'état de false à true
delay(timeDelay); // je mets un temps de delai
}
// condition 2 : bouton appuyé ET état actuel du bouton allumé
if (digitalRead(buttonPin) == HIGH && buttonState)
{
digitalWrite(ledPin, LOW); // j'éteins ma led
buttonState = !buttonState; // je change l'état du bouton à false
delay(timeDelay); // je mets un temps de delai
}
}
Retrouvez le code et le montage en ligne
Vous pouvez retrouver le code et le montage en ligne :
- Ici > lien vers Tinkercad si vous voulez simuler le comportement sur ce logiciel gratuit en ligne.
- Ici > lien vers Youtube si vous voulez retrouver les explications en vidéo
- et lire la suite si vous voulez des explications complémentaires.
Explications du code
Il faut noter l’importance de la variable buttonState
puisque c’est elle qui va définir si la LED doit s’allumer ou s’éteindre lorsque j’appuie sur mon bouton poussoir. De base, on initialise cette variable à false
ce qui signifie que lorsqu’on va lancer notre programme, on va vouloir que notre LED soit éteinte. Et dans le loop()
on exécutera en continue 2 conditions :
Condition 1 : Dès que l’on detecte que le bouton est enfoncé (via le digitalRead(buttonPin) == HIGH
) ET QUE l’état actuel de notre bouton est à false
(éteinte), ALORS ce n’est que dans ce cas que l’on doit allumer notre LED. Et c’est ce que l’on fait dans cette condition :
- On allume notre LED via
digitalWrite(ledPin, HIGH);
- On change l’état de notre bouton de
false
àtrue
puisque désormais notre LED est allumée. - On laisse un petit temps de delai qui sert vulgairement à laisser le temps au arduino d’allumer la LED et sortir de la condition
Condition 2 : Ici, c’est l’inverse de la première condition. Dès que l’on détecte que le bouton est enfoncé ET QUE cette fois, l’état actuel du bouton est à true
(actuellement allumée) ALORS ce n’est que dans ce cas que l’on va devoir éteindre notre LED.
Et c’est tout ! Bon courage pour le montage et le code !