Freitag, 28. August 2015

Button entprellen

Das Signal eines normalen Buttons geht beim Drücken oder Loslassen des Buttons nicht sofort in den anderen Zustand über(LOW auf HIGH, oder HIGH auf LOW), sondern prellt. Prellen beschreibt das schnelle  Pendeln  zwischen den beiden Zuständen. Das ist ungünstig, da der Arduino das als mehrer Buttondrücker interpretiert. Über das sogenannte Entprellen kann man dieses Verhalten, mittels Hardware oder Software, abstellen.

Entprellen mittels Hardware

Der Vorteil von Entprellung mittels Hardware ist ganz klar, dass man den Button, im Programm, wie bisher gewohnt über digitalRead(button) auslesen kann. Um einen Button zu entprellen verwendet man einen Kondensator.
Der Kondensator sollte eine Kapazität von ca. 10 Mikrofarad haben. Wenn er zu groß ist, bleibt der Button auch, nachdem man ihn losgelassen hat, kurze Zeit auf LOW, und wenn er zu klein ist, ist der Entprelleffekt sehr gering. Der Nachteil vom Entprellen mittels eines Kondensators ist logischerweise, dass man für jeden Button zusätzlich einen Kondensator benötigt. Aus diesem Grund wird Hardware Entprellung eigentlich nur verwendet, wenn Software Entprellung nicht möglich ist.

Entprellen mittels Software

Beim Entprellen mittels Software wird im wesentlichen bei jeder Änderung des Status des Buttons nach einer gewissen Zeit wieder überprüft, ob er immer noch den selben Status hat. Wenn der Button also für länger, als eine definierte Zeit x, LOW oder HIGH war, so wird das als aktueller Status des Buttons übernommen und die gewünschten Befehle ausgeführt.

Wenn der Button also für länger als eine definierte Zeit x, LOW oder HIGH war, so wird das als aktueller Status des Buttons übernommen und die gewünschten Befehle ausgeführt.

Wie man sieht, erfordert das Entprellen von Buttons mittels Software einen wesentlich komplizierteren Code, als das digitalRead() bei der Hardware Entprellung.

Eine "light Variante" wäre es immer den Status des Buttons  überprüfen zu lassen und sobald er sich ändert über delay(60); zu warten und ihn danach nochmal zu prüfen. Der Nachteil hierbei wäre jedoch, dass man delay() benutzt, was das Programm an sich aufhält. Außerdem kann man delay nicht in Interrupts verwenden.

Keine Kommentare:

Kommentar veröffentlichen