Led Abfallverzögert - bei gedrücktem Taster

Hallo zusammen.

Bin neu hier und hab schon die erste Frage... :wink:
Ich bin absoluter neu Einsteiger.

Ich habe einen Taster(Pin12) mit einem 10kOhm pull down Widerstand und eine Led (Pin13) mit dem Arduino Mega verbunden.
Nun möchte ich das bei gedrücktem Taster die Led einschaltet und nach 1s wieder ausgeschaltet wird.

Leider habe ich das Problem, dass die Led bei gedrücktem Taster nicht mehr ausschaltet.
Erst wenn ich den Taster loslasse, schaltet die Led nach 1s aus.

Wie muss ich den Code umschreiben, sodass die Led bei gedrücktem Taster angeht und sich nach 1s wieder ausschaltet. (taster wird immer noch gehalten) Das Ganze sollte sich nach erneutem betätigen des Tasters wieder wiederholen.

//Turns on and off a LED ,when pressings button attach to pin12
/**********************************/
const int keyPin = 12; //the number of the key pin
const int ledPin = 13;//the number of the led pin
/**********************************/
void setup()
{
  pinMode(keyPin,INPUT);//initialize the key pin as input 
  pinMode(ledPin,OUTPUT);//initialize the led pin as output
}
/**********************************/
void loop()
{
  //read the state of the key value
  //and check if the kye is pressed
  //if it is,the state is HIGH 
  if(digitalRead(keyPin) ==HIGH )
  {
    digitalWrite(ledPin,HIGH);//turn on the led
    delay(1000);
  }
  else
  {
    digitalWrite(ledPin,LOW);//turn off the led
  }
}
/************************************/

Danke schon im Voraus für eure Hilfe!
Schöne Grüße
Andy

Hallo Andy, das sind Basics und ausreichend gut geschildert im Playground zu finden.

Das delay würde ich deutlich verkürzen auf ~20-50ms oder direkt ohne Blockierung entprellen.

Soll die Led auch 1s leuchten, wenn der Taster weiterhin gedrückt wurde? Wenn ja, schau dir StateChangeDetection in den Beispielen an.

Pseudo-Code auf Basis von millis() (blinkwithoutdelay).

  1. Taster einlesen
  2. Wenn Taster HIGH prevMillis = millis() und Led einschalten
  3. millis() - prevMillis > 1000 (1s) -> Led ausschalten

hi,

mit Deinem code-ansatz kommst Du hier nicht weiter. vermeide delays (außer sehr kurze zum entprellen) und versuche das blinkwithoutdelay-beispiel in der IDE zu verstehen.

gruß stefan

arduinoknight:
Wie muss ich den Code umschreiben, sodass die Led bei gedrücktem Taster angeht und sich nach 1s wieder ausschaltet. (taster wird immer noch gehalten) Das Ganze sollte sich nach erneutem betätigen des Tasters wieder wiederholen.

Erstens mal mußt Du auf einen PegelWECHSEL am Pin reagieren, also wenn der Pegel LOW war und dann HIGH wird, dann wurde der Taster gedrückt.

Und zweitens mal kannst Du es Dir für interaktive Programme komplett abschminken, den Programmablauf zu blockieren mit der Funktion "delay". Damit handelst Du Dir nichts als Ärger ein, wenn Du keinen logischen "Flow" im Programm hast, sondern ständig irgendwo Ablaufblockierungen mit "delay". Damit machst Du jede Programmlogik bei interaktiven Programmen kaputt.

//Turns on and off a LED ,when pressings button attach to pin12
/**********************************/
const int keyPin = 12; //the number of the key pin
const int ledPin = 13;//the number of the led pin
/**********************************/
void setup()
{
  pinMode(keyPin,INPUT);//initialize the key pin as input 
  pinMode(ledPin,OUTPUT);//initialize the led pin as output
}
/**********************************/
boolean lastState;
unsigned long lastSwitch;
void loop()
{
  boolean state=digitalRead(keyPin);
  if(state!=lastState)
  {
    lastState=state;
    if (state==HIGH) 
    {
      digitalWrite(ledPin,HIGH);
      lastSwitch=millis();
    }
  }
  else if (millis()-lastSwitch>=1000)
  {
    digitalWrite(ledPin,LOW);//turn off the led
  }
}
/************************************/

Hast Du einen Widerstand in Serie zum LED? den braucht es unbedingt.
Grüße Uwe

Vielen Dank für eure Tipps und Code´s! Es hat geklappt.
Muss mich wohl noch richtig rein Knien, wenn ich alles verstehen will... :roll_eyes:

Schöne Grüße
Andy

hi,

freut mich, daß es hinhaut, aber:poste doch den code, der funzt, einfach so für die nächsten...

liebe grüße, stefan

Ich brauche nochmals eure Hilfe.

Ich möchte den Code von "jurs" für meine Schaltung erweitern, sodass beim loslassen des Tasters, die Led erneut aufleuchtet und wieder nach 1s ausgeht.

Aufgabe:

Taster drücken (gedrückt halten) > Led AN nach 1s aus > Taster loslassen > Led AN nach 1s wieder aus.

Vielleicht hat jemand Zeit den Code von jurs für mich umzuschreiben. Komm alleine nicht weiter...

Wäre euch sehr dankbar!

Wünsche euch frohe Weihnachten.
Gruß Andy

arduinoknight:
Vielleicht hat jemand Zeit den Code von jurs für mich umzuschreiben. Komm alleine nicht weiter...

Wenn die Schaltung nicht nur beim Pegelwechsel nach "HIGH" stattfinden soll, sondern bei jedem Pegelwechsel, dann kommentierst Du die Bedingung entweder aus, indem Du Kommentarstriche davorsetzt:

// if (state==HIGH)

oder die Zeile gleich komplett löschst, wenn Du sie nicht brauchst.

Vielen Dank Jurs für die schnelle Hilfe. Funktioniert tadellos.

const int keyPin = 12; 
const int ledPin = 13;

void setup()
{
  pinMode(keyPin,INPUT);
  pinMode(ledPin,OUTPUT);
}

boolean lastState;
unsigned long lastSwitch;
void loop()
{
  boolean state=digitalRead(keyPin);
  if(state!=lastState)
  {
    lastState=state;

    {
      digitalWrite(ledPin,HIGH);
      lastSwitch=millis();
    }
  }
  else if (millis()-lastSwitch>=1000)
  {
    digitalWrite(ledPin,LOW);
  }
}

Schöne Grüße
Andy