Arduino - Bouton - Appui long, Appui court

Nous apprendrons :

Dans les trois premières parties, nous apprenons comment détecter en principe.

Dans la dernière partie, nous apprenons à détecter en usage pratique en appliquant l'anti-rebond. Voir pourquoi avons-nous besoin de l'anti-rebond pour un bouton. Sans anti-rebond, nous pourrions détecter incorrectement une courte pression sur le bouton.

Préparation du matériel

1×Arduino Uno
1×USB 2.0 cable type A/B
1×Push Button
1×(Optional) Panel-mount Push Button
1×Breadboard
1×Jumper Wires
1×(Optional) 9V Power Adapter for Arduino
1×(Recommended) Screw Terminal Block Shield for Arduino Uno
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À propos de Button

Si vous ne connaissez pas les boutons (brochage, fonctionnement, programmation...), renseignez-vous grâce aux tutoriels suivants :

Diagramme de câblage

Schéma de câblage du bouton Arduino

This image is created using Fritzing. Click to enlarge image

Dans ce tutoriel, nous utiliserons la résistance de tirage interne. Par conséquent, l'état du bouton est HIGH lorsque celui-ci est en position normale et LOW lorsqu'il est pressé.

Comment détecter une pression courte

Nous mesurons la durée entre les événements de pression et de relâchement. Si cette durée est inférieure à un temps défini, l'événement de pression courte est détecté.

Voyons étape par étape :

  • Définissez la durée maximale d'une pression courte.
const int SHORT_PRESS_TIME = 500; // 500 millisecondes
  • Détectez si le bouton est pressé et enregistrez l'heure de pression.
if(lastState == HIGH && currentState == LOW) pressedTime = millis();
  • Détecter que le bouton est relâché et enregistrer le moment de relâchement.
if(lastState == LOW && currentState == HIGH) releasedTime = millis();
  • Calculez la durée de pression et
long pressDuration = releasedTime - pressedTime;
  • Déterminez l'appui court en comparant la durée de l'appui avec le temps défini pour un appui court.
if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected");

Code Arduino pour détecter une pression courte

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/arduino-button-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int SHORT_PRESS_TIME = 500; // 500 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) // button is pressed pressedTime = millis(); else if(lastState == LOW && currentState == HIGH) { // button is released releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } // save the the last state lastState = currentState; }

Étapes rapides

  • Téléchargez le code ci-dessus sur Arduino via l'IDE Arduino
  • Appuyez brièvement sur le bouton plusieurs fois.
  • Voir le résultat sur le moniteur série
COM6
Send
A short press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ NOTE THAT:

Le moniteur série peut afficher plusieurs détections de pression courte pour une pression. Ceci est le comportement normal du bouton. Ce comportement est appelé le « phénomène de rebond ». Le problème sera résolu dans la dernière partie de ce tutoriel.

Comment détecter un appui long

Il existe deux cas d'utilisation pour détecter l'appui long.

  • L'événement de pression longue est détecté juste après que le bouton soit relâché.
  • L'événement de pression longue est détecté pendant que le bouton est pressé, même si le bouton n'est pas encore relâché.

Dans le premier cas d'utilisation, nous mesurons la durée entre les événements d'appui et de relâchement. Si la durée est plus longue qu'un temps défini, l'événement de pression longue est détecté.

Dans le deuxième cas d'utilisation, après que le bouton a été pressé, nous mesurons en continu le temps de pression et vérifions l'événement de pression longue jusqu'à ce que le bouton soit relâché. Pendant que le bouton est pressé, si la durée est supérieure à un temps défini, l'événement de pression longue est détecté.

Code Arduino pour détecter une pression longue lors du relâchement

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/arduino-button-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int LONG_PRESS_TIME = 1000; // 1000 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) // button is pressed pressedTime = millis(); else if(lastState == LOW && currentState == HIGH) { // button is released releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } // save the the last state lastState = currentState; }

Étapes rapides

  • Téléchargez le code ci-dessus sur Arduino via l'IDE Arduino
  • Appuyez sur le bouton et relâchez-le après une seconde.
  • Vérifiez le résultat sur le moniteur série
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

L'événement de longue pression est détecté uniquement juste après que le bouton soit relâché.

Code Arduino pour détecter une pression longue pendant l'appui

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/arduino-button-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int LONG_PRESS_TIME = 1000; // 1000 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; bool isPressing = false; bool isLongDetected = false; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) { // button is pressed pressedTime = millis(); isPressing = true; isLongDetected = false; } else if(lastState == LOW && currentState == HIGH) { // button is released isPressing = false; } if(isPressing == true && isLongDetected == false) { long pressDuration = millis() - pressedTime; if( pressDuration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); isLongDetected = true; } } // save the the last state lastState = currentState; }

Étapes rapides

  • Téléchargez le code ci-dessus sur Arduino via l'IDE Arduino
  • Appuyez sur le bouton et relâchez-le après plusieurs secondes.
  • Voir le résultat sur le moniteur série
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

L'événement de longue pression est détecté uniquement lorsque le bouton n'est pas encore relâché.

Comment détecter à la fois les appuis longs et courts

Appui court et appui long après relâchement

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/arduino-button-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int LONG_PRESS_TIME = 1000; // 1000 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) // button is pressed pressedTime = millis(); else if(lastState == LOW && currentState == HIGH) { // button is released releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); if( pressDuration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } // save the the last state lastState = currentState; }

Étapes rapides

  • Téléchargez le code ci-dessus sur Arduino via l'IDE Arduino
  • Appuyez longuement et brièvement sur le bouton.
  • Voir le résultat sur le moniteur série

※ NOTE THAT:

Le moniteur série peut afficher plusieurs détections de pression courte lors d'une pression longue. C'est le comportement normal du bouton. Ce comportement est appelé le "phénomène de rebond". Le problème sera résolu dans la dernière partie de ce tutoriel.

Appui court et appui long pendant la pression

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/arduino-button-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int LONG_PRESS_TIME = 1000; // 1000 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; unsigned long releasedTime = 0; bool isPressing = false; bool isLongDetected = false; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) { // button is pressed pressedTime = millis(); isPressing = true; isLongDetected = false; } else if(lastState == LOW && currentState == HIGH) { // button is released isPressing = false; releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } if(isPressing == true && isLongDetected == false) { long pressDuration = millis() - pressedTime; if( pressDuration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); isLongDetected = true; } } // save the the last state lastState = currentState; }

Étapes rapides

  • Téléchargez le code ci-dessus sur Arduino via l'IDE Arduino
  • Appuyez longuement et brièvement sur le bouton.
  • Observez le résultat sur le moniteur série

※ NOTE THAT:

Le moniteur série peut afficher plusieurs détections de pression courte lors d'une pression longue. Ceci est le comportement normal du bouton. Ce comportement est appelé le « phénomène de rebond ». Le problème sera résolu dans la dernière partie de ce tutoriel.

Appui long et appui court avec anti-rebond

Il est très important de désactiver le rebond du bouton dans de nombreuses applications.

Le debounce est un peu compliqué, surtout lorsqu'on utilise plusieurs boutons. Pour rendre cela beaucoup plus facile pour les débutants, nous avons créé une bibliothèque, appelée ezButton.

Nous utiliserons cette bibliothèque dans les codes ci-dessous.

Appui court et appui long avec anti-rebond après relâchement

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/arduino-button-long-press-short-press */ #include <ezButton.h> const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int LONG_PRESS_TIME = 1000; // 1000 milliseconds ezButton button(7); // create ezButton object that attach to pin 7; unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first if(button.isPressed()) pressedTime = millis(); if(button.isReleased()) { releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); if( pressDuration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } }

Étapes rapides

  • Installez la bibliothèque ezButton. Voir Comment faire
  • Téléversez le code ci-dessus dans l'Arduino via l'IDE Arduino.
  • Appuyez longuement et brièvement sur le bouton.
  • Consultez le résultat sur le moniteur série.

Pression courte et pression longue avec anti-rebond pendant la pression

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/arduino/arduino-button-long-press-short-press */ #include <ezButton.h> const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int LONG_PRESS_TIME = 1000; // 1000 milliseconds ezButton button(7); // create ezButton object that attach to pin 7; unsigned long pressedTime = 0; unsigned long releasedTime = 0; bool isPressing = false; bool isLongDetected = false; void setup() { Serial.begin(9600); button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first if(button.isPressed()){ pressedTime = millis(); isPressing = true; isLongDetected = false; } if(button.isReleased()) { isPressing = false; releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } if(isPressing == true && isLongDetected == false) { long pressDuration = millis() - pressedTime; if( pressDuration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); isLongDetected = true; } } }

Étapes rapides

  • Installez la bibliothèque ezButton. Voir Comment faire
  • Téléversez le code ci-dessus dans Arduino via l'IDE Arduino
  • Appuyez longuement et brièvement sur le bouton.
  • Voir le résultat sur le moniteur série

Vidéo

Pourquoi a-t-on besoin d'une pression longue et d'une pression courte

  • Pour économiser le nombre de boutons. Un seul bouton peut contenir deux fonctionnalités ou plus. Par exemple, une pression courte pour changer de mode de fonctionnement, une pression longue pour éteindre l'appareil.
  • Utilisation de la pression longue pour réduire les pressions courtes accidentelles. Par exemple, certains types d'appareils utilisent le bouton pour la réinitialisation d'usine. Si le bouton est pressé accidentellement, cela peut être dangereux. Pour l'éviter, l'appareil est configuré pour ne se réinitialiser en usine que lorsqu'on appuie longuement sur le bouton (par exemple, plus de 5 secondes).

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!