LED 3 x blinken lassen ohne blocking Code zu verwenden

Hallo,
es geht darum, dass wenn man auf einen Button drückt, dann soll eine LED dreimal blinken.
Wenn man während dem Blinken erneut auf den Button drückt, dann muss die LED wieder 3x blinken.
Das ganze soll ohne blocking Code implementiert werden.

Wie man eine LED ohne blocking Code zum blinken bringt, habe ich bereits gefunden.

Die LED soll aber dreimal blinken. Jetzt könnte man eine Schleife verwenden, damit die LED 3x blinkt, aber dann hätte ich wieder implizit blocking Code drin.

Wie kann man das ohne blocking Code implementieren?

Hallo
da hilft ein Zähler, der feststellt wie oft "geblinkt" worden ist und schaltet dann den Zeitgeber ab.

Welche Schule, welches Fach ?

Kannst du das genauer erklären?
Ich erwarte keinen Code. Nur weiß ich nicht, wie ich das ohne blocking code machen soll.

Hallo
das IDE Beispiel ist ein Zeitgeber und diesen Zeitgeber um einen Zähler erweitern und das Zählergebnis zum Steuern verwenden

Das heißt um das IDE Beispiel einfach eine Schleife außenherum?

user10198:
Das heißt um das IDE Beispiel einfach eine Schleife außenherum?

kann man machen
oder die if-Dingung im Zeitgeber erweitern

Und wie soll ich die Abfrage erweitern?
Meinst du, dass ich überprüfen soll, ob der zähler 0,1,2,... ist?

user10198:
Und wie soll ich die Abfrage erweitern?
Meinst du, dass ich überprüfen soll, ob der zähler 0,1,2,... ist?

wenn der Zähler runter gezählt ist, dann braucht nicht geblinkt werden, bis der Zähler neugeladen wird

user10198:
wenn man auf einen Button drückt, dann soll eine LED dreimal blinken.
Wenn man während dem Blinken erneut auf den Button drückt, dann muss die LED wieder 3x blinken.
Das ganze soll ohne blocking Code implementiert werden.

Jetzt könnte man eine Schleife verwenden, damit die LED 3x blinkt, aber dann hätte ich wieder implizit blocking Code drin.

Wie kann man das ohne blocking Code implementieren?

also mal grundsätzlich: Die Aufgabenstellung ist schon ungenau.
Du möchtest was? Retriggerbar oder aufzählend?

loop() ist eine Schleife. Mehr brauchst Du nicht.

umsetzen: bedingt abhängig abarbeiten.

user10198:
es geht darum, dass wenn man auf einen Button drückt, dann soll eine LED dreimal blinken.
Wenn man während dem Blinken erneut auf den Button drückt, dann muss die LED wieder 3x blinken.
Das ganze soll ohne blocking Code implementiert werden.

BlinkWithoutDelay ist schon der richtige Ansatz.
Am Anfang der Loop() Taster abfragen, wenn Taster gedrückt eine Zählvariable auf 3 setzen.
Immer wenn die Zeit abgelaufen ist und die LED aus ist, wird sie eingeschaltet und danach muß die Zählvariable um eins verringert werden. Die Abfrage ob die ledState LOW ist, noch mit einer Abfrage Zählvariable > 0 ergänzen.

Sollte funktionieren und blockiert nicht. Die Loop rennt immer komplett durch.

Allerdings:
Wenn die LED bereits an ist und man drückt, leuchtet sie danach nochmals 3 mal. So gewollt?

Gruß, Jürgen

Katsumi_S:
Allerdings:
Wenn die LED bereits an ist und man drückt, leuchtet sie danach nochmals 3 mal. So gewollt?

Auch ungenau.
Das was Du meinst, ist ein erneutes triggern.
Geht im Übrigen auch, wenn die LED aus ist. :wink:

Nachtriggern ist schon klar. Soll ja auch so.

user10198:
Wenn man während dem Blinken erneut auf den Button drückt, dann muss die LED wieder 3x blinken.

Da ist dann aber nicht klar ob die gerade leuchtende LED mitgezählt wird und danach nur noch 2 mal blinken soll, oder danach noch 3 mal.

Wenn die LED aus ist, blinkt sie nur noch 3 mal.

Holla, leichter Fehler. Zähler muß mit 2 geladen werden...
Gerade kurz zusammengestrickt und getestet. Mein Kochrezept blinkte 4 mal :slight_smile:
Stimmt doch, hatte einen Wackelkontakt am Taster...

Gruß, Jürgen

Katsumi_S:
Nachtriggern ist schon klar. Soll ja auch so.

nene...
"Wenn man während dem Blinken erneut auf den Button drückt, dann muss die LED wieder 3x blinken."
a) nachdem die aktuelle Routine abgelaufen ist (aufaddieren)
b) aktuelle Routine beenden und von vorn anfangen (retirggern)

Da ist dann aber nicht klar ob die gerade leuchtende LED mitgezählt wird und danach nur noch 2 mal blinken soll, oder danach noch 3 mal.

Konsequent wäre IMHO:
Tastendruck beim retriigern (und nur dort) löscht das HIGH der LED[edit] und startet LowTime[/edit] und setzt den Zähler zurück.
Gezählt wird mit der steigenden Flanke.

Darum das mit dem Hinweis, das der TO noch mal nachlegen muss um das genauer zu spezifieren...

Hallo user10198
Hast Du die Aufgabenstellung erfolgreich in einen funktionierenden Sketch umsetzen können?

Vielleicht hat er noch mit diesen Antworten zu tun?

Moko:
Vielleicht hat er noch mit diesen Antworten zu tun?

Vielleicht sollte bevor hier geantwortet wird grundsätzlich gefragt werden ob das Thema schon woanders behandelt wurde :wink:

Immerhin steht da schon alles.
Gut - ich seh meinen gedanklichen edit von letzter Nacht bestätigt. Hat auch was...

Man könnte das retrigger-"Problem", wenn gedrückt wird während der Sketch grade in einer EIN-Phase des aktuellen Blinkzyklus ist, so lösen, dass die LED in jedem Fall AUS ist, während und solange der Taster gedrückt ist, und die erste EIN-Phase mit dem Loslassen des Tasters startet.

Nur mal so als Arbeitsauftrag :slight_smile:

michael_x:
und die erste EIN-Phase mit dem Loslassen des Tasters startet.

Nur mal so als Arbeitsauftrag :slight_smile:

Ich nehm die Herausforderung an :wink:
Allerdings, ob ich mit LED off start oder mit LED on start anfange ist heute nicht mehr prio... :slight_smile:

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