Arduino knappen handledning (3 / 6 steg)
Steg 3: Upptäcka kanter
När vi vill fånga kanter eller övergångar, behöver vi något förbättra programmet för föregående steg.
Vi introducerar en global variabel (button_was_pressed) som kommer ihåg sist Läs staten, så att vi kan upptäcka en statusändring.
I det här exemplet vi upptäcka övergångarna från inte tryckt intryckt, och kommer att signalera dem av en händelse, som visas på den första bilden av detta steg.
Programmering
Vid varje iteration, om vi har en händelse, skickar vi ett cirkumflex till seriell linje, annars en prick. Se den andra bilden av detta steg. Igen, tryck på för en lång och två korta pressar. Observera att långa pressen har genererat endast en händelse.
I koden nedan, Observera också att jag har valt variabelnamn (button_now_pressed) som representerar en hög nivå av abstraktion (knappen staten), och inte elektriska staten (knapp, genomföra eller inte, inte heller elektriska värdet läsa på stiftet).
Pro/nackdelar
Fortfarande enkelt genomförande. Införandet av globala variabler börjar riskeras skalbarhet i programmet. För en knapp, fortfarande ganska okej ändå.
Koden
––––––––––8<––––––––––
#define BUTTON_PIN 2 / / knappen
#define dröjsmål 20 / / fördröjning per slinga i ms
booleska button_was_pressed; tidigare tillstånd
void setup()
{
pinMode (BUTTON_PIN, indata);
digitalWrite (BUTTON_PIN, hög); pull-up
Serial.BEGIN(9600);
button_was_pressed = false;
}
Boolean handle_button()
{
booleska händelse;
int button_now_pressed =! digitalRead(BUTTON_PIN); PIN låg -> tryckte
Event = button_now_pressed & &! button_was_pressed;
button_was_pressed = button_now_pressed;
returnera händelse;
}
void loop()
{
hantera knappen
booleska raising_edge = handle_button();
göra andra saker
Serial.Print (raising_edge? "^" : ".");
Lägg till ny rad ibland
statisk int counter = 0;
om ((++ counter & 0x3f) == 0)
Serial.println();
Delay(delay);
}
––––––––––>8––––––––––