use interrupts for the buttons

This commit is contained in:
Martin Ness 2015-09-01 17:41:24 +02:00
parent 9a135f2e1c
commit 31dec770d7

View file

@ -22,33 +22,18 @@
// Ein-/Ausgänge Bezeichnen // Ein-/Ausgänge Bezeichnen
const int BTN_ON = 2; // Einschalter const int BTN_ON = 2; // Einschalter
#define INTERRUPT_NAME_BTN_ON 0
const int BTN_OFF = 3; // Ausschalter const int BTN_OFF = 3; // Ausschalter
#define INTERRUPT_NAME_BTN_OFF 1
const int LED_G = 9; // grüne LED const int LED_G = 9; // grüne LED
const int LED_Y = 8; // gelbe LED const int LED_Y = 8; // gelbe LED
const int LED_R = 7; // rote LED const int LED_R = 7; // rote LED
// hier wird der aktuelle Zustand gespeichert // hier wird der aktuelle Zustand gespeichert
byte state = STATE_OFF; volatile byte state = STATE_OFF;
// hier wird der Beginn des aktuellen Zustand gespeichert in Millisekunden nach Uptime. // hier wird der Beginn des aktuellen Zustand gespeichert in Millisekunden nach Uptime.
unsigned long stateBegan; volatile unsigned long stateBegan;
// Debouncer
class Debounce
{
public:
Debounce(int pin);
boolean update();
int read();
private:
int _pin;
int _state;
int _time;
int _delay;
};
Debounce debounceBtnOn(BTN_ON);
Debounce debounceBtnOff(BTN_OFF);
// wird einmalig beim Start des Arduinos ausgeführt // wird einmalig beim Start des Arduinos ausgeführt
void setup() { void setup() {
@ -57,6 +42,8 @@ void setup() {
pinMode(LED_R, OUTPUT); pinMode(LED_R, OUTPUT);
Serial.begin(9600); Serial.begin(9600);
setStateOnLeds(); setStateOnLeds();
attachInterrupt(INTERRUPT_NAME_BTN_ON, buttonOnPressed, RISING);
attachInterrupt(INTERRUPT_NAME_BTN_OFF, buttonOffPressed, RISING);
} }
// bildet den aktuellen Zustand auf die LEDs ab // bildet den aktuellen Zustand auf die LEDs ab
@ -77,18 +64,7 @@ unsigned long calcStateTime() {
// wird nach dem Starten dauerhaft ausgeführt // wird nach dem Starten dauerhaft ausgeführt
void loop() { void loop() {
// Einschalter auslesen setStateOnLeds();
if (debounceBtnOn.update() && debounceBtnOn.read()) {
state = STATE_ON;
stateBegan = millis();
setStateOnLeds();
}
// Ausschalter auslesen
if (debounceBtnOff.update() && debounceBtnOff.read()) {
state = STATE_OFF;
setStateOnLeds();
}
// Auswertung des aktuellen Zustandes // Auswertung des aktuellen Zustandes
// ggf Zustand wechseln // ggf Zustand wechseln
if (state == STATE_ON) { if (state == STATE_ON) {
@ -110,28 +86,11 @@ void loop() {
delay(10); delay(10);
} }
// Debouncer Klasse void buttonOnPressed() {
Debounce::Debounce(int pin) state = STATE_OM;
{ stateBegan = millis();
pinMode(pin, INPUT);
this->_pin = pin;
this->_time = 0;
this->_state = LOW;
this->_delay = 50;
} }
boolean Debounce::update()
{ void buttonOffPressed() {
if (millis() - this->_time >= this->_delay) { state = STATE_OFF;
int reading = digitalRead(this->_pin);
if (reading != this->_state) {
this->_time = millis();
this->_state = reading;
return true;
}
}
return false;
}
int Debounce::read()
{
return this->_state;
} }