Arduino základy – 9. funkce debounce
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().
Obsah článku:
Potřebný hardware
– Arduino
– přechodné tlačítko či spínač
– rezistor s odporem 10 kΩ
– zkušební deska
– propojovací vodič
Obvod
Schéma
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; }
- TOP 11 Free nástrojů, aby se naše děti naučily programovat - 6.12.2024
- Jak vyrobit plošný spoj pomocí laseru TOOCA L1? - 30.11.2024
- Microbit ve výuce a doma aneb jak a s čím začít - 27.11.2024
4 Comments on “Arduino základy – 9. funkce debounce”
Napsat komentář
Pro přidávání komentářů se musíte nejdříve přihlásit.
ivo_mu
28.2.2022 at 18:42Dobrý 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:45Dobrý 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:22Ahojte. 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:04Oš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í.