L’un des exemples les plus répandu quand on apprend la programmation avec Arduino est la gestion d’un bouton poussoir. En effet, une des fonctions les plus utiles à développer est de pouvoir interagir avec la carte Arduino. L’interface la plus minimaliste est un bouton en entrée et le moniteur série en sortie. De plus, les fonctionnalités que l’on peut développé sur un bouton poussoir peuvent être appliquées à de nombreux capteurs (interrupteur, capteur magnétique, RFID, etc.). Nous allons voir ici quelques unes de ces fonctionnalités.
Matériel
- Ordinateur
- Arduino UNO
- Câble USB pour connecter l’Arduino à l’ordinateur
- Bouton poussoir
Schéma de connexion
Il y a différentes manières de brancher un bouton à la carte Arduino. La plus simple est de la brancher entre la masse et une entrée analogique de l’Arduino. Pour que la pression du bouton soit détectée correctement, nous allons ajouter une résistance de pullup disponible par le code. Ainsi, l’état sera haut (1024) lorsque le bouton est relâché et bas(0) lorsque le bouton est pressé.
Code de base
Dans cet exemple, nous allons détecté si le bouton est pressé ou non.
//Parameters const int btnPin = A0; //Variables int btnVal = 0; void setup(){ //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); //Init btn pinMode(btnPin,INPUT_PULLUP); } void loop() { ////Read pushbutton btnVal=analogRead(btnPin); Serial.print(btnVal); Serial.print(F("-->")); if(btnVal<200){ Serial.println(F("Button is pressed")); }else{ Serial.println(F("Button is released")); } delay(100); }
Le code va constamment lire l’entrée analogique et écrire « bouton pressé » ou « relâché » ce qui n’est pas très propre ni facile à debugger.
Code de détection de l’état du bouton
Une manière d’améliorer ce code est de rajouter une variable qui enregistre l’état du bouton. Ceci permet d’afficher le résultat une seule fois lorsque le bouton a changé d’état.
//Parameters const int btnPin = A0; //Variables int btnVal = 0; bool btnState = false; bool oldbtnState = false; void setup(){ //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); //Init btn pinMode(btnPin,INPUT_PULLUP); } void loop(){ testPushBtn(); } void testPushBtn( ){/* function testPushBtn */ ////Read pushbutton btnVal=analogRead(btnPin); if(btnVal<200){ btnState=true; if(oldbtnState!=btnState) Serial.print(btnVal);Serial.print(F("-->"));Serial.println(F("Button was pressed")); }else{ btnState=false; if(oldbtnState!=btnState) Serial.print(btnVal);Serial.print(F("-->"));Serial.println(F("Button was released")); } oldbtnState=btnState; }
Code pour transformer un bouton poussoir en interrupteur
Une fois l’état du bouton en mémoire, il est facile de transformer le bouton poussoir en interrupteur. Dans cet exemple, la LED s’allume lorsqu’on appuie sur le bouton et s’éteint lorsqu’on appuie de nouveau.
//Parameters const int btnPin = A0; const int ledPin = 13; //Variables int btnVal = 0; bool btnState = false; bool oldbtnState = false; bool ledState = LOW; void setup() { //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); //Init btn pinMode(btnPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); } void loop() { testPushBtn(); } void testPushBtn( ) { /* function testPushBtn */ ////Read pushbutton btnVal = analogRead(btnPin); if (btnVal < 200) { btnState = true; } else { btnState = false; } if (oldbtnState != btnState) { if(btnState==true){ Serial.print(F("Button was pressed")); Serial.print(F("-->")); Serial.print(F("LED ")); ledState = !ledState; Serial.println(ledState); digitalWrite(ledPin, ledState); } } oldbtnState = btnState; }
Mélanger et modifier ces exemple pour obtenir la fonctionnalité que vous désirez. Il est aussi nécessaire dans certains cas de rajouter des fonctions de d’anti-rebond.
Pour une gestion plus avancée du bouton poussoir, vous pouvez utiliser une interruption pour détecter l’état du bouton.
Application
- Créer une interface minimaliste pour votre projet
Sources
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
pas assez détaillé pour des débutants
Bonjour,
Merci pour votre commentaire.
Que manque-t-il, selon vous comme information?
Franchement, chapeau l’artiste. Programme très utile pour un projet pour le bien de notre nation. MERCI !
Merci beaucoup!
Bonjour,
J’ai une petite question: dans le code permettant de récupérer l’état du bouton poussoir, pourquoi le bouton est il considéré comme pressé lorsque sa valeur est inférieure à 200 et à quoi correspond cette valeur?
Merci à vous,
La valeur lue sur la broche analogique est l’image d’une tension. Valeur allant de 0 à 1023 correspondant à une tension comprise entre 0 et 5V.
Dans cette configuration, une résistance pullup est présente sur la broche, lorsque le bouton est relâché, la tension lue est de 5V. Lorsque le bouton est pressé, la broche est reliée à la masse donc on reçoit une valeur nulle. Il est tout à fait possible de prendre une autre valeur que 200.
Bonjour,
Super Tuto !
lorsque que je copie le code dans tinkercad, j’ai un message d’erreur : 18:3 ‘testPushBtn’ not declared …
Merci de votre aide 🙂
Bonjour,
Merci. Il faut certainement déplacer la déclaration de la fonction testPushBtn() avant la déclaration de setup()