Wie kann ich eine Zeitverzögerung beim Taster realisieren?

Hallo,
ich habe folgendes vor:
Ich habe 2 beleuchtete Taster AN und AUS, wenn man die über mindestens 1s gedrückt hält, soll die dazugehörige LED angehen, wenn man beide Taster gleichzeitig drückt soll die LED-Aus angehen.

Ich habe das schon mit millis ausprobiert, nur ist die Zeit, wo man den Taster gedrückt halten soll, unterschiedlich - ab und zu kürzer wie 1s.

Würde mich über jede Hilfe freuen. :slight_smile:

 //TASTER / LED´s
  { if (millis() > intervalLED + timerLED )
    { timerLED = millis();

      if ((digitalRead(Taster_Aus) == LOW) && (digitalRead(Taster_An) == HIGH))
      { digitalWrite(LED_Aus, HIGH);
        digitalWrite(LED_An, LOW);
      }


      if ((digitalRead(Taster_Aus) == HIGH) && (digitalRead(Taster_An) == LOW))
      { digitalWrite(LED_Aus, LOW);
        digitalWrite(LED_An, HIGH);
      }

      if ((digitalRead(Taster_Aus) == LOW) && (digitalRead(Taster_An) == LOW))
      { digitalWrite(LED_Aus, HIGH);
        digitalWrite(LED_An, LOW);
      }
    }
  }

Ich habe das schon mit millis ausprobiert, nur ist die Zeit, wo man den Taster gedrückt halten soll, unterschiedlich - ab und zu kürzer wie 1s.

Das ist schon der richtige Weg.
Wer entscheidet wie lange der Taster gedrückt werden muß?
Grüße Uwe

Hallo
schaue dir dazu am Besten die enum- und struct-Anweisung an. Mit dieser Anweisung kannst du alle Eigenschaften für die Beleuchtung, d.h. LED, Taster, Zeitgeber usw., zusammenfassen und im Sketch sehr einfach darauf zugreifen.
So hat man den Vorteil das man nicht auf zwei Taster/LED-Kombinationen begrenzt ist.

Hallo,

überlege noch mal genau was Du vorhast. Du willst einen Taster drücken. Wenn er nach einer Sekunde immer noch gedrückt ist soll die LED angehen. Wenn beide Taster gedrückt werden soll die LED sofort ausgegen.

Für mich macht das mit den beiden Tastern drücken keinen Sinn. Nimm einen zum einschalten und den anderen zum ausschalten. Klassischer Ein / Aus Taster.

Mach dir einen Ablaufplan in dem du aufschreibst was in jeder Zeile passieren soll. Mit ein bischen Übung kannst Du dann jede Zeile in Code umsetzten.

Wenn Du sonst nichts anderes machen willst kannst Du auch erst mal delay verwenden. Oder suche Di eine Lib die Timer zur Verfügung stellt. z.B die MobaTools. Du kannst auch selber millis() verwenden, Dann schau dir aber die Nachtwächter Erklärung an und das Beispiel BlinkWithoutDelay

Heinz

joschi01k:

if (millis() > intervalLED + timerLED )

{ timerLED = millis();


...
if (millis() - timerLED > intervalLED  )
    { timerLED = millis();

...

Wäre mathematisch dasselbe, wenn man nicht mit Zahlen eines begrenzten Wertebereichs rechnen würde.
So ist die erste Form falsch, die zweite funktioniert auch während und nach einem Überlauf.

Das dient aber eher dazu, einen Programmblock nur einmal alle intervallLED ms auszuführen, hat also mit deinem Taster-Problem wenig zu tun.

michael_x:

if (millis() - timerLED > intervalLED  )

{ timerLED = millis();


...

Wäre mathematisch dasselbe, wenn man nicht mit Zahlen eines begrenzten Wertebereichs rechnen würde.
So ist die erste Form falsch, die zweite funktioniert auch während und nach einem Überlauf. 

Das dient aber eher dazu, einen Programmblock nur einmal alle `intervallLED` ms auszuführen, hat also mit deinem Taster-Problem wenig zu tun.

super Erklärung - KARMA+

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.