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

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

ivo_mu
28.2.2022 at 18:42

Dobrý den,
co to, prosím, znamená „HW ošetření zákmitů“? Jak to udělat hardwarově? Děkuji.

Oldřich Horáček
7.3.2022 at 8:45

Dobrý den. To znamená přidat do cesty signálu z tlačítka další elektronické součástky, které upraví signál tak, aby byl bez zákmitů. Nejčastěji se to řeší RC členem nejlépe v kombinaci se Schmittovým klopným obvodem. http://www.tajned.cz/2013/10/osetreni-zakmitu-na-vstupnim-pinu-mikrokontroleru/

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
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ář