Hallo littlekenny,
Viele Wege führen zum Ziel, deshalb hier mal eine Möglichkeit:
Pseudocode:
wenn Taste gedrückt ist dann
Zaehler = Zahler +1 ansonsten Zaehler = 0
wenn Zaehler = 20 dann Aktion ausführen
Das Programm prüft also ob die Taste gedrückt ist
wenn ja, wird ein Zaehler hochgezählt,
wenn nicht, dann wird der Zaehler auf 0 gesetzt.
Wenn der Zaehlerstand einen bestimmten Wert erreicht, dann soll etwas ausgelöst werden,
aber nur einmal. Zum Beispiel das Senden
Wenn die Taste weiter gedrückt gehalten wird, zaehlt der Zaehler immer weiter hoch,
aber es wird nichts mehr ausgeführt.
Jetzt kommt das Problem: diese kleinen Prozessoren sind "sau schnell"
der Zaehler wird vermutlich hundertausende Male hochzählen bis Du die Taste
wieder losgelassen hast. Das wäre kein Problem, dann muss man halt der Abfragewert entsprechend hoch setzen, das ist aber eine schlechte Lösung.
Eleganter machen wir das jetzt so.
Wir packen in unsere Hauptschliefe eine Verzögerung von z.B "einer" Millisekunde
Nun wissen wir, das der Zaehler maximal jede Millisekunde hochlaufen kann.
Somit haben wir eine recht präzisen Wert für die Abfrage.
Das Prellen einer Taste, wo der Schaltkontakt grade schließt dauert so 20ms (bei schlechten Tasten)
Also ist unser Abfragewert mit 20 recht gut gewählt.
Wir müssen nun mindestens die Taste 20ms gedrückt halten, bis etwas ausgelöst wird.
Im Code würde das nun so aussehen.
Code:
int button_1;
int button_2;
int zaehler_b1;
int zaehler_b2;
int status;
void loop(void)
{
status = digitalRead(button_1);
if (status == 0) // wenn Taste gedrückt ist (pin ist low)
{
zaehler_b1++; // eins hochzaehlen
if (zaehler_b1 == 20) // wurde die Taste mindestens 20ms gedrückt dann
{
// senden
}
} else zaehler_b1 = 0; // Taste wurde losgelassen, also zaehler auf 0 setzen
status = digitalRead(button_2);
if (status == 0) // wenn Taste gedrückt ist (pin ist low)
{
zaehler_b2++;
if (zaehler_b2 == 20) // wurde die Taste mindestens 20ms gedrückt dann
{
// senden
}
} else zaehler_b2 = 0; // Taste wurde losgelassen, also zaehler auf 0 setzen
delay(1); // nur 1 Millisekunde warten
}
Lesezeichen