Compare commits

...
This repository has been archived on 2024-01-26. You can view files and clone it, but cannot push or open issues or pull requests.

4 commits

Author SHA1 Message Date
Martin Ness
22f8aca3ca Debounce for button interrupts 2015-10-26 21:40:51 +01:00
Martin Ness
096155c6cd cleanup 2015-09-24 13:49:55 +02:00
Martin Ness
59ea61af0f typo FIX 2015-09-24 13:49:22 +02:00
Martin Ness
31dec770d7 use interrupts for the buttons 2015-09-01 17:41:24 +02:00

View file

@ -22,33 +22,22 @@
// Ein-/Ausgänge Bezeichnen
const int BTN_ON = 2; // Einschalter
#define INTERRUPT_NAME_BTN_ON 0
const int BTN_OFF = 3; // Ausschalter
#define INTERRUPT_NAME_BTN_OFF 1
const int LED_G = 9; // grüne LED
const int LED_Y = 8; // gelbe LED
const int LED_R = 7; // rote LED
// 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.
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);
const long debouncing_time = 50; //Debouncing Time in Milliseconds
volatile unsigned long last_buttonOnPressed;
volatile unsigned long last_buttonOffPressed;
// wird einmalig beim Start des Arduinos ausgeführt
void setup() {
@ -56,7 +45,8 @@ void setup() {
pinMode(LED_Y, OUTPUT);
pinMode(LED_R, OUTPUT);
Serial.begin(9600);
setStateOnLeds();
attachInterrupt(INTERRUPT_NAME_BTN_ON, buttonOnPressedDebounce, RISING);
attachInterrupt(INTERRUPT_NAME_BTN_OFF, buttonOffPressedDebounce, RISING);
}
// bildet den aktuellen Zustand auf die LEDs ab
@ -77,18 +67,7 @@ unsigned long calcStateTime() {
// wird nach dem Starten dauerhaft ausgeführt
void loop() {
// Einschalter auslesen
if (debounceBtnOn.update() && debounceBtnOn.read()) {
state = STATE_ON;
stateBegan = millis();
setStateOnLeds();
}
// Ausschalter auslesen
if (debounceBtnOff.update() && debounceBtnOff.read()) {
state = STATE_OFF;
setStateOnLeds();
}
setStateOnLeds();
// Auswertung des aktuellen Zustandes
// ggf Zustand wechseln
if (state == STATE_ON) {
@ -110,28 +89,25 @@ void loop() {
delay(10);
}
// Debouncer Klasse
Debounce::Debounce(int pin)
{
pinMode(pin, INPUT);
this->_pin = pin;
this->_time = 0;
this->_state = LOW;
this->_delay = 50;
}
boolean Debounce::update()
{
if (millis() - this->_time >= this->_delay) {
int reading = digitalRead(this->_pin);
if (reading != this->_state) {
this->_time = millis();
this->_state = reading;
return true;
}
void buttonOnPressedDebounce() {
if (millis() - last_buttonOnPressed >= debouncing_time) {
buttonOnPressed();
last_buttonOnPressed = millis();
}
return false;
}
int Debounce::read()
{
return this->_state;
void buttonOnPressed() {
state = STATE_ON;
stateBegan = millis();
}
void buttonOffPressedDebounce() {
if (millis() - last_buttonOffPressed >= debouncing_time) {
buttonOffPressed();
last_buttonOffPressed = millis();
}
}
void buttonOffPressed() {
state = STATE_OFF;
}