/*
Forum: https://forum.arduino.cc/t/verbesserungsvorschlage-code/1409208/50
Wokwi: https://wokwi.com/projects/445367771608793089
Diverse Möglichkeiten zur Auswertung von Buttons mit Debouncing
pressed()
released()
changed()
Zudem Auswertung mittels selbstsprechender Namen oder mittels Range Based For Loop
2025/10/20
ec2021
*/
constexpr byte btnPressed {LOW};
constexpr byte EinPin {2};
constexpr byte ResetPin {3};
constexpr byte OkPin {4};
constexpr byte WeiterPin {5};
constexpr unsigned long debounceTime {30};
enum btStates {UNCHANGED, RELEASED, PRESSED};
class buttonClass {
private:
const uint8_t pin;
const char* name;
unsigned long pressTime = 0;
byte lastState = !btnPressed;
byte state = !btnPressed;
public:
buttonClass(byte aPin, const char aName[]) : pin(aPin), name(aName) {};
void init() {
pinMode(pin, INPUT_PULLUP);
};
char* buttonName() {
return name;
};
boolean pressed();
boolean released();
btStates changed();
};
boolean buttonClass::pressed() {
byte actState = digitalRead(pin);
if (lastState != actState) {
lastState = actState;
pressTime = millis();
}
if (state != lastState && millis() - pressTime > debounceTime) {
state = lastState;
return !state;
}
return false;
}
boolean buttonClass::released() {
byte actState = digitalRead(pin);
if (lastState != actState) {
lastState = actState;
pressTime = millis();
}
if (state != lastState && millis() - pressTime > debounceTime) {
state = lastState;
return state;
}
return false;
}
btStates buttonClass::changed() {
byte actState = digitalRead(pin);
if (lastState != actState) {
lastState = actState;
pressTime = millis();
}
if (state != lastState && millis() - pressTime > debounceTime) {
state = lastState;
return state ? RELEASED : PRESSED;
}
return UNCHANGED;
}
buttonClass ein {EinPin, "Ein"};
buttonClass res {ResetPin, "Reset"};
buttonClass ok {OkPin, "Ok"};
buttonClass next {WeiterPin, "Weiter"};
buttonClass btns[] {ein, res, ok, next};
void initAllBtns() {
for (auto &b : btns) {
b.init();
}
}
void checkBtnPressByRangeBasedFor() {
for (auto &b : btns) {
if (b.pressed()) {
Serial.print(b.buttonName());
Serial.println(" pressed");
};
}
}
void checkBtnReleaseByRangeBasedFor() {
for (auto &b : btns) {
if (b.released()) {
Serial.print(b.buttonName());
Serial.println(" released");
};
}
}
void checkBtnChangedByRangeBasedFor() {
for (auto &b : btns) {
btStates btState = b.changed();
if (btState != UNCHANGED) {
Serial.print(b.buttonName());
Serial.println(btState == RELEASED ? " released" : " pressed");
};
}
}
void checkBtnPressByName() {
if (ein.pressed()) {
Serial.println("Ein betätigt!");
}
if (res.pressed()) {
Serial.println("Reset betätigt!");
}
if (ok.pressed()) {
Serial.println("Ok betätigt!");
}
if (next.pressed()) {
Serial.println("Weiter betätigt!");
}
}
void setup() {
Serial.begin(115200);
initAllBtns();
}
byte mode = 2;
void loop() {
switch (mode) {
case 0:
checkBtnPressByRangeBasedFor();
break;
case 1:
checkBtnReleaseByRangeBasedFor();
break;
case 2:
checkBtnChangedByRangeBasedFor();
break;
case 3:
checkBtnPressByName();
break;
}
}