Contact Bounce
Dit staat bekend als contact bounce en treedt op wanneer de metalen contacten in de knop of schakelaar tegen elkaar stuiteren wanneer je erop drukt. De microcontroller is snel genoeg om deze bounces op te vangen en wat het betreft, schakel je de schakelaar vele malen in maar liefst 10 milliseconden tijd.
Verschillende schakelaars en knoppen hebben een andere hoeveelheid contact bounce, en zelfs een schakelaar gedraagt zich anders tussen twee keer drukken.
Hier is een knopdruk vastgelegd op een scoop (afbeelding van Maxim):
Bij 2ms / div zien we pas 6ms na het eerste contact een stabiel signaal!
Oplossingen
Voeg een vertraging toe
De absoluut eenvoudigste oplossing is om een korte vertraging in te voeren nadat u de knopinvoer heeft gelezen. Dit zal voorkomen dat de code bounces oppikt en wanneer het hervat, zou het signaal stabiel moeten zijn.
if (digitalRead (A3) == 0) {// doe iets hier delay (500 );}
In het bovenstaande voorbeeld vertraag ik 500 ms na het lezen van de status van de pin. De knop is normaal gesproken hoog, dus als ik erop druk, gaat de status van de pin naar logica 0. Ik pak dat op in de code en doe iets en wacht dan minstens 500 ms voordat ik verder ga.
Het is duidelijk dat deze code stopt elke keer dat u op een knop drukt een halve seconde, wat al dan niet acceptabel is in uw toepassing. Je kunt de vertraging ook verkleinen, afhankelijk van de bounce-tijd van het contact van je switch, maar ik speel hier op safe.
Negeerknoppen worden te dicht bij elkaar ingedrukt
Vergelijkbaar met de bovenstaande oplossing, maar in plaats van een harde vertraging toe te voegen, gebruikt u de functie millis ()
om bij te houden wanneer de laatste keer dat de schakelaar werd geactiveerd. Elke keer dat je een schakelaar-trigger ziet, vergelijk je met de tijd en, als er niet genoeg tijd is verstreken (bijvoorbeeld 500 ms in mijn vorige voorbeeld), negeer je deze.
Dit lost het probleem op dat je moet gebruiken delay ()
in uw code.
Switch debouncer IC
Er zijn dingen zoals de MAX6816, een IC die je tussen je switch en microcontroller input plaatst. Het zal het signaal voor u aan de kaak stellen. Voor een prijs van $ 1,62 @ 1k zul je dit waarschijnlijk nooit gebruiken.
Overig
Er zijn veel oplossingen voor dit probleem ... ik doe het altijd in software, maar sommige anderen omvatten het gebruik van een vergrendeling of condensator.
Debouncecode - één bericht om ze allemaal te regelen