Stap 3: Opsporen van randen
Wanneer we vangen randen of overgangen willen, moeten we iets verbeteren het programma van de vorige stap.
We voeren een algemene variabele (button_was_pressed) die dat de laatste lezen staat, onthoudt zodat wij een verandering van staat kan detecteren.
In dit voorbeeld, wij sporen de overgang van niet ingedrukt om de geperst, en zal hen signaal door een gebeurtenis, zoals op de eerste afbeelding van deze stap.
Programmering
Bij elke iteratie, als we een evenement, sturen we een caret-teken naar de seriële lijn, anders een punt. Zie de tweede afbeelding van deze stap. Nogmaals, voor een lange druk op en twee korte persen. Merk op dat de lange druk op slechts één gebeurtenis heeft gegenereerd.
In de onderstaande code, moet u ook rekening mee dat ik variabelenamen (button_now_pressed) die een hoog niveau van abstractie (de knop staat), en niet de elektrische toestand (startknop gekozen heb, uitvoeren of niet, noch een elektrische waarde lezen op de pin) vertegenwoordigen.
Pro/Cons
Nog eenvoudige implementatie. De invoering van globale variabelen begint te dreigen met de schaalbaarheid van het programma. Nog heel oke maar voor één knop.
Code
––––––––––8<––––––––––
#define BUTTON_PIN 2 // Button #define DELAY 20 // Delay per loop in ms boolean button_was_pressed; // previous state void setup() { pinMode(BUTTON_PIN, INPUT); digitalWrite(BUTTON_PIN, HIGH); // pull-up Serial.begin(9600); button_was_pressed = false; } boolean handle_button() { boolean event; int button_now_pressed = !digitalRead(BUTTON_PIN); // pin low -> pressed event = button_now_pressed && !button_was_pressed; button_was_pressed = button_now_pressed; return event; } void loop() { // handle button boolean raising_edge = handle_button(); // do other things Serial.print(raising_edge ? "^" : "."); // add newline sometimes static int counter = 0; if ((++counter & 0x3f) == 0) Serial.println(); delay(DELAY); }
––––––––––>8––––––––––