Compare commits
4 commits
master
...
use-interr
Author | SHA1 | Date | |
---|---|---|---|
|
22f8aca3ca | ||
|
096155c6cd | ||
|
59ea61af0f | ||
|
31dec770d7 |
1 changed files with 29 additions and 53 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Reference in a new issue