Arduino knappen handledning (5 / 6 steg)
Steg 5: Lägga till knappar, och kommer OO
Som vi såg i föregående steg, blir det svårt att skala upp. Det finns globala tillståndsvariabler, som kallas av vissa funktioner. Tänk dig att lägga till en 2: a knapp: mardrömmen börjar; inte tala om en 3: e knapp...
Programmering: Kommer OO (objektorienterad)
Arduino använder bearbetning språk byggts på C++, så varför inte använda några OO funktioner?
Vi måste packa dessa globala variabler i strukturer som vi kan skapa på kommer. Sådana strukturer, med tillhörande hantering funktioner kallas klasser och metoder i världens OO. En klass är bara en beskrivning av objektet, medan den effektiva minne som har allokerats för varje objekt kallas instans.
Den första bilden av detta steg visar att vi har lagt till en 2: a knapp. Den andra bilden visar nu traditionella långa/korta pressarna, arbetar självständigt mycket fint. 2. knappen har förresten, en längre long-press tröskel.
Pro/nackdelar
Denna kod blir mer komplex, vilket är normalt eftersom, när du skalförändrar, komplexiteten ökar genom ett betydande steg. Den goda nyheten är att den sedan kan stödja ett antal ytterligare knappar på komplexiteten ökar.
Bearbetning anger vissa begränsningar (t.ex. det finns ingen skapas dynamiskt: nya och ta bort operatörerna är inte tillgängliga). Som inte är dålig, eftersom vi inte vill gå vilse i några av de särskilt blodiga sidorna av C++, som (förmodligen) inte behövs i små inbyggda system som Arduino.
Säker samma kunde vara gjort i ren C, så om du behov/föredrar en C genomförande, bara be mig.
Koden
––––––––––8<––––––––––
#define BUTTON1_PIN 2 / / knappen 1
#define BUTTON2_PIN 3 / / knappen 2
#define DEFAULT_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};
//////////////////////////////////////////////////////////////////////////////
Klassdefinitionen
klass ButtonHandler {
offentlig:
Konstruktören
ButtonHandler (int pin, int longpress_len = DEFAULT_LONGPRESS_LEN);
Initiering gjort efter konstruktion, att tillåta statiska instanser
void init();
Handler, kallas i loop()
int handle();
skyddad:
booleska was_pressed; tidigare tillstånd
int pressed_counter; Tryck på rinnande varaktighet
CONST int pin; PIN-kod som knapp är ansluten
CONST int longpress_len; longpress varaktighet
};
ButtonHandler::ButtonHandler (int p, int lp)
: pin(p), longpress_len(lp)
{
}
void ButtonHandler::init()
{
pinMode (pin, mata);
digitalWrite (pin, hög); pull-up
was_pressed = false;
pressed_counter = 0;
}
int ButtonHandler::handle()
{
int händelse;
int now_pressed =! digitalRead(pin);
om (! now_pressed & & was_pressed) {
handtag release event
om (pressed_counter < longpress_len)
Event = EV_SHORTPRESS;
annat
Event = EV_LONGPRESS;
}
annat
Event = EV_NONE;
uppdatera press kör längd
om (now_pressed)
++ pressed_counter;
annat
pressed_counter = 0;
kom ihåg stat, och vi är klar
was_pressed = now_pressed;
returnera händelse;
}
//////////////////////////////////////////////////////////////////////////////
Instansiera knappen objekt
ButtonHandler button1(BUTTON1_PIN);
ButtonHandler button2 (BUTTON2_PIN, DEFAULT_LONGPRESS_LEN * 2);
void setup()
{
Serial.BEGIN(9600);
init knappar stift; Jag antar att det är bäst att göra här
button1.init();
button2.init();
}
void print_event (const char * button_name, int händelse)
{
om (händelse)
Serial.Print(button_name);
Serial.Print(".SL"[Event]);
}
void loop()
{
hantera knappen
int event1 = button1.handle();
int event2 = button2.handle();
göra andra saker
print_event ("1", event1);
print_event ("2", event2).
Lägg till ny rad ibland
statisk int counter = 0;
om ((++ counter & 0x1f) == 0)
Serial.println();
Delay(delay);
}
––––––––––>8––––––––––