Příspěvek
od gilhad » 29 čer 2019, 21:31
Je to docela jednoduché - problém je, že tlačítko při stisknutí (či puštění) jednoduše nesepne (či rozepne) stylem furt nula a pak furt jednička, ale často po stisknutí sepne, odskočí, sepne, odskočí a takhle chvilku cviší, dokud neskončí v setrvalém stavu.
Jako když pustíš míč na zem, tak taky chvilku poskakuje, než zůstane nakonec klidně ležet. Jen to trvá trochu kratší dobu (nějaké pidizlomky sekundy, podle konstrukce, razance stisknutí, letu ptáků a všech ostatních náhodných ptákovin).
Problém je v tom, že arduino je docela rychlé (16 000 000 instrukcí za sekundu) a tak ty odskoky tlačítka snadno "zahlédne" a bere to, že někdo hodně rychle kliká a pouští, protože má na tom pinu střídavě nuly a jedničky. Což je sice hezké, ale pomalý člověk chce, aby když na to tlačítko hamptne jednou, tak to Arduino vyhodnotilo jako jednu akci. Takže je potřeba to nějak zařídit, aby ty drobné rychlé odskoky Arduino ignorovalo.
Buď harwarově (dá se tam kondík s odporem a tomu chvilku (pidizlomek sekundy) trvá, než se nabije dost, aby mu to Arduino uznalo jako jedničku a pak mu zase chvilku trvá, než se vybije, aby mu to Arduino uznalo jako nulu a kdyže se ta chvilka nastaví správně, tak se mezitím to tlačítko stihne uklidnit a Arduino čte jen jeden přechod mezi nulou a jedničkou a všichni jsou šťastní.
Má to ale nevýhodu v tom, že je to potřeba složitě vyladit, aby ten kondík zdržoval dost na to, aby se tlačítko uklidnilo ale zase ne moc, aby to z pohledu člověka bylo pomalé. A měnit několikrát kondíky a odpory je práce, kterou si lidi celkem rádi odpustí, když to jde udělat i bez zbytečných součástek navíc.
Takže se prostě Arduinu "nějak" naprogramuje, že když se to tlačítko zmáčkne, tak se jeho poskakování chvilku ignoruje, dokud se neuklidní - to je zase softwarová metoda. (To "nějak" jde udělat spoustou nejrůznějších způsobů, každý má nějaké výhody a/nebo nevýhody, takže si to každý dělá jak potřebuje, nebo umí, nebo odněkud opíše)
To je ten debouncing.
Nějakých diod se to vlastně vůbec netýká, diody jsou fajn, neposkakujou.
Týká se to jen toho, že když se debouncing neudělá, nebo neudělá dost dobře, tak na jedno stisknutí tlačítka může Arduino registrovat (a tudíž i obsloužit) těch stisknutí víc (jak to poskakuje), což pak vede k nejrůznějším problémům, podobně jako když usneš s rukou na klávesnici a pak tam máš dlouhou řádku písmenka.
Takže pokud třeba Arduinem ovládáš diodu, na jedno stisknutí ji rozsvítíš a na druhé zhasneš, tak pokud jsi neudělal ošetření tlačítka, tak na jedno stisknutí prstem Arduino "uvidí" těch stisknutí několik, strašně rychle za sebou a tak několikrát tu diodu rozsvítí a zhesne (jedna změna na stisknutí). Nebo když má na stisknutí tlačítka pootočit motorkem a "uvidí" těch stisknutí deset, tak s ním logicky taky desetrát pootočí. Nebo když má na jedno stisknutí poslat jedno písmenko na Serial (a tedy na tvojí obrazovku), tak na deset rychlých stisknutí (jek to tlačítko poskakuje) jich prostě pošle deset, a ty, jako uživatel se jen divíš, kde se jich tolik vzalo.
----
Takže to, co potřebuješ je ošetřit debouncingem to odskakování u každého použití každého tlačítka, co k Arduinu připojíš. Aby na jedno stisknutí/puštění tlačítka Arduino vidělo jen jednu změnu. Pak ti věci, které závisí na počtu stisknutí tlačítka budou fungovat správně.