Arduino knappen handledning (2 / 6 steg)
Steg 2: Provtagning, Deglitching och läsning stater
Knapparna är liksom många saker: ofullkomlig. Även när de ger en fast mekanisk känsla, genererar de ett par svängningar när knappen placerar ändringar.
Dessa svängningar kallas buggar eller studsar. De kan elimineras genom att lägga till en kondensator (att införa viss fördröjning), eller program.
Filtrering av provtagning
Tillämpningsprogrammet Arduino är ofta slinga ()-baserade, dvs gör något, då sover en stund, upprepade gånger. Knappkoden staten provtagning kan se ut:
void loop()
{
hantera knappen
booleska button_pressed = read_button();
göra andra saker
do_stuff(button_pressed);
sova en stund innan nästa iteration
Delay(delay);
}
Detta innebär att åtminstone FÖRHALA millisekunder elapse mellan successiva knappen provtagningar. Beroende på FÖRSENINGEN gör detta oss okänslig för glapp. Lyhördhet är inte helt korrekt, men i stort sett tillräckligt: det kommer att finnas några jitter i omfattningen av dröjsmål. Det måste vara försäkrade att de saker vi gör under varje slinga tar tid på "små" och jämförbara för varje iteration.
Den första bilden av detta steg visar glapp och periodisk provtagning (anges i blått).
Läsa staten
Koden nedan visar hur de periodisk provtagningen görs. När knappen ses som inte tryckt, en prick skickas till den seriella linjen. När knappen ses som tryckte, skickas ett cirkumflex.
Den andra bilden av detta steg visar den seriella produktionen, för ett långt tryck följt av två korta pressar.
Programmering
I koden nedan, Observera att jag har valt ett variabelnamn (button_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), vilket skulle vara förvirrande eftersom det, på grund av pull-up resistor, pin läser högt när knappen släpps.
Pro/nackdelar
Mycket enkel implementering. Passar för kontinuerlig kontroll (t.ex. paus pedalen).
Olämpliga för inkrementell kontroll (e.g. inkrementell ljudvolymen kontroll)--som förklaras i nästa steg.
Koden
––––––––––8<––––––––––
#define BUTTON_PIN 2 / / knappen
#define dröjsmål 20 / / fördröjning per slinga i ms
void setup()
{
pinMode (BUTTON_PIN, indata);
digitalWrite (BUTTON_PIN, hög); pull-up
Serial.BEGIN(9600);
}
Boolean handle_button()
{
int button_pressed =! digitalRead(BUTTON_PIN); PIN låg -> tryckte
återvända button_pressed;
}
void loop()
{
hantera knappen
booleska button_pressed = handle_button();
göra andra saker
Serial.Print (button_pressed? "^" : ".");
Lägg till ny rad ibland
statisk int counter = 0;
om ((++ counter & 0x3f) == 0)
Serial.println();
Delay(delay);
}
––––––––––>8––––––––––