Arduino - Knop - Lang indrukken en kort indrukken

Wij leren:

In de eerste drie delen leren we de principes van detectie.

In het laatste deel leren we hoe we dit praktisch toepassen met debouncing. Zie waarom debouncen belangrijk is voor knoppen. Zonder debouncing kunnen we de knopdrukken foutief herkennen.

Hardware Benodigd

1×Arduino Uno R3
1×USB 2.0 kabel type A/B
1×Breadboard-mount knop met kap
1×Breadboard-mount knop set
1×Paneel-mount drukknop
1×Drukknopmodule
1×Breadboard (experimenteerprint)
1×Jumper draden
1×(Aanbevolen) Schroefklem Block Shield voor Arduino Uno
1×(Aanbevolen) Breadboard-Shield voor Arduino Uno
1×(Aanbevolen) Behuizing voor Arduino Uno
1×(Aanbevolen) Prototyping Basisplaat & Breadboard Kit voor Arduino Uno

Of u kunt de volgende kits kopen:

1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Over de knop

Als u niet bekend bent met de knop (pinout, werking, programmeren, enz.), leer er dan meer over in de volgende tutorials:

Aansluitschema

Arduino Knop Aansluitschema

This image is created using Fritzing. Click to enlarge image

In deze tutorial gebruiken we de interne pull-up weerstand (pull-up resistor). Daarom is de toestand van de knop HIGH (hoog) als deze normaal is en LOW (laag) wanneer de knop wordt ingedrukt.

Hoe Detecteert u Kort Indrukken

We meten de tijdsduur tussen het indrukken en loslaten van de knop. Als de duur korter is dan een bepaalde maximale tijd, detecteren we dit als een kort indrukken.

Laten we stap voor stap kijken:

  • Definieer hoe lang de maximale duur van een kort indrukken is
const int SHORT_PRESS_TIME = 500; // 500 milliseconden
  • Detecteer wanneer de knop wordt ingedrukt en sla de tijd van indrukken op
if(lastState == HIGH && currentState == LOW) pressedTime = millis();
  • Detecteer wanneer de knop wordt losgelaten en sla de tijd van loslaten op
if(lastState == LOW && currentState == HIGH) releasedTime = millis();
  • Bereken de drukduur en
long pressDuration = releasedTime - pressedTime;
  • Bepaal of het een korte druk is door de drukduur te vergelijken met de gedefinieerde maximale korte druk tijd.
if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected");

Arduino Code voor het detecteren van een korte druk

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

Snelle Stappen

  • Upload de bovenstaande code naar de Arduino via de Arduino IDE
  • Druk meerdere keren kort op de knop
  • Bekijk het resultaat in 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 korte druk detecties tonen bij één druk. Dit is normaal gedrag van de knop, dit wordt het “chatterfenomeen” genoemd. Dit probleem wordt opgelost in het laatste deel van deze tutorial.

Hoe Detecteert u Lang Indrukken

Er zijn twee gebruikssituaties voor het detecteren van een lang indrukken:

  • Het lang-druk event wordt gedetecteerd direct nadat de knop wordt losgelaten
  • Het lang-druk event wordt gedetecteerd tijdens het indrukken, ook al is de knop nog niet losgelaten

In de eerste situatie meten we de tijd tussen indrukken en loslaten. Als deze langer is dan een bepaalde tijd, detecteren we lang indrukken.

In de tweede situatie meten we continu de tijd dat de knop ingedrukt wordt en controleren we op lang indrukken totdat de knop losgelaten wordt.

Arduino Code voor het detecteren van lang indrukken na loslaten

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

Snelle Stappen

  • Upload de bovenstaande code naar Arduino via de Arduino IDE
  • Houd de knop ongeveer een seconde ingedrukt en laat los
  • Bekijk het resultaat in de Seriële Monitor
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Het lang-druk event wordt alleen gedetecteerd direct nadat de knop is losgelaten

Arduino Code voor het detecteren van lang indrukken tijdens het indrukken

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

Snelle Stappen

  • Upload de bovenstaande code naar Arduino via de Arduino IDE
  • Houd de knop meerdere seconden ingedrukt en laat los
  • Bekijk het resultaat in de Seriële Monitor
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Het lang-druk event wordt alleen gedetecteerd terwijl de knop nog ingedrukt is

Hoe Detecteert u Zowel Lang Indrukken als Kort Indrukken

Kort indrukken en lang indrukken na loslaten

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

Snelle Stappen

  • Upload de bovenstaande code naar Arduino via de Arduino IDE
  • Druk de knop zowel lang als kort in
  • Bekijk het resultaat in de Seriële Monitor

※ Notiz:

De Seriële Monitor kan meerdere korte druk detecties tonen bij het lang indrukken. Dit is normaal en wordt het “chatterfenomeen” genoemd. Dit wordt opgelost in het laatste deel van deze tutorial.

Kort indrukken en lang indrukken tijdens indrukken

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

Snelle Stappen

  • Upload de bovenstaande code naar Arduino via de Arduino IDE
  • Druk de knop zowel lang als kort in
  • Bekijk het resultaat in de Seriële Monitor

※ Notiz:

De Seriële Monitor kan meerdere korte druk detecties tonen bij het lang indrukken. Dit is normaal en wordt het “chatterfenomeen” genoemd. Dit wordt opgelost in het laatste deel van deze tutorial.

Lang Indrukken en Kort Indrukken met Debouncing

Debouncing is erg belangrijk bij het gebruik van knoppen in veel toepassingen.

Debouncing is iets complexer, vooral bij gebruik van meerdere knoppen. Om het voor beginners makkelijker te maken, hebben we een library ontwikkeld, genaamd ezButton.

We gebruiken deze library in onderstaande codes.

Kort indrukken en lang indrukken met debouncing na loslaten

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

Snelle Stappen

  • Installeer de ezButton library. Zie Hoe te installeren
  • Upload de bovenstaande code naar Arduino via de Arduino IDE
  • Druk de knop zowel lang als kort in
  • Bekijk het resultaat in de Seriële Monitor

Kort indrukken en lang indrukken met debouncing tijdens indrukken

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

Snelle Stappen

  • Installeer de ezButton library. Zie Hoe te installeren
  • Upload de bovenstaande code naar Arduino via de Arduino IDE
  • Druk de knop zowel lang als kort in
  • Bekijk het resultaat 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 is Lang Indrukken en Kort Indrukken Nodig

  • Om het aantal knoppen te verminderen. Eén enkele knop kan meerdere functies hebben. Bijvoorbeeld, een kort indrukken om de werkmodus te veranderen, een lang indrukken om het apparaat uit te schakelen.
  • Gebruik van lang indrukken om per ongeluk kort indrukken te vermijden. Sommige apparaten gebruiken de knop bijvoorbeeld voor een fabrieksreset. Dit kan gevaarlijk zijn als de knop per ongeluk wordt ingedrukt. Daarom is de fabrieksreset alleen geactiveerd als de knop lang wordt ingedrukt (bijvoorbeeld langer dan 5 seconden).

※ 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!