Close

Arduino základy – 9. funkce debounce

Zapojení tlačítka k Arduinu pomocí breadboardu

Na tomto příkladu si ukážeme, jak použít funkci debounce (ošetření zákmitů) na vstup (tlačítko). Provedeme dvě kontroly v krátkém časovém intervalu ve snaze ujistit se, že tlačítko je opravdu stlačené. Bez použití této funkce si Arduino může jedno stlačení interpretovat jako několik stlačení jdoucích krátce po sobě. Pro kontrolu okamžiku stlačení tlačítka použijeme funkci millis().

Potřebný hardware

– Arduino
– přechodné tlačítko či spínač
– rezistor s odporem 10 kΩ
– zkušební deska
– propojovací vodič

Obvod

button (2)

Schéma

button_sch (1)

Kód

/* Debounce Pokaždé, když se vstupní pin změní z LOW na HIGH  (například kvůli stlačení tlačítka),  výstupní pin je přepnut z LOW na HIGH nebo naopak. Mezi přepnutími je minimální prodleva,  která slouží pro ošetření zákmitů (debouncing) obvodu. Obvod: * LED připojena od pinu 13 k zemi  * tlačítko připojené od pinu 2 k +5V * 10 kΩ rezistor připojen od pinu 2 k zemi * Poznámka: Na většině Arduin je LED k pinu 13 již připojena, takže k tomuto příkladu už další  komponenty nebudete potřebovat. vytvořeno 21. listopadu 2006 autorem David A. Mellis upraveno 30. srpna 2011 Limor Fried upraveno 28. prosince 2012 Mike Walters Příklad tohoto kódu je veřejnou doménou. http://www.arduino.cc/en/Tutorial/Debounce */ // konstanty použité k nastavení čísel pinů se nezmění: const int buttonPin = 2; // číslo pinu tlačítka const int ledPin = 13; // číslo pinu LED // Proměnné se změní: int ledState = HIGH; // současný stav výstupního pinu int buttonState; //nejnovější hodnota načtená ze vstupního pinu int lastButtonState = LOW; // předchozí hodnota načtení ze vstupního pinu // Následné proměnné jsou typu long, jelikož čas měřený v milisekundách se  //rychle změní na větší číslo, jež nemůže být uloženo v int long lastDebounceTime = 0; // čas posledního změny výstupního pinu long debounceDelay = 50; // čas debounce prodlevy; pokud výstup bliká,                                              //je potřeba čas „zvětšit“ void setup() {     pinMode(buttonPin, INPUT);     pinMode(ledPin, OUTPUT);          // nastavte počáteční stav LED     digitalWrite(ledPin, ledState); } void loop() {     // Stav spínače přiřaďte do místní proměnné:     int reading = digitalRead(buttonPin);          // Zkontroluje, zda-li jste stlačili tlačítko     // (tj. že vstup se z LOW změnil na HIGH), a od posledního zmáčknutí jste čekali     // dostatečně dlouho na to, aby byl veškerý šum ignorován:          // Pokud se spínač změnil kvůli šumu nebo stlačení:     if (reading != lastButtonState) {         // upravte proměnou lastDebounceTime         lastDebounceTime = millis();     }          if ((millis() - lastDebounceTime) > debounceDelay) {         // Ať už je načtená hodnota jakákoliv, byla tam déle než debounce prodleva,          // berme ji tedy jako aktuální stav:                  // Pokud se stav tlačítka změnil:         if (reading != buttonState) {             buttonState = reading;                          // LED přepněte pouze když je nový stav tlačítka označen jako HIGH             if (buttonState == HIGH) {                 ledState = !ledState;             }         }     }          // nastavte LED:     digitalWrite(ledPin, ledState);          // načtené hodnoty uložte. V příští smyčce bude označeno jako lastButtonState:     lastButtonState = reading; } 
Oldřich Horáček

Oldřich Horáček

"Žádný člověk se nestane profíkem jen tak přes noc..."
Jsem zapálený hardwerář a tvůrce. Snažím se lidem přibližovat technologie, usnadňovat začátky a podporovat zajímavé projekty. Web Arduino.cz vznikl právě s tímto cílem. Moc mě baví věci udávat do pohybu a rozvíjet :-).
Oldřich Horáček

2 Comments on “Arduino základy – 9. funkce debounce

bebeno28
13.6.2017 at 22:22

Ahojte. Mám dotaz k debounce a tlačítku.
Snímate tlačítko cez interrupt používate tiež ošetrenie zákmitu aj v takomto prípade?

Dakujem

Zbyšek Voda
Zbyšek Voda
14.6.2017 at 9:04

Ošetření zákmitů tlačítka by mělo být i u interrupt.
U nich bych ale zvažoval použít HW ošetření zákmitů a ne softwarové, protože kód prováděný po interruptu by měl být co nejjednodušší.
Pokud ale váš program neprovádí nijak kritické operace a menší zdržení způsobené interruptem mu nevadí, můžete jít i softwarovou cestou.
Je to na vašem zvážení.

Napsat komentář