Whandall:
Diese Version empfinde ich als vergleichsweise unleserlich,
auch weil sie den ganzen Entprell- Status- Tasten-Kode enthält.
Es geht auch etwas komprimierter:
const unsigned long debounceDelay = 50;
unsigned long jetzt; // Variable für den aktuellen Zeitpunkt
const uint8_t relaisPins[] = { 2, 3, 4, 5, 6, 7, 8 };
struct Taster // Struktur mit Konstanten, Variablen und Methoden
{ Taster(const byte pin, const byte relaisZustaende): pin(pin), relaisZustaende(relaisZustaende), aktZustand(0), altZustand(0), vorhin(0) {}
void init()
{ pinMode(pin, INPUT_PULLUP);
aktZustand = !digitalRead(pin);
altZustand = aktZustand;
vorhin = jetzt;
}
void run()
{ altZustand = aktZustand;
if (jetzt - vorhin >= debounceDelay) // Entprellen
{ aktZustand = !digitalRead(pin); // Tasterzustände aktualisieren
if (altZustand != aktZustand) vorhin = jetzt;
}
if (!altZustand && aktZustand) // steigende Flanke
{ byte j = 0;
for (auto &r : relaisPins) digitalWrite(r, relaisZustaende & (1 << j++));
}
}
const byte pin, relaisZustaende;
bool aktZustand, altZustand;
unsigned long vorhin;
};
Taster taster[]
{ // Taster-Pin, relaisZustaende
{ 9, 0b0001111},
{10, 0b0000001},
{11, 0b0000011},
{12, 0b0000000}
};
void setup()
{ for (auto &r : relaisPins) pinMode(r, OUTPUT);
for (auto &t : taster) t.init();
}
void loop()
{ jetzt = millis();
for (auto &t : taster) t.run();
}
Whandall:
Du musst mir das Versehen nicht erklären, ich wollte nur auf das andere Verhalten hinweisen.
Man kann das Ausrufezeichen leicht übersehen, daher erschien mir ein Hinweis angebracht.
Meine Variante sollte nicht die Aussage beinhalten, sie sei ganz toll. So richtig kann ich mich noch nicht für OOP auf Arduinos erwärmen. Aber Varianten, die man nicht kennt, kann man auch nicht vergleichen. Und da der OOP-Anteil in diesem Forum nicht so groß ist, muß ich mir die Vergleichsvariante halt selbst machen. Schaden tut's mir nicht ![]()