Stap 2: Bemonstering, Deglitching, en valt bestuurlijk gezien onder lezing
Knoppen zijn als veel dingen: onvolmaakt. Zelfs wanneer ze een stevige mechanische sensatie geven, ze genereren een aantal trillingen wanneer de knop plaatst wijzigingen.
Deze oscillaties heten glitches of stuitert. Ze kunnen worden geëlimineerd door het toevoegen van een condensator (invoering van de enige vertraging), of software.
Filteren door middel van steekproeven
Uw toepassing van de Arduino is vaak ()-lus-gebaseerd, dat wil zeggen iets doet, dan slaapt een tijdje, herhaaldelijk. De knop staat bemonstering code kan uitzien:
void loop() { // handle button boolean button_pressed = read_button(); // do other things do_stuff(button_pressed); // sleep a moment before next iteration delay(DELAY); }
Dit betekent dat ten minste vertraging van milliseconden verstrijken tussen opeenvolgende knop proeverijen. Afhankelijk van de vertraging maakt dit ons ongevoelig voor glitches. Het reactievermogen is niet helemaal nauwkeurig, maar grotendeels voldoende: er zullen sommige jitter in de omvang van de vertraging. Het moet worden verzekerd dat de dingen die we tijdens elke lus doen een "kleine" en vergelijkbare voor elke iteratie duren.
De eerste foto van deze stap toont de glitches en de periodieke bemonstering (aangegeven in blauw).
Het lezen van de staat
De code hieronder toont hoe de periodieke bemonstering wordt gedaan. Wanneer de knop wordt gezien als niet ingedrukt, een stip wordt verzonden naar de seriële lijn; Wanneer de knop gedrukt gezien wordt, wordt een caret-teken verzonden.
De tweede foto van deze stap toont de uitgang voor seriële, voor een lange druk op gevolgd door twee korte persen.
Programmering
In de onderstaande code, merk dat ik heb gekozen naam voor een variabele (button_pressed) die een hoog niveau van abstractie (de knop staat), en niet de elektrische toestand (startknop, uitvoeren of niet, noch een elektrische waarde lezen op de pin), die zou verwarrend zijn vanwege het feit dat, als gevolg van de pull-up weerstand, de pin HIGH leest wanneer de knop wordt losgelaten.
Pro/Cons
Zeer eenvoudige implementatie. Geschikt voor continue controle (bijvoorbeeld pauze pedaal).
Ongeschikt voor incrementele besturingselement (bijvoorbeeld incrementele geluidsvolume)--die zal worden toegelicht in de volgende stap.
Code
––––––––––8<––––––––––
#define BUTTON_PIN 2 // Button #define DELAY 20 // Delay per loop in ms void setup() { pinMode(BUTTON_PIN, INPUT); digitalWrite(BUTTON_PIN, HIGH); // pull-up Serial.begin(9600); } boolean handle_button() { int button_pressed = !digitalRead(BUTTON_PIN); // pin low -> pressed return button_pressed; } void loop() { // handle button boolean button_pressed = handle_button(); // do other things Serial.print(button_pressed ? "^" : "."); // add newline sometimes static int counter = 0; if ((++counter & 0x3f) == 0) Serial.println(); delay(DELAY); }
––––––––––>8––––––––––