Du mußt eine Änderung des Schalterzustandes ( zB von L auf H) erkennen und damit die LED schalten.
Eine änderung erkennt man indem der vorherige Status verschieden vom jetzigen Tasterzustand ist und der Taster H ausgibt. Ein 10ms delay entprellt.
wird ja der Zustand des Tasters ausgelesen und der Ausgang auf High gesetzt. Aber sobald man auslässt ist der Ausagang wieder auf Low.
Geht das so in etwa:?
if (digitalRead(buttonPin) == HIGH && var = 0) {
digitalWrite(ledPin, HIGH);
var = 1;
}
else {
delay(10);
}
if (digitalRead(buttonPin) == HIGH && var = 1) {
digitalWrite(ledPin, LOW);
var = 0;
}
else {
delay(10);
}
if (digitalRead(buttonPin) == HIGH && var = 0) {
digitalWrite(ledPin, HIGH);
var = 1;
...
if (digitalRead(buttonPin) == HIGH && var = 1) {
Das 2. if ist sofort wieder war noch bevor Du den Taster überhaupt loslassen konntest.
Du mußt das Schrittweise machen.
Schritt 1
Taster 1 und Variable 0 und LED aus -> LED ein und Variable 1 und delay (10)
Schritt 2
Taster 0 und Variable 1 -> Variable 0 und delay (10)
Schritt 3
Taster 1 und Variable 0 und LED aus -> LED ein und Variable 1 und delay (10)
Schritt 4
Taster 0 und Variable 1 -> Variable 0 und delay (10)
es folgt Schritt 1
Mein Motto, nur durch selbst probieren lernt man besser dazu.
Ich sage dazu:
Wir lernen, indem wir es tun!
Darum schreibe ich ja auch keinen Sketch, sondern nur Erklährungen (Pseudoflußdiagramm) wie's zu programmieren ist.
Mir ist das recht egal.
Wenn es schon fertig in der Wühlkiste liegt, dann raus damit.
Nur selten interessiert mich ein Problem so, dass ich selber ein Programm extra dafür schreibe.
Meist müssen sich die Fragenden mit abstrakten Andeutungen/Ansagen zufrieden geben.
Oft als "Testballon" ausgeführt.
An den Antworten/Nachfragen sehe ich dann wie "wach" das Gegenüber ist.
So manchen/manche rüttel ich damit aus der Komfortzone raus.
(naja, das kann auch mal Stimmungsmäßig nach hinten los gehen)
Die braucht es zum Entprellen bei einem Zustandswechsel.
Glaube ich Dir nicht daß es funktioniert.
Jetzt schaltest Du nur Flankengetriggert das LED synchron zum Tasrter ein und aus.
Bei x==1 und x==3 darfst du die LED nicht ein oder ausschalten sondern nur die Variable x hinaufzählen.
Die braucht es zum Entprellen bei einem Zustandswechsel.
Na ja, die entprellen schon, indirekt.
Genaugenommen dauern alle loop-Durchläufe 20 ms, ausser wenn ein Flankenwechsel erkannt wird.
( der dauert 10 ms )
Und in dem seltenen Fall, dass ein Prell-Signalwechsel genau synchron mit zwei digitalRead - Aufrufen stattfindet, wird das Spiel eben sofort ohne delay im nächsten loop-Durchlauf nochmal probiert.
Aber natürlich hast du recht, Uwe. So verworren sollte man so simple Logik nicht machen.
Man braucht in den else Zweig gar nichts reinzuschreiben und kann ihn auch ganz weglassen.
Die Zustandsvariable x ist (nur) gut um sich zu merken, wie der Taster-Zustand gerade ist. Und um aus dem Tastenzustand ein Ereignis zu machen. ( Das wäre dann auch im if-Teil )
Wenn einmal drücken einschalten soll und nochmal drücken ausschalten, nimmt man einfach noch so eine Variable. Und gibt ihnen bessere Namen