Kleine Knopfklasse
Eine kleine, nicht blockierend programmierte Klasse, die
doppelt belegte Tasten ermöglicht.
Hin und wieder steht man vor dem Problem, nur wenig Platz für Schalter
und Tasten zu haben.
In meinem Fall sollte eine automatisch ablaufende Folge von
Vorgängen entweder schnell durchgeschaltet oder angehalten
werden können – eigentlich ein Fall für zwei
Taster. Allerdings war nur Platz für einen Taster vorhanden.
Die Lösung des Problem bestand darin, lange und kurze Betätigungen
zu unterscheiden: Ein kurzer Tastendruck schaltet weiter, ein langer
Tastendruck schaltet die Pause-Funktion ein bzw. aus.
Da neben dem automatischen Ablauf immer wieder geprüft werden muss, ob
die Taste gedrückt ist, muss „nicht blockierend“ programmiert
werden.
„Nicht blockierend“ heißt, dass nicht
gewartet wird, bis die Taste gedrückt ist, sondern dass nur
geprüft wird, ob sie gedrückt ist. Wenn sie nicht
gedrückt ist, wird fortgefahren.
Die Dateien:
// button.h
#ifndef BUTTON_H
#define BUTTON_H
#include <Arduino.h>
enum clicktype { NONE, SHORT, LONG };
class Button
{
private:
byte pin; // Pin, an den die Taste angeschlossen ist
boolean state;
boolean lastState;
int timeout; // Zeit bis zum "lang gedrueckt"-Zustand
long millisMem;
public:
Button(byte);
clicktype check(); // Gibt zurueck, ob/wie gedrueckt wurde
inline void init() { pinMode(pin, INPUT_PULLUP); };
};
// button.cpp
#include "button.h"
Button::Button(byte pin_)
{
millisMem=millis();
pin=pin_;
state=LOW;
lastState=LOW;
timeout=500; // Zeit in ms, die zwischen langem und kurzem
// Tastendruck unterscheidet (hier eine halbe Sekunde)
}
clicktype Button::check() // Regelmaessig aufgerufene Funktion zur
// Abfrage des Tasters
{
if ((digitalRead(pin)==LOW) && (lastState==LOW)) // gedrueckt
{
millisMem=millis();
lastState=HIGH;
}
if ((digitalRead(pin)==HIGH) && (lastState==HIGH)) // losgelassen
{
lastState=LOW;
if(millis()-millisMem < timeout)
{ return(SHORT); } else { return(LONG); }
}
return(NONE);
}
Im eigentlichen Programm sieht das so aus:
#include "button.h" // Einbinden der Headerdatei
Button button(2); // Taste haengt an Pin D2
...
void setup()
{
...
button.init();
...
}
void loop()
{
...
switch(button.check())
{
case SHORT: // Hier Aktion fuer "kurz gedrueckt"
break;
case LONG: // Hier Aktion fuer "lang gedrueckt"
break;
case NONE:
default: break;
}
...
}
Weiter zu: Tipps + Tricks

|