ich würde gerne ein LED über einen Taster ansteuern.
Die LED soll nach dem ersten betätigen des Tasters an gehen und nach erneutem betätigen wieder aus gehen.
Die Besonderheit: Wenn die LED angeht soll sie in gewissen Zeitintervallen aufleuchten und wieder ausgehen.
Ich hab mal ein wenig recherchiert und bin auf diesen Link gestoßen:
int inPin = 2; // the number of the input pin
int outPin = 13; // the number of the output pin
int state = HIGH; // the current state of the output pin
int reading; // the current reading from the input pin
int previous = LOW; // the previous reading from the input pin
// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0; // the last time the output pin was toggled
long debounce = 200; // the debounce time, increase if the output flickers
void setup()
{
pinMode(inPin, INPUT);
pinMode(outPin, OUTPUT);
}
void loop()
{
reading = digitalRead(inPin);
// if the input just went from LOW and HIGH and we've waited long enough
// to ignore any noise on the circuit, toggle the output pin and remember
// the time
if (reading == HIGH && previous == LOW && millis() - time > debounce) {
if (state == HIGH)
state = LOW;
else
state = HIGH;
delay(1000);
state = LOW;
delay(1000);
time = millis();
}
digitalWrite(outPin, state);
previous = reading;
}
Den Code hab ich, so denke ich, verstanden.
Doch wenn ich in der else Abfrage einen delay einbaue macht es nicht was es soll.
if (reading == HIGH && previous == LOW && millis() - time > debounce) {
if (state == HIGH)
state = LOW;
else
state = HIGH;
delay(1000);
state = LOW;
delay(1000);
time = millis();
}
Da fehlt es an einigen geschwungenen Klammern.
Diese gruppieren mehrere Zeilen und dann bezieht sich das if oder else vereinfacht gesagt auf den ganzen Block, nicht nur auf die nächste Zeile.
Du kannst State sooft ändern wie Du willst, erst was sehen wirst Du wenn Du den status auch ausgibst zb mit
ich habe jetzt mal geschweifte Klammern eingefügt:
if (reading == HIGH && previous == LOW && millis() - time > debounce) {
if (state == HIGH){
state = LOW;
} else{
state = HIGH;
delay(1000);
state = LOW;
delay(1000);
}
time = millis();
}
Doch nun schaltet sich die LED nur nach dem ersten mal wieder ab.
liegt es vielleicht daran das nach dem Part:
if (reading == HIGH && previous == LOW && millis() - time > debounce) {
if (state == HIGH){
state = LOW;
}
Also vor dem Else Befehl die Klammer geschlossen wird?
Nein.
Du fragst ab 'Ist der Taster jetzt HIGH und war zuvor LOW und ist seit der letzten Erkennung (in Der previous auf millis() gesetzt wurde ... Du lieferst nicht den ganzen Sketch!!) die Entprellzeit vergangen ist (dadurch der Taster also nicht mehr prellt), DANN ändere den Status
von HIGH nach LOW
von LOW nach HIGH, warten, nach LOW, warten
Wenn Du mit 'status' auch noch irgend etwas machen willst, geht Das SO nicht!!
Du änderst im ELSE-Zweig status, bevor die IF-Abfrage vorbei ist, wieder auf LOW.
Also dahinter, wo Du wohl status weiter verarbeitest, hast Du immer LOW.
Siehe Dir das Beispiel Blink_without_delay an.
Dort wird eine LED blinken gelassen, ohne, daß loop() dabei blockiert wird.
Ähnlich musst Du Das auch bei Dir machen, Du musst prüfen, wie weit die Zeit für die Blinkerei abgelaufen ist und danach Deine LED schalten/den Status ändern (wobei meine Status-Variable für diese State-Maschine wohl eher den Namen Status bekäme, aber egal).