Arduino Einschaltverzögerung

Hallo,

ist es möglich das man den Arduino so programmiert, dass wenn man einen Taster drückt erst eine gewisse Zeit abläuft bevor der Arduino mir die Ausgang auf HIGH schaltet?

Habe es schon mit dem BlinkWithoutDelay versucht jedoch keine Lösung gefunden, wäre sehr nett, wenn mir jemand helfen könnte. Meine Suche im Internet hat auch kein Ergebnis erzielen können.

MfG Marvin und vielen Dank schoneinmal im voraus.

BlinkWithoutDelay IST die Lösung ... Du musst nur das Konzept dahinter verstehen. Wenn die Taste gedrückt wird, merkst Du Dir den aktuellen Wert von Milis() in einer Variable. Dann vergleichst Du in der Hauptschleife, ob Millis() - DeinemGemerktenWert >= DeineGewünschteVerzögerung ist (natürlich nur, wenn die "Merk-Variable" > 0). Wenn ja, dann Ausgang schalten und "Merk-Variable" wieder auf 0 setzen.

Ja das ist möglich.
Wenn Du schon mit BlinkWithoutDelay gespielt hast, dann ist der Rest recht einfach.
Du merkst Dir einfach den aktuellen millis() Wert wenn der Taster gesrückt wird und vergleichst in loop() immer gegen den Wert plus die Zeit die vergehen soll plus dem gemerkten Wert. Sobald der größer ist, ist die Zeit "abgelaufen" (sprich die Verzögerung) und Du kannst Deine Aktion starten.

Schaltet die onboard LED verzögert ein und aus. (A0 für Taste, schließt nach GND).

#include <Bounce2.h>

const unsigned long gewisseZeit = 2000;

Bounce Taste;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Taste.attach(A0, INPUT_PULLUP);
}

void loop() {
  static unsigned long tastenZeitpunkt;
  if (Taste.update()) {
    if (Taste.fell()) {
      tastenZeitpunkt = millis();
    }
  }
  if (tastenZeitpunkt && (millis() - tastenZeitpunkt >= gewisseZeit)) {
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    tastenZeitpunkt = 0;
  }
}

Aus Libraries lernt man nichts und Entprellen braucht man hier nicht, da ja erst was passieren soll, wenn der Taster schon lange wieder in Ruhe ist.

Du hast nur vergessen zu erwähnen, wann der Ausgang wieder auf LOW zurücksoll.

Wenn du es nicht selbst hinbekommst, kannst du ja mal hier per copy/paste spicken.
#define TASTER 2 // Pin 2 über Taster mit GND verbinden
#define TASTERMODUS INPUT_PULLUP
#define PRESSED LOW

#define LED 13
#define DELAY 5000 // 5 sec nach Taster geht LED an, mit neuem Drücken erstmal wieder aus

unsigned long tasterZeit;

void setup () {
pinMode(TASTER, TASTERMODUS);
pinMode(LED, OUTPUT);
}
void loop() {
if (digitalRead(TASTER)==PRESSED) {
tasterZeit= millis();
digitalWrite(LED, LOW);
}

if (millis() - tasterZeit > DELAY) digitalWrite(LED, HIGH);
}

Geht natürlich auch anders, aber so könnte man machen, was du beschrieben hast...

michael_x:
Aus Libraries lernt man nichts und Entprellen braucht man hier nicht,

Wenn man die State-Change-Detection jedesmal wieder hinschreiben will, auf gehts.

Es ist eben nicht nur das Entprellen das die Library hier erledigt.

Und warum sollte man Key-Handling lernen/lehren, wenn es doch um ein verzögetes Einschalten geht?

Marvin97:
Meine Suche im Internet hat auch kein Ergebnis erzielen können.

Ich frage mich nur wo und wie du suchst.

Wenn ich den Suchbegriff "Arduino Schaltverzögerung" eingebe, finde ich >4000 Ergebnisse, bei dem sicher eines passen könnte.

hi,

bei der fragestellung wäre es auch möglich, daß der taster eine gewisse zeit gedrückt BLEIBEN muß, bevor der arduino schaltet.

gruß stefan

@Whandall:
Ok, etwas präziser: Aus Libraries lernt man nichts, wenn man nur ein mitgeliefertes Beipiel ans Laufen kriegt. Man kann sich auch die Innereien der verwendeten Libraries anschauen.

Und in diesem Fall komme ich sogar ohne State-Change-Detection aus.
Meine LED geht direkt beim Taster-Berühren aus und eine gewisse Zeit nach dem Loslassen wieder an.

Einfache Aufgaben sollte man auch einfach lösen und nicht ohne Grund Libraries vorführen, die sicher generell ihre Berechtigung haben, weil sie einiges von dem bequem verstecken, was abläuft.

@Marvin97:
Wenn die LED nicht ganz von allein nach Start verzögert loslegen darf, brauchst du übrigens noch den Merker, den mgcss angedeutet hat. Und wenn du erreichen willst, dass die LED jemals wieder dauerhaft ausgeht, ohne dass du regelmäßig deine Verzögerungstaste drückst, solltest du deine Aufgabe/Fragestellung überarbeiten :wink:

michael_x:
Meine LED geht direkt beim Taster-Berühren aus und eine gewisse Zeit nach dem Loslassen wieder an.

ist etwas anderes als

Marvin97:
wenn man einen Taster drückt erst eine gewisse Zeit abläuft bevor der Arduino mir die Ausgang auf HIGH schaltet?

du brauchst keine State-Change-Detection weil du die Anforderungen geändert hast.

  1. Das hätte Marvin nicht gemerkt :wink:

  2. Das war nicht genau definiert. "Eine gewisse Zeit nach dem Tastendruck" ist ziemlich unspezifisch.
    Dir ist sicher bewusst, dass man kurzes Tastendrücken erst beim Loslassen der Taste erkennen kann. Wenn langes Drücken eine andere Funktion auslösen soll. Da hat sich noch nie jemand wirksam beschwert, dass die Funktion erst nach dem Antippen startet.

  3. Wenn Marvin geschrieben hätte, dass die LED angehen soll, nachdem man eine gewisse Zeitlang den Taster gedrückt gehalten hat, hätte ich wohl eine andere Lösung präsentiert (natürlich auch ohne Bounce) :wink:

michael_x:
Dir ist sicher bewusst, dass man kurzes Tastendrücken erst beim Loslassen der Taste erkennen kann.

Nein wird es auch nie.

Den Tastendruck kann ich sofort erkennen, die Dauer des Tastendrucks nicht.

Es war aber auch nicht nach der Dauer gefragt.

Hallo,

vielen Dank ersteinmal für die Hilfe, hab es soweit geschafft.
Die Fragestellung war eigentlich gemeint, dass wenn man den Taster kurz betätigt eine Zeit von z.B. 5 Sekunden abläuft bevor der Ausgang z.B. Pin2 vom Arduino auf HIGH gesetzt wird.

z.B. Pin2

Und dann, bleibt er HIGH, bis zum nächsten Stromausfall?

Marvin97:
wenn man den Taster kurz betätigt eine Zeit von z.B. 5 Sekunden abläuft bevor der Ausgang z.B. Pin2 vom Arduino auf HIGH gesetzt wird.

Was heisst 'Taster kurz betätigt'?

Soll das nicht passieren wenn man den Taster lange drückt?

Wann sollen die 5 Sekunden starten, beim Drücken der Taste, oder beim Loslassen?

... oder ist das beim "kurz" drücken eigentlich egal :wink: SCNR

vielen Dank ersteinmal für die Hilfe, hab es soweit geschafft.

Bedanken hilft dir nicht. Einfache Fragen werden hier auf diese Art bestraft.

Eisebaer:
hi,

bei der fragestellung wäre es auch möglich, daß der taster eine gewisse zeit gedrückt BLEIBEN muß, bevor der arduino schaltet.

gruß stefan

Whandall:
Was heisst 'Taster kurz betätigt'?

Soll das nicht passieren wenn man den Taster lange drückt?

Wann sollen die 5 Sekunden starten, beim Drücken der Taste, oder beim Loslassen?

Hallo,

gemeint war es, das der Taster einmal kurz betätigt wird, sprich der Pin an dem der Taster ist kurz auf HIGH geht. Die Zeitverzögerung sollte beim loslassen des Taster starten und dann nach ablauf der 5 Sekunden die LED am Ausgang auf HIGH schalten.
Durch einen anderen Taster sollte die LED dann wieder ausgehen.
Den Sektch den ich dazu geschrieben hat funktioniert jetzt auch, so wie es soll!

Marvin97:
der Taster einmal kurz betätigt wird, sprich der Pin an dem der Taster ist kurz auf HIGH geht.

Kurz heisst? 1ms? 100ms? 500ms?

Marvin97:
Die Zeitverzögerung sollte beim loslassen des Taster starten und dann nach ablauf der 5 Sekunden die LED am Ausgang auf HIGH schalten.
Durch einen anderen Taster sollte die LED dann wieder ausgehen.

Das ist neu und wäre erwähnenswert gewesen.

Marvin97:
Den Sektch den ich dazu geschrieben hat funktioniert jetzt auch, so wie es soll!

Warum postest du den dann nicht?