Hallo zusammen.
Einige Schritte weiter, aber noch nicht perfekt - mein universeller "Tastenentpreller ohne delay".
Folgender code klappt manchmal, aber nicht immer.
HTML-Code:
const int EntprellZeit = 500;   // [ms], Entprellzeit (Testhalber 500ms)

void loop() {
  AusgSekTakt();  //Sek-Takt ohne delay

//Tastenabfrage
  int TasteZustandAlt = 0;        // Tastenzustand einmalig initialisieren

  int TasteZustandNeu = digitalRead(TasteLiPin);  // akt. Zustand der Taste auslesen
  if(TasteZustandNeu != TasteZustandAlt)  {       // wenn Tastenzustand verändert
    if(TasteLiEntprell() >= EntprellZeit)  {      // wenn Taste nach Entprellzeit entprellt
      TasteZustandAlt = TasteZustandNeu;          // neuen Tastenzustand übernommen
      
      TextBlock("Taste im AKT. Zustand entprellt!");
    }
  }
}

//Zeitpunkt der ersten Tasten-Zustandsänderung
unsigned long TasteLiEntprell()  {
  static unsigned long StartZeitEntprell = 0; // [ms] Startzeit
  static int TasteZustand = 0;                // akt Zustand des Tasters
  TZ(1);//Testanzeige

  return Entprellen(TasteLiPin, TasteZustand, StartZeitEntprell);
}

//prüft Eingang auf AusgZustand und Zeit [ms]
unsigned long Entprellen(int Pin, int &TasteZustand, unsigned long &StartZeitEntprell)  { 
  if (digitalRead(Pin) != TasteZustand)  {  // Zustandsänderung des Tasters
    TasteZustand = ! TasteZustand;          // Zustand invertieren
    StartZeitEntprell = millis();           // Startzeit speichern
  }
  if (TasteZustand == 1)                    // wenn Taste gedrückt ist
    return millis() - StartZeitEntprell;    // Zeit zurück geben, seit Taste gedrückt wurde
  else
    return 0;                               // 0 zurück geben, wenn Taste nicht gedrückt, oder noch nicht entprellt
}
Fehler:
1. Sobald erstmalig korrekt 500ms-entprellt, zeigt das Prog bei jedem kleinen (<500ms) Tastendruck "Taste im AKT. Zustand entprellt!" an
2. Wenn die Taste länger als >Entprellzeit gedrückt wird, kommt dauernd "Taste im AKT. Zustand entprellt!",
obwohl folgende Zeile nur die Veränderung reagieren sollte.
HTML-Code:
"if(TasteZustandNeu != TasteZustandAlt)"
Ich bin mir nicht sicher, ob fälschlicher weise eine dauernde Neuinisialisierung mit "0" erfolgt - sollte eigentlich nur beim Ersten mal init.
HTML-Code:
 static unsigned long StartZeitEntprell = 0;
 static int TasteZustand = 0;