Habe ich die benutzt?
Du hast vollkommen Recht - werde ich auch machen, brauche aber noch allgemeingültige/universelle Vereinbarungen für mich selber.
Z.B. bin ich mir nicht sicher, ob die Entprellzeit im den Globalvariablen-Bereich
HTML-Code:
const int EntprellZeit = 30; // [ms], Entprellzeit (typ.Prellzeit 0,1-30ms)
oder besser (kontrollierter, leserlicher) in der Funktion Entprell() aufgehoben ist
HTML-Code:
static int EntprellZeit = 30; // [ms], Entprellzeit (typ.Prellzeit 0,1-30ms)
Mit meinem derzeitigen code bin ich schon sehr zufrieden - gibt 3 Zustände zurück - 0..LOW, 1...HIGH, 2...in Entprellung
HTML-Code:
//==========MAIN==========//
void loop() {
static int AusgImpuls = 0; // Ausg-AusgImpuls [ms]
AusgTakt(AusgImpuls, 1000); // Taktdauer [ms], Intervall [ms]
static int TasteLiZustand = 0; // akt. Zustand 0/1 der Taste
if(Entprell(TasteLiPin) == 1) { // sobald Taste HIGH und entprellt
AusgImpuls = 900; // Ausg-AusgImpuls bei Taste HIGH
TasteLiZustand = 1; // speichert das Taste "1" ist
}
else if(Entprell(TasteLiPin) == 0) { // sobald Taste LOW und entprellt
AusgImpuls = 10; // Ausg-AusgImpuls bei Taste LOW
TasteLiZustand = 0; // speichert das Taste LOW ist
}
else
TZ("Medlung: Kontakt derzeit in Entprellung");
}
//----------STANDARD-FUNKTIONEN----------//
//Kontaktentprellung durchführen, Zustand zurück geben
//Rückgabe 3 Zustände; "0"...LOW+Kontakt entprellt / "1"...HIGH+Kontakt entprellt / "2"...Zustand unbekannt, in Entprellung
int Entprell(int Pin) {
static int KontaktStatusNeu = 0; // akt.Zustand
static int KontaktStatusAlt = 0; // vorheriger Zustand
static unsigned long KontaktStartZeit = 0; // Startzeit der ersten Kontaktzustandsänderung
KontaktStatusNeu = digitalRead(Pin); // speichert akt. Kontaktzustand
if(KontaktStatusNeu != KontaktStatusAlt) { // wenn sich Kontaktzustand ändert
KontaktStartZeit = millis(); // speichert aktualisierte Startzeit
KontaktStatusAlt = KontaktStatusNeu; // geänderter Zustand gespeichert
}
if(KontaktStatusNeu == 0 && (millis() >= KontaktStartZeit + EntprellZeit)) // wenn Entprellzeit überschritten und Kontakt LOW
return 0; // "0" zuück, Kontakt LOW und entprellt
else
if(KontaktStatusNeu == 1 && (millis() >= KontaktStartZeit + EntprellZeit)) // wenn Entprellzeit überschritten und Kontakt HIGH
return 1; // "1" zurück, Kontakt HIGH und entprellt
else
return 2; // "2" zurück, noch nicht entpellt, Kontaktzustand unbekannt
}
Fehlt nur noch, dass mehrer Taster/Kontakt gleichzeitig entprellt werden können.
Danach werde ich die Zustands- und Entprellgeschichte in eine Bibliothek (*.h, *.cpp) einrichten.
- - - Aktualisiert - - -
...ETWAS SPÄTER:
Habe derzeit das Problem, dass innerhalb einer Entprellphase, keine andere Entprellung erfolge kann.
Solang eine Entprellung läuft, werden alle anderen Kontakte/Tasten "verschluckt".
Ursache ist, dass die Funktion Entprellung() eine Startzeit speichert und diese berechnet.
Können diese 30ms-Überlappungen in der Praxis vernachlässigt werden?
Oder sollte/muss ich für jede Taste/Kontakt eine eigene Funktion vorhalten, in der die Entprell-Startzeit gespeichert wird?
Lesezeichen