LED verzögert einschalten

Hallo in die Runde,

ich habe eine augenscheinlich recht einfache Aufgabenstellung. Ein LED Soll geschaltet werden wenn ein Digitaler Eingang (PullUp) auf Masse geschaltet wird und zwar erst dann, wenn der Schalter mind. 2 sec. gedrückt gehalten wurde.

Leider will mir gerade kein richtiger Ansatz einfallen, denn das Problem liegt darin, dass der Schalter auch deutlich länger gedrückt werden könnte und auch dann soll spätestens nach 2sec. die LED angehen. Ich kann also nicht einfach abwarten bis der Schaltvorgang beendet ist, die Zeit mit millis() messen, vergleichen und dann die LED Schalten.

Hat evtl. jemand eine Idee?

Hier ging es in Post #14 auch um das Problem. Das sollte dir helfen.

jepp, das geht in die richtige Richtung, nur dass sich die LED direkt auch wieder ausschalten soll, wenn der Schalter los gelassen wird - also ohne weiteren Schaltvorgang...

Das schaue ich mir heute Abend aber nochmal in Ruhe an - das hat auf jeden Fall geholfen!

touranie:
jepp, das geht in die richtige Richtung, nur dass sich die LED direkt auch wieder ausschalten soll, wenn der Schalter los gelassen wird...

Aus meiner Sicht macht es der Sketch doch schon.

Wenn nicht, sollte das doch kein Problem sein. Ein wenig Eigenleistung ist hier erwünscht. :wink:

nee, macht er nicht, aber das wird sich schon nach basteln lassen...

touranie:
nee, macht er nicht, aber das wird sich schon nach basteln lassen...

Macht er nicht, weil es so auch nicht gewünscht war, aber das läßt sich hinbekommen :slight_smile:

touranie:
nee, macht er nicht, aber das wird sich schon nach basteln lassen...

Ja, ok...sorry, habe mir das gerade nochmal angesehen.

Der toggelt. :wink:

int t = millis();

if(digitalRead(taster)==0){

if (millis()-t == 2000){
digitalWrite(led,HIGH);
}
else
{
t = millis();
digitalWrite(led,LOW);

}

Das ist nicht optimal. Den Schaltzeitpunkt von genau 2000ms könnte er evtl. verpassen da der Controller auch noch eine Durchlaufzeit hat.

man kann das natürlich noch mit einem Timer machen. Das ist jetzt die quick & dirty version. es ist auch nicht optimal die Ports jedesmal zu schalten (kostet Zeit). Das ist aber schonmal ein Ansatz und wenn es nicht auf µS ankommt sollte das reichen. Und außerdem wenn die Led nach genau 2000 ms angehen soll. müsste man noch die
Schaltzeit des Conrtollers (bis der Port stabil ist ), die dauer der Programmzeilen und die Trägheit der LED abziehen. Aber ich denke wenn es um eine Optische Meldung geht reicht diese Tolleranz

Ja klar, wollte es nur mal erwähnen da ich selbst schon mal in die Falle getappt bin :slight_smile:

Ich habe das oben verlinkte Beispiel mal etwas abgeändert.

So sollte es jetzt bei dir funktionieren.
Ich habe es eben getestet.

const byte ledPin = 13;
const byte tasterPin = 2;
unsigned long aktMillis, altMillis;
unsigned int zeit = 2000;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(tasterPin, INPUT_PULLUP);
}

void loop() {
  aktMillis = millis();
  if (digitalRead(tasterPin) == LOW) {
    if ((aktMillis - altMillis >= zeit)) {
      digitalWrite(ledPin, HIGH);
    }
  } else {
    altMillis = aktMillis;
    digitalWrite(ledPin, LOW);
  }
}

Aktuell Taste 2 Sekunden drücken, Led geht an. Taste loslassen, Led geht sofort aus.

Der Code in #7 funktioniert so nicht, da millis() vier Byte zurückliefert, daher unsigned long t = millis();Auf die Problematik von Gleichheit anstelle von Relation wurde schon hingewiesen. Dies könnte bei einem längeren loop zu einem Fehler werden, der nur manchmal auftritt, was unangenehm zu ermitteln ist.

Formal fehlt eine geschweifte Klammer, wobei die Frage, wo sie fehlt, durchaus nicht so einfach zu beantworten ist.

Nach Korrektur landet man dann bei #11.

@der_chipo: Ich schreibe das nur, damit sich nicht andere die Haare raufen, die gerade keinen UNO zum Probieren haben. :slight_smile:

Hallo,

ich dachte hier kommt nochwas. :slight_smile: Denn ich möchte zwar nicht meckern, aber der Code gefällt mir noch nicht so richtig. Denn wenn es nichts zu tun gibt, wird dennoch permanent der LED-Pin mit LOW beschrieben. Muß nicht sein. Klar der Codeaufwand würde steigen, dafür wäre Leerlauf dann Leerlauf. :slight_smile:
Eigentlich ist das eine Tasterentprellung mit 2 sec. Entprellzeit beim Taster drücken.

wenn es nichts zu tun gibt, wird dennoch permanent der LED-Pin mit LOW beschrieben. Muß nicht sein

Das ist aber sehr egal. Vor allem, wenn nichts zu tun ist, hat der Arduino ja sowieso nichts zu tun, da kommt es auf eine microsekunde nicht wirklich an. Dem LED Signal merkt man es nicht an.
Auch der Stromverbrauch des Arduino ist der gleiche. Was stört dich?

Entprellen ist hier tatsächlich nicht nötig.