"träger" Schalter ?!

Servus Leute,

nach der tollen Hilfestellung von letzter Woche, habe ich Hoffnung das mir auch dieses mal wieder geholfen werden kann.
Folgendes habe ich im Prinzip vor, bzw. muss es aus Failsafe-Gründen so bauen:

im Prinzip möchte ich mit dem Arduino via eines Tasters eine LED ansteuern.
So weit so einfach. Allerdings soll die LED nur dann leuchten wenn der Taster mindestens eine gewisse Zeit lang (~0,5 Sek.) gehalten wird. Bei kürzerem Drücken soll nichts passieren. Bei längerem Drücken soll er logischerweise auch die LED einschalten.

Einen halbwegs funktionierenden Code habe ich auch schon zusammengeschrieben:

#define buttonPin 4
#define LED 13

int buttonState;
int lastButtonState;
unsigned long time;
int onOffTimer;
unsigned long startTime;
unsigned long buttonPressTime = 250;
unsigned long teilZeit;



void setup()
{
 Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}

// the loop function runs over and over again forever
void loop()
{
  buttonState = digitalRead(buttonPin);
  
 if (buttonState == 0 && onOffTimer == false && lastButtonState == 1)
 {
   Serial.print("buttonState: ");
   Serial.println((int)(buttonState));
   startTime = millis();
   onOffTimer = true;
   delay(5);
   lastButtonState = buttonState;
 } 

 if (buttonState == 1 && onOffTimer == true && lastButtonState == 1) 
 {
   Serial.print("buttonState: ");
   Serial.println((int)(buttonState));
   time = millis() - startTime;
   onOffTimer = false;
   lastButtonState = buttonState;
      
   Serial.print( (int)(time / 1000L));
   Serial.print(".");
   
   teilZeit = (int)(time % 1000L);
   
          if (teilZeit == 0)

          Serial.print("000");      // add three zero's

       else if (teilZeit < 10)    // if fractional < 10 the 0 is ignored giving a wrong time, so add the zeros

          Serial.print("00");       // add two zeros

       else if (teilZeit < 100)

          Serial.print("0");        // add one zero


       Serial.println(teilZeit);  // print fractional part of time
   
 }  
 else
 {
      lastButtonState = buttonState;
 }
  
 if ( buttonState == 1 && time > buttonPressTime )
 {
   digitalWrite(LED, 1);
   delay (3000);
   time = 0;
 }
 else
 {
   digitalWrite(LED, 0);
 }
 
}

Der Code hat aber einen Haken, mit dem ich so nicht gut leben kann.
Die LED leuchtet nämlich erst dann wenn ich den Taster wieder loslasse.
Ich hätte es aber gerne das die LED nach 500ms schon anfängt zu leuchten während ich den Taster noch drücke. Wenn ich den Schalter nur kurz antippe (< 500ms) soll kein Signal vom Arduino ausgegeben werden.
Desweiteren soll die LED weiterleuchten wenn ich den Taster gedrückt halte und wenn ich Ihn loslasse, nach 3 Sek. ausgehen.
Leider habe ich keine Ahnung wie ich das weiter realisieren kann.
Hat jemand eine Idee wie ich das programmiertechnisch umsetzen könnte?
Und ja, ich weiss dass mein Code nicht sauber ist. Aber ich programmiere auch erst seit ~ 3 Wochen ohne das es mir jemals jemand beigebracht hat :smiley:

Hallo, versuch mal diese Änderung:

...
  else {
    time = millis() - startTime;
    lastButtonState = buttonState;
  }
  if ( buttonState == 0 && time > buttonPressTime ) {
    digitalWrite(LED, 1);
    delay (3000);
    time = 0;
  }
...

PS: Eine ordentliche Aufgabenbeschreibung, ein vernünftiger Code-Vorschlag, das erzeugt ein :grin: bei mir.

:D Das klappt Wunderbar. Danke dir

Sorry wegen dem Wirrwar in meinem Code. Die richtige Notation ist mir leider nicht bekannt. Programmieren aus dem Lehrbuch kenne ich auch nicht. Was daran liegen könnte das ich sowas nicht besitze :D. Ich kann auch keine Programmiersprache oder so. Arduino ist first-try was Programmieren überhaupt angeht.

Ich gelobe Bessereung :P