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