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;
Lesezeichen