Arduino Nano - Knop - Lange Druk en Korte Druk

Deze handleiding leert u hoe u met Arduino Nano een lange druk en korte druk op een knop detecteert. We behandelen gedetailleerd de volgende voorbeelden:

In het laatste gedeelte leren we hoe u debounce gebruikt om knopdrukken in praktische toepassingen te detecteren. Wilt u meer weten over waarom debouncing noodzakelijk is voor knoppen? Bekijk dan dit artikel. Zonder debounce kunnen we soms ten onrechte een korte knopdruk registreren.

Over de Knop

Als u niet vertrouwd bent met knoppen (inclusief pinout, functionaliteit en programmeren), kunnen de volgende tutorials u helpen:

Aansluitschema

Arduino Nano Knop aansluitdiagram

This image is created using Fritzing. Click to enlarge image

Zie De beste manier om Arduino Nano en andere componenten van stroom te voorzien.

In deze handleiding maken we gebruik van de interne pull-up weerstand. Hierdoor is de stand van de knop in rust HIGH en LOW wanneer deze wordt ingedrukt.

Hoe detecteert u een korte druk

We berekenen het interval tussen het moment dat de knop wordt ingedrukt en losgelaten. Als de duur korter is dan een vooraf ingestelde tijd, wordt een korte druk gedetecteerd.

Geef de duur van een korte druk op.

const int SHORT_PRESS_TIME = 500; // 500 milliseconden
  • Detecteer wanneer de knop wordt ingedrukt en registreer het tijdstip.
if(prev_button_state == HIGH && button_state == LOW) time_pressed = millis();
  • Detecteer wanneer de knop wordt losgelaten en registreer het tijdstip.
if(prev_button_state == LOW && button_state == HIGH) time_released = millis();
  • Bereken de duur van de druk.
long press_duration = time_released - time_pressed;
  • Vergelijk de drukduur met de opgegeven korte druk tijd om een korte druk te herkennen.
if( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected");

Arduino Nano Code voor het detecteren van korte druk

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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; }

Snelle stappen

  • Upload de code naar de Arduino Nano via de Arduino IDE.
  • Druk meerdere keren kort op de knop.
  • Controleer de uitvoer op de Seriële Monitor.
COM6
Send
A short press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ Notiz:

De Seriële Monitor kan meerdere detecties van korte drukken tonen bij één druk. Dit is het verwachte gedrag van de knop en wordt het “chattering phenomenon” genoemd. In het afsluitende gedeelte van deze tutorial zullen we dit probleem aanpakken.

Hoe detecteert u een lange druk

Er zijn twee manieren om een lange druk te detecteren:

  • Het lange druk event wordt herkend nadat de knop is losgelaten.
  • Het lange druk event wordt herkend terwijl de knop nog ingedrukt wordt gehouden, zelfs voordat deze is losgelaten.
  1. In de eerste toepassing berekenen we de tijd tussen het indrukken en loslaten van de knop. 2. Is de duur langer dan een bepaalde tijd, dan wordt een lange druk herkend.

In het tweede geval meten we continu de drukduur terwijl de knop ingedrukt wordt gehouden en controleren we voortdurend op lange druk totdat de knop wordt losgelaten. Zodra deze drempel wordt overschreden, herkennen we de lange druk.

Arduino Nano Code voor detectie van lange druk na loslaten

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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; }

Snelle stappen

  • Upload de code naar de Arduino Nano via de Arduino IDE.
  • Wacht een seconde en druk de knop in en laat deze weer los.
  • Bekijk het resultaat op de Seriële Monitor.
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Het event 'lange druk' wordt alleen gedetecteerd wanneer de knop wordt losgelaten.

Arduino Nano Code voor detectie van lange druk tijdens indrukken

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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; }

Snelle stappen

  • Upload de code naar de Arduino Nano via de Arduino IDE.
  • Houd de knop enkele seconden ingedrukt.
  • Controleer de uitvoer op de Seriële Monitor.
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Het event 'lange druk' wordt alleen geregistreerd zolang de knop nog niet is losgelaten.

Hoe detecteert u zowel lange als korte druk

Korte druk en lange druk na loslaten

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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; }

Snelle stappen

  • Upload de code naar de Arduino Nano via de Arduino IDE.
  • Druk de knop kort of lang in.
  • Bekijk de uitvoer op de Seriële Monitor.

※ Notiz:

De Seriële Monitor kan meerdere korte druk detecties weergeven tijdens een lange druk. Dit is het verwachte gedrag van de knop en wordt aangeduid als het "chattering phenomenon". Een oplossing hiervoor wordt gegeven in het afsluitende gedeelte van deze tutorial.

Korte druk en lange druk tijdens indrukken

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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; }

Snelle stappen

  • Upload de code naar de Arduino Nano via de Arduino IDE.
  • Druk de knop lang in en daarna kort.
  • Bekijk het resultaat op de Seriële Monitor.

※ Notiz:

De Seriële Monitor kan meerdere detecties van korte drukken tonen tijdens een lange druk. Dit is het verwachte gedrag van de knop en wordt het “chattering phenomenon” genoemd. Dit probleem wordt later in deze tutorial opgelost.

Lange en korte druk met Debouncing

Het is essentieel om debounce toe te passen op de knop in veel toepassingen.

Debouncing kan ingewikkeld zijn, vooral bij meerdere knoppen. Voor beginners hebben wij de bibliotheek ezButton ontwikkeld om het eenvoudiger te maken.

We gebruiken deze bibliotheek in onderstaande voorbeelden.

Korte en lange druk met debounce na loslaten

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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"); } }

Snelle stappen

  • Installeer de ezButton bibliotheek.
  • Raadpleeg Hoe Te voor installatie-instructies.
  • Upload de code naar de Arduino Nano via de Arduino IDE.
  • Houd de knop kort of lang ingedrukt.
  • Bekijk de resultaten op de Seriële Monitor.

Korte en lange druk met debounce tijdens indrukken

/* * Deze Arduino Nano code is ontwikkeld door newbiely.nl * Deze Arduino Nano code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/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; } } }

Snelle stappen

  • Voeg de ezButton bibliotheek toe aan uw project. Raadpleeg Hoe Te voor instructies.
  • Compileer en upload de code met de Arduino IDE naar uw Arduino Nano.
  • Houd de knop kort of lang ingedrukt.
  • Bekijk de uitvoer in de Seriële Monitor.

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Waarom lange en korte druk nodig is

  • Om het aantal knoppen te minimaliseren, kan één knop meerdere functies hebben. Bijvoorbeeld: een korte druk schakelt de bedieningsmodus, terwijl een lange druk het apparaat uitschakelt.
  • Lange drukken voorkomen ongewenste activering. Sommige apparaten gebruiken een knop bijvoorbeeld voor fabrieksreset. Als de knop per ongeluk wordt ingedrukt, kan dit gevaarlijk zijn. Daarom wordt fabrieksreset alleen geactiveerd als de knop voor een bepaalde tijd wordt ingedrukt (bijvoorbeeld 5 seconden).

Opmerkingen

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!