/*
Forum: https://forum.arduino.cc/t/verbesserungsvorschlage-code/1409208/38
Wokwi: https://wokwi.com/projects/445336903922407425
Mangelhafte Umsetzung des Debouncings durch eine KI
Im Test hier auf Wokwi zeigt sich das in höchstem Maß unzuverlässige Verhalten der
"beispielhaften Entprellmethode".
siehe Kommentare im Code
*/
/*********************** KI-generierter Code ***********************************/
// Beispiel für Software-Entprellung
const unsigned long debounceDelay = 50; // Millisekunden
byte letzterKnopfStatus = HIGH;
unsigned long letzterKnopfDruck = 0;
byte leseKnopf(byte pin) {
byte knopfStatus = digitalRead(pin);
// Wenn an dieser Stelle (letzterKnopfStatus != knopfStatus) ist,
// wird letzterKnopfDruck regelmäßig auf die aktuelle Zeit gesetzt
// Damit wird das debounceDelay in der folgenden millis()-Bedingung niemals überschritten
// und somit der Status der Variablen letzterKnopfStatus niemals verändert.
// Der einzige Weg in die millis()-Bedingung erfordert über die Dauer von debounceDelay identische
// Werte für beide Variablen. Den gültigen Stand nur zu ändern, wenn der Tastenstatus gleich ist, ist
// unsinnig, funktioniert hier aber gelegentlich, aufgrund einer zweiten Fehlauslegung:
// Haben nämlich beide Variablen wieder identischen Wert, so wird nach Ablauf von 50 ms die millis()-Bedingung
// erfüllt, in der dann "zufallsbedingt" bzw. durch Prellen(!) der Wechsel des Pins und damit
// auch die Anpassung von letzterKnopfStatus stattfinden kann.
if (knopfStatus != letzterKnopfStatus) {
// Starte den Timer neu
letzterKnopfDruck = millis();
}
if ((millis() - letzterKnopfDruck) > debounceDelay) {
// Wenn genug Zeit vergangen ist, gib den aktuellen Status zurück
Serial.println("debounceDelay abgelaufen");
if (knopfStatus != digitalRead(pin)) {
//Nochmals lesen, falls sich der Zustand geändert hat
knopfStatus = digitalRead(pin);
}
letzterKnopfStatus = knopfStatus;
// Das folgende return-Statement ist hier sinnfrei, da letzterKnopfStatus hier bereits
// dem Wert von knopfStatus entspricht ....
return knopfStatus;
}
return letzterKnopfStatus;
}
/******************************************************************************/
constexpr byte myPin {5};
unsigned long lastMillis = 0;
void setup() {
pinMode(myPin, INPUT_PULLUP);
Serial.begin(115200);
Serial.println("Start");
}
void loop() {
byte status = leseKnopf(myPin);
Serial.println(status ? "HIGH" : "LOW");
}