Arduino knappen handledning (4 / 6 steg)
Steg 4: Skilja kort från lång pressar
Många enheter med få styr (t.ex. digitala klockor) pack flera funktioner per knapp.
Det är mycket användbart, spara dyrbara volym, men måste användas klokt, annars enheten kan bli intuitiv att använda.
Skilja kort från lång pressar handlar om att mäta puls längd.
Händelsen är inte längre som släpps ut på att trycka på knappen, utan på att släppa den. Detta kan påverka känslan av lyhördhet. Men tills icke-kausala enheter kan köpas, vi kan inte förutsäga varaktighet och måste därför fortsätta så.
Detta är en kombinerad händelse och statens hantering: vi upptäcka statusändring (en händelse) och längden som den resulterande staten är långvarig.
Programmering
Så måste vi införa en annan global variabel (button_pressed_counter). Observera också att händelsen har inte längre ett booleskt värde (händelse presentera eller inte, som i föregående steg), men tre stater. De definieras av en uppräkning. (Jag hade bekymmer definiera en uppräkningstyp; Arduino-specifikt problem? Så använde jag enum för att definiera konstanter).
Den första bilden av detta steg visar en lång tryckning och en kort tryck timing, med ett långt knapptryck tröskelvärde på 3 provtagningsperioder (som är alldeles för kort, men anpassade till ritningen).
Den andra bilden visar den seriella produktionen för ett långt tryck följt av två korta pressar.
Pro/nackdelar
Fint förbättrar funktionen knappen (om används klokt, att försäkra god användbarhet). Men koden börjar att växa, och få förorenad av globala variabler... Nästa steg visar den OO varianten, gjord för skalning.
Koden
––––––––––8<––––––––––
#define BUTTON_PIN 2 / / knappen
#define LONGPRESS_LEN 25 / / Min antal öglor för ett långt knapptryck
#define dröjsmål 20 / / fördröjning per slinga i ms
fasttexttypen {EV_NONE = 0, EV_SHORTPRESS, EV_LONGPRESS};
booleska button_was_pressed; tidigare tillstånd
int button_pressed_counter; Tryck på rinnande varaktighet
void setup()
{
pinMode (BUTTON_PIN, indata);
digitalWrite (BUTTON_PIN, hög); pull-up
Serial.BEGIN(9600);
button_was_pressed = false;
button_pressed_counter = 0;
}
int handle_button()
{
int händelse;
int button_now_pressed =! digitalRead(BUTTON_PIN); PIN låg -> tryckte
om (! button_now_pressed & & button_was_pressed) {
om (button_pressed_counter < LONGPRESS_LEN)
Event = EV_SHORTPRESS;
annat
Event = EV_LONGPRESS;
}
annat
Event = EV_NONE;
om (button_now_pressed)
++ button_pressed_counter;
annat
button_pressed_counter = 0;
button_was_pressed = button_now_pressed;
returnera händelse;
}
void loop()
{
hantera knappen
booleska event = handle_button();
göra andra saker
Växla (händelse) {
fall EV_NONE:
Serial.Print(".");
bryta;
fall EV_SHORTPRESS:
Serial.Print("S");
bryta;
fall EV_LONGPRESS:
Serial.Print("L");
bryta;
}
Lägg till ny rad ibland
statisk int counter = 0;
om ((++ counter & 0x3f) == 0)
Serial.println();
Delay(delay);
}
––––––––––>8––––––––––