Arduino Nano - Bouton - Pression longue Pression courte

Ce tutoriel vous explique comment utiliser un Arduino Nano pour détecter les appuis longs et courts sur un bouton. En détail, nous passerons en revue les exemples suivants :

Dans la dernière section, nous apprendrons comment utiliser l'anti-rebond pour détecter les pressions sur un bouton dans des applications pratiques. Pour en savoir plus sur pourquoi l'anti-rebond est nécessaire pour les boutons, veuillez consulter cet article. Sans cela, nous pourrions détecter par erreur une courte pression du bouton.

Préparation du matériel

1×Arduino Nano
1×USB A to Mini-B USB cable
1×Push Button
1×(Optional) Panel-mount Push Button
1×Breadboard
1×Jumper Wires
1×(Optional) 9V Power Adapter for Arduino Nano
1×(Recommended) Screw Terminal Adapter for Arduino Nano

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 du bouton

Si vous n'êtes pas familier avec les boutons (y compris les brochages, les fonctionnalités et la programmation), les tutoriels suivants peuvent vous aider :

Diagramme de câblage

Schéma de câblage du bouton Arduino Nano

This image is created using Fritzing. Click to enlarge image

Dans ce tutoriel, nous utiliserons la résistance de tirage interne. En conséquence, l'état du bouton est HAUT dans son état normal et BAS lorsqu'il est pressé.

Comment détecter une pression courte

Nous calculons l'intervalle entre les événements pressé et relâché. Si la durée est inférieure à un temps prédéfini, alors l'événement de pression courte est identifié.

Précisez la durée d'une pression courte.

const int SHORT_PRESS_TIME = 500; // 500 millisecondes
  • Identifier quand le bouton a été pressé et enregistrer l'heure à laquelle il a été poussé.
if(prev_button_state == HIGH && button_state == LOW) time_pressed = millis();
  • Détectez lorsque le bouton est relâché et enregistrez l'heure de libération.
if(prev_button_state == LOW && button_state == HIGH) time_released = millis();
  • Pression
  • Calculez la durée et la quantité de pression appliquée.
long press_duration = time_released - time_pressed;
  • Comparez la durée de pression au temps de pression courte spécifié pour identifier une pression courte.
if( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected");

Code Arduino Nano pour détecter une pression courte

/* * Ce code Arduino Nano a été développé par newbiely.fr * Ce code Arduino Nano 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-nano/arduino-nano-button-long-press-short-press */ const int BUTTON_PIN = 2; // The number of the pushbutton pin const int SHORT_PRESS_TIME = 500; // 500 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long time_pressed = 0; unsigned long time_released = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); if(prev_button_state == HIGH && button_state == LOW) // button is pressed time_pressed = millis(); else if(prev_button_state == LOW && button_state == HIGH) { // button is released time_released = millis(); long press_duration = time_released - time_pressed; if( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } // save the the last state prev_button_state = button_state; }

Étapes rapides

  • Téléchargez le code sur Arduino Nano en utilisant l'IDE Arduino.
  • Appuyez brièvement sur le bouton plusieurs fois.
  • Vérifiez la sortie 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 pressions courtes pour une seule pression. C'est le comportement attendu du bouton, connu sous le nom de « phénomène de rebond ». Nous aborderons ce problème dans la partie conclusive de ce tutoriel.

Comment détecter une pression longue

Il y a deux scénarios pour détecter une pression longue :

  • L’événement de pression prolongée est identifié une fois le bouton relâché.
  • L’événement de pression prolongée est identifié tandis que le bouton est maintenu enfoncé, même avant qu’il ne soit relâché.
  • 1. Pour l'application initiale, nous calculerons la période de temps entre les événements pressé et relâché. 2. Si la durée dépasse un temps prédéterminé, alors l’événement de pression prolongée est identifié.

Dans le deuxième cas d'utilisation, lorsqu'on appuie sur le bouton, le temps de pression est mesuré en continu et l'événement de pression longue est vérifié jusqu'à ce que le bouton soit relâché. Pendant que le bouton est pressé, si la durée dépasse un temps prédéfini, l'événement de pression longue est détecté.

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

/* * Ce code Arduino Nano a été développé par newbiely.fr * Ce code Arduino Nano 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-nano/arduino-nano-button-long-press-short-press */ const int BUTTON_PIN = 2; // The number of the pushbutton pin const int LONG_PRESS_TIME = 1000; // 1000 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long time_pressed = 0; unsigned long time_released = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); if(prev_button_state == HIGH && button_state == LOW) // button is pressed time_pressed = millis(); else if(prev_button_state == LOW && button_state == HIGH) { // button is released time_released = millis(); long press_duration = time_released - time_pressed; if( press_duration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } // save the the last state prev_button_state = button_state; }

Étapes rapides

  • Téléchargez le code sur Arduino Nano en utilisant l'IDE Arduino.
  • Attendez une seconde puis appuyez et relâchez le bouton.
  • 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 pression longue n'est identifié que lorsque le bouton est relâché.

Code Arduino Nano pour détecter une pression longue lors de l'appui

/* * Ce code Arduino Nano a été développé par newbiely.fr * Ce code Arduino Nano 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-nano/arduino-nano-button-long-press-short-press */ const int BUTTON_PIN = 2; // The number of the pushbutton pin const int LONG_PRESS_TIME = 1000; // 1000 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long time_pressed = 0; bool is_pressing = false; bool is_long_detected = false; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); if(prev_button_state == HIGH && button_state == LOW) { // button is pressed time_pressed = millis(); is_pressing = true; is_long_detected = false; } else if(prev_button_state == LOW && button_state == HIGH) { // button is released is_pressing = false; } if(is_pressing == true && is_long_detected == false) { long press_duration = millis() - time_pressed; if( press_duration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); is_long_detected = true; } } // save the the last state prev_button_state = button_state; }

Étapes rapides

  • Téléchargez le code sur Arduino Nano en utilisant l'IDE Arduino.
  • Appuyez et maintenez le bouton pendant quelques secondes.
  • Vérifiez la sortie sur le moniteur série.
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

L'événement d'appui long n'est enregistré que lorsque le bouton n'a pas été relâché.

Comment détecter à la fois une pression longue et une pression courte

Pression courte et pression longue après relâchement

/* * Ce code Arduino Nano a été développé par newbiely.fr * Ce code Arduino Nano 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-nano/arduino-nano-button-long-press-short-press */ const int BUTTON_PIN = 2; // The number of the pushbutton pin const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int LONG_PRESS_TIME = 1000; // 1000 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long time_pressed = 0; unsigned long time_released = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); if(prev_button_state == HIGH && button_state == LOW) // button is pressed time_pressed = millis(); else if(prev_button_state == LOW && button_state == HIGH) { // button is released time_released = millis(); long press_duration = time_released - time_pressed; if( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); if( press_duration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } // save the the last state prev_button_state = button_state; }

Étapes rapides

  • Téléchargez le code sur l'Arduino Nano en utilisant l'IDE Arduino.
  • Appuyez sur le bouton pendant un court ou un long moment.
  • Vérifiez la sortie sur le moniteur série.

※ NOTE THAT:

Le moniteur série peut afficher plusieurs détections de pressions courtes lorsqu'une pression longue est effectuée. C'est le comportement attendu du bouton et est appelé le "phénomène de rebond". Une solution à ce problème sera fournie dans la section de conclusion de ce tutoriel.

Pression courte et pression longue pendant la pression

/* * Ce code Arduino Nano a été développé par newbiely.fr * Ce code Arduino Nano 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-nano/arduino-nano-button-long-press-short-press */ const int BUTTON_PIN = 2; // The number of the pushbutton pin const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int LONG_PRESS_TIME = 1000; // 1000 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long time_pressed = 0; unsigned long time_released = 0; bool is_pressing = false; bool is_long_detected = false; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); if(prev_button_state == HIGH && button_state == LOW) { // button is pressed time_pressed = millis(); is_pressing = true; is_long_detected = false; } else if(prev_button_state == LOW && button_state == HIGH) { // button is released is_pressing = false; time_released = millis(); long press_duration = time_released - time_pressed; if( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } if(is_pressing == true && is_long_detected == false) { long press_duration = millis() - time_pressed; if( press_duration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); is_long_detected = true; } } // save the the last state prev_button_state = button_state; }

Étapes rapides

  • Téléchargez le code sur l'Arduino Nano en utilisant l'IDE Arduino.
  • Appuyez sur le bouton pendant longtemps puis brièvement.
  • Consultez le résultat sur le moniteur série.

※ NOTE THAT:

Le moniteur série peut afficher plusieurs pressions courtes détectées lorsqu'une pression longue est effectuée. C'est le comportement attendu du bouton et est désigné sous le nom de « phénomène de rebond ». Ce problème sera abordé dans la section de conclusion de ce tutoriel.

Appui long et appui court avec anti-rebond

Il est essentiel d'implémenter l'anti-rebond sur le bouton dans de nombreuses applications.

Le debounce peut être compliqué, notamment lorsque plusieurs boutons sont impliqués. Pour le simplifier pour les débutants, nous avons développé une bibliothèque, connue sous le nom de 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 Nano a été développé par newbiely.fr * Ce code Arduino Nano 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-nano/arduino-nano-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(2); // create ezButton object for pin 2 unsigned long time_pressed = 0; unsigned long time_released = 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()) time_pressed = millis(); if(button.isReleased()) { time_released = millis(); long press_duration = time_released - time_pressed; if( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); if( press_duration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } }

Étapes rapides

  • Installez la bibliothèque ezButton.
  • Consultez Comment faire pour les instructions.
  • Téléchargez le code sur Arduino Nano en utilisant l'IDE Arduino.
  • Appuyez et maintenez le bouton pendant une courte ou longue période.
  • Consultez les résultats sur le moniteur série.

Appui court et appui long avec anti-rebondissement lors de la pression

/* * Ce code Arduino Nano a été développé par newbiely.fr * Ce code Arduino Nano 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-nano/arduino-nano-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(2); // create ezButton object for pin 2 unsigned long time_pressed = 0; unsigned long time_released = 0; bool is_pressing = false; bool is_long_detected = 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()){ time_pressed = millis(); is_pressing = true; is_long_detected = false; } if(button.isReleased()) { is_pressing = false; time_released = millis(); long press_duration = time_released - time_pressed; if( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } if(is_pressing == true && is_long_detected == false) { long press_duration = millis() - time_pressed; if( press_duration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); is_long_detected = true; } } }

Étapes rapides

  • Incluez la bibliothèque ezButton dans votre projet. Consultez Comment faire pour les instructions.
  • Compilez et téléchargez le code sur votre carte Arduino Nano en utilisant l'IDE Arduino.
  • Appuyez et maintenez le bouton pendant une courte ou longue période.
  • Vérifiez la sortie sur le moniteur série.

Vidéo

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

  • Pour minimiser le nombre de boutons, un seul bouton peut avoir plusieurs fonctions. Par exemple, une pression courte peut être utilisée pour changer le mode de fonctionnement, tandis qu'une pression longue peut servir à éteindre l'appareil.
  • La pression longue est utilisée pour éviter une activation accidentelle. Par exemple, certains appareils utilisent un bouton pour la réinitialisation d'usine. Si celui-ci est pressé accidentellement, cela pourrait être dangereux. Pour éviter cela, l'appareil est conçu de manière à ce que la réinitialisation d'usine ne soit déclenchée que lorsque le bouton est maintenu enfoncé pendant un certain temps (par exemple, 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!