Arduino Nano - Knop - Debounce

Wanneer een knop wordt ingedrukt of losgelaten, of een schakelaar wordt omgezet, denken beginners vaak dat de status verandert van LOW naar HIGH of van HIGH naar LOW. In werkelijkheid is dat niet altijd het geval. Door mechanische en fysieke eigenschappen kan de status van de knop (of schakelaar) snel tussendoor meerdere keren heen en weer schakelen tussen LOW en HIGH als reactie op één enkele actie. Dit fenomeen staat bekend als chattering. Chattering kan ervoor zorgen dat één enkele druk wordt gelezen als meerdere drukken, wat kan leiden tot storingen in bepaalde toepassingen.

chattering phenomenon

De methode om dit probleem te elimineren noemen we debouncing of debounce. In deze tutorial leert u hoe u dit toepast wanneer u een knop gebruikt met de Arduino Nano. We doorlopen de volgende stappen:

Hardware Benodigdheid

1×Official Arduino Nano
1×Alternatief: DIYables ATMEGA328P Nano Development Board
1×USB A naar Mini-B USB kabel
1×Breadboard-montage knop met kap
1×Breadboard-montage knop set
1×Paneelmontage drukknop
1×Drukknopmodule
1×Breadboard (experimenteerprint)
1×Jumper draden
1×(Aanbevolen) Schroefklem Uitbreidingsboard voor Arduino Nano
1×(Aanbevolen) Breakout Uitbreidingsboard voor Arduino Nano
1×(Aanbevolen) Stromsplitter voor Arduino Nano

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 nog niet bekend bent met knoppen (pinout, functionaliteit, programmeren, enzovoort), kunnen de volgende tutorials u helpen:

Bedradingsschema

Arduino Nano Knop bedradingsschema

This image is created using Fritzing. Click to enlarge image

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

Laten we de Arduino Nano code zonder en met debounce vergelijken, evenals hun respectievelijke gedrag.

Knop uitlezen zonder Debounce

Voordat we ingaan op het concept van debounce, bekijken we eerst de code zonder debounce en observeren we het gedrag.

Snelle Stappen

  • Verbind een USB-kabel tussen de Arduino Nano en uw pc.
  • Open de Arduino IDE, selecteer het juiste board en de juiste poort.
  • Kopieer onderstaande code en open deze in de Arduino IDE.
/* * 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-debounce */ #define BUTTON_PIN 2 // The number of the pushbutton pin int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // Configure the Arduino Nano pin as a pull-up input // The pull-up input pin is HIGH when the button is open and LOW when pressed. 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) Serial.println("The button is pressed"); else if(prev_button_state == LOW && button_state == HIGH) Serial.println("The button is released"); // save the the last state prev_button_state = button_state; }
  • Klik op de Upload knop in de Arduino IDE om de code te compileren en te uploaden naar het Arduino Nano board.
Arduino IDE Upload Code
  • Open de Seriële Monitor.
  • Druk de knop een paar seconden in en laat hem los.
  • Herhaal dit meerdere keren.
  • Bekijk het resultaat in de Seriële Monitor.
COM6
Send
The button is pressed The button is pressed The button is pressed The button is released The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Soms heeft u de knop maar één keer ingedrukt en losgelaten. Toch interpreteert de Arduino Nano dit als meerdere drukken en loslaten. Dit is het chattering-fenomeen dat eerder in de tutorial is genoemd. Laten we in het volgende deel zien hoe dit op te lossen.

Knop uitlezen met Debounce

De onderstaande code past de methode toe die debounce heet om het chattering-effect te voorkomen.

/* * 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-debounce */ #define BUTTON_PIN 2 // The number of the pushbutton pin const int DEBOUNCE_DELAY = 50; // The debounce time; increase if the output flickers int lastSteadyState = LOW; // The previous steady state from the input pin int lastFlickerableState = LOW; // The previous flickerable state from the input pin int button_state; // The current reading from the input pin // The following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastDebounceTime = 0; // The last time the output pin was toggled void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // Configure the Arduino Nano pin as a pull-up input // The pull-up input pin is HIGH when the button is open and LOW when pressed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); // check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you've waited long enough // since the last press to ignore any noise: // If the switch/button changed, due to noise or pressing: if (button_state != lastFlickerableState) { // reset the debouncing timer lastDebounceTime = millis(); // save the the last flickerable state lastFlickerableState = button_state; } if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) { // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if (lastSteadyState == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if (lastSteadyState == LOW && button_state == HIGH) Serial.println("The button is released"); // save the the last steady state lastSteadyState = button_state; } }

Snelle Stappen

  • Kopieer bovenstaande code en open deze in de Arduino IDE.
  • Klik op de Upload knop in de Arduino IDE om de code naar de Arduino Nano te uploaden.
  • Open de Seriële Monitor.
  • Houd de knop een paar seconden ingedrukt en laat hem los.
  • Bekijk het resultaat in de Seriële Monitor.
COM6
Send
The button is pressed The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Zoals u kunt zien, is de knop slechts één keer ingedrukt en losgelaten. De Arduino Nano herkent dit als een enkele druk en loslaten. Het ongewenste ruis-effect is geëlimineerd.

Het Makkelijk Gemaakt - Arduino Nano Knop Debounce Code met Bibliotheek

We hebben een bibliotheek ontworpen, ezButton, om het eenvoudiger te maken voor beginners, vooral bij het werken met meerdere knoppen. Meer informatie over de ezButton bibliotheek vindt u hier.

Arduino Nano Knop Debounce Code voor Één Knop

#include <ezButton.h> ezButton button(2); // create ezButton object for pin 2; 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()) Serial.println("The button is pressed"); if(button.isReleased()) Serial.println("The button is released"); }

Arduino Nano Knop Debounce Code voor Meerdere Knoppen

/* * 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-debounce */ #include <ezButton.h> ezButton button1(6); // maak ezButton object aan voor pin 6; ezButton button2(7); // maak ezButton object aan voor pin 7; ezButton button3(8); // maak ezButton object aan voor pin 8; void setup() { Serial.begin(9600); button1.setDebounceTime(50); // stel debounce tijd in op 50 milliseconden button2.setDebounceTime(50); // stel debounce tijd in op 50 milliseconden button3.setDebounceTime(50); // stel debounce tijd in op 50 milliseconden } void loop() { button1.loop(); // moet eerst de loop() functie aanroepen button2.loop(); // moet eerst de loop() functie aanroepen button3.loop(); // moet eerst de loop() functie aanroepen if(button1.isPressed()) Serial.println("The button 1 is pressed"); if(button1.isReleased()) Serial.println("The button 1 is released"); if(button2.isPressed()) Serial.println("The button 2 is pressed"); if(button2.isReleased()) Serial.println("The button 2 is released"); if(button3.isPressed()) Serial.println("The button 3 is pressed"); if(button3.isReleased()) Serial.println("The button 3 is released"); }

Het schema bij bovenstaande code: de illustratie van de bedrading bij deze code: De visuele weergave van de bedrading voor deze code:

Arduino Nano meerdere knoppen bedradingsschema

This image is created using Fritzing. Click to enlarge image

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.

Aanvullende Kennis

  • De waarde van DEBOUNCE_DELAY varieert afhankelijk van de fysieke eigenschappen van elke knop. Het is mogelijk dat verschillende knoppen verschillende waarden vereisen.

Uitbreidbaarheid

De debounce-techniek kan ook worden toegepast met een schakelaar, touch sensor en meer.

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