LED zeiversetzt schalten

Hallo

Ich will mich kurz vorstellen. Ich heiße Holger. Ich möchte folgendes erreichen. Wenn ich einen Taster drücke soll 3sek später die LED angehen und beim loslassen die LED gleich ausgehen. Bitte helft mir bin totaler Anfänger und seid nicht zu hart zu mir :smiley: . Was muß ich an meinen Code ändern um das zu erreichen?
Gruß Holger

int SchalterZustand;
int inputPin=2;
int ledPin=13;

void setup(){
 pinMode(inputPin,INPUT);
 pinMode(ledPin,OUTPUT);
 digitalWrite(inputPin,HIGH);
}
void loop(){ 
 SchalterZustand = digitalRead(inputPin);
 if(SchalterZustand==1)
 {  
   digitalWrite(ledPin,LOW);  
 }
 else
 {
 digitalWrite(ledPin,HIGH);
}
}

Hallo,

erstmal mußte Dein setup korrigieren. Du möchtest sicherlich nicht den input Pin überschreiben. Low und High ist laut Deiner Beschreibung auch verwechselt.

Du mußt Dir mit millis() die aktuelle Zeit nach Tastendruck merken, mit 3000ms addieren und dann vergleichen. Wenn die Zeit um ist, schaltest Du die LED ein. Und wenn der Taster nicht mehr gedrückt ist schaltest du die LED ohne umschweife wieder aus.

Hmmm ....
Das ist offensichtlich eine Aufgabe für einen Zustandsautomaten.
Ein einfacher endlicher Automat.

Mein Rat:
Also erstelle eine Liste von möglichen Zuständen.
Definiere alle Zustandsübergänge.

Dann gieße es in Software.
Und teste es

Geht auch ohne Zustandsautomat. Man muss sich nur die Zeit des Tastendrucks merken und dann eine Variable setzten dass die Taste gedrückt wurde. Wenn diese gesetzt ist fragt man die Differenz von aktueller Zeit und dem Zeitstempel ab.

Der Taster sollte auch entprellt werden. Sonst gibt es schnell Probleme.

Danke für die Antwort. so wie Code im Moment ist geht die LED beim Drücken des Tasters an und beim loslassen wieder aus. Wieso ist dann LOW und HIGH vertauscht? Und mit millis() habe ich auch das Problem, das bekomm ich nicht hin habe mir auch schon das Blink without Delay angeschaut.

Gruß Holger

Serenifly:
Geht auch ohne Zustandsautomat. Man muss sich nur die Zeit des Tastendrucks merken und dann eine Variable setzten dass die Taste gedrückt wurde. Wenn diese gesetzt ist fragt man die Differenz von aktueller Zeit und dem Zeitstempel ab.

Der Taster sollte auch entprellt werden. Sonst gibt es schnell Probleme.

:sunglasses: Das ist ein Zustandsautomat! :sunglasses:

Egal wie man es anstellt, wenn es denn hinterher funktioniert, dann hat man automatisch einen solchen Automaten gebaut.
Ob man will, oder nicht.
(denke ich mal)

habe mir auch schon das Blink without Delay angeschaut.

Sehr gut!
Das ist die richtige Richtung.

Die Sache mit den millis, etwas anders als bei Blink without Delay:

millis_LED = millis() + 3000;

...

if (millis() == millis_LED) {
  digitalWrite(ledPin, HIGH);
}

Das Automatengrundgerüst:

  switch (zustand) {
    case WARTEN:
      break;
    case ENTPRELLEN:
      break;
    case LEDEIN:
      break;
  }

Viele Wege führen nach Rom :slight_smile: