[gelöst] Mit Taster while oder for schleife beenden

Hallo, ich möchte mit einen Taster eine Schleife (while oder for) abbrechen, wie das im Grunde geht weiß ich ja.
Nur wenn ich eine “lange” Schleife habe, die z.b. 5 min dauert, möchte ich bei Tastendruck, dass die Schleife sofort abgebrochen wird.
Gibt es so etwas wie Ereignisse im Sketch?

Nein, Du mußt andauernd kontrollieren ob die Taste gedrückt wird.
Grüße Uwe

matze12:
Gibt es so etwas wie Ereignisse im Sketch?

Im Prinzip schon, aber Du musst sie dir selbst bauen. Wobei langdauernde Schleifen sowieso eher ungünstig sind. loop() ist doch deine Schleife, warum nutzt Du sie nicht?

Hallo
zeige mal deinen Sketch.

In Moment habe ich noch keinen Sketch, das war nur eine Grundlegende Frage.
Weil ich verschiedene LED's unterschiedlich zum Leuchten bringen möchte, heißt in einer Schleife LED 1 in der 2. Schleife LED 2 u.s.w.
Wenn gerade Schleife 1 mit LED 1 ausgeführt wird, möchte ich die Schleife per Tastendruck sofort abbrechen und dann mittels anderen Taster etwas anderes auslösen...

Hallo
dann schaue dir am Besten die Konstruktion von Schrittketten an.
Für dein Projekt muss alles blockadefrei programmiert werden, d.h. keine delay´s und alles andere was die loop() bremst.

Also im Prinzip nach der Anleitung?

Ja, oder Du schaust dir die MobaTools und da das Beispiel Zeitgeber_01 an. Da blinken 2 Led's unabhängig voneinander in einem blockadefreien loop.

matze12:
Also im Prinzip nach der Anleitung?

oder eine gut durchdachte Eigenkonstruktion unter der Verwendung von STRUCT- CASE-SWITCH Anweisungen und der millis() Funktion für den oder die Zeitgeber.

OK, daher, dass ich mich leider nicht zu 100% mit c++ auskenne bleibe ich lieber mal mit der einfachen Variante, obwohl ich die millis() Funktion mir auch schon mal angeschaut habe.

Dass das einfacher ist stimmt nicht. Das scheint nur so. Bei einem völlig trivialen Ablauf geht das noch. Aber sobald du mehrere unabhängige LEDs, mehrere Taster oder generell mehrere Sachen hast die hineinarbeitender ablaufen sollen versagen deine Schleifen.

Bei Taster und LED gleichzeitig ist das ja schon der Fall. Wie hast du dir die Zeitsteuerung in deiner Schleife gedacht? Also wie weißt du wie lange die LEDs An oder Aus sind? Sobald du delay() machst geht der Taster nicht mehr. Dann bist du wieder bei millis(). Und statt in einer while()-Schleife kann man das auch gleich richtig machen und loop() verwenden.

Und mit C++ hat das nicht direkt was zu tun. Das ist grundlegende Programmlogik und in jeder Programmiersprache so

Grundsätzlich habe ich mir das so vorgestellt, das wenn ich zb. 3 Taster und 3 LED's habe.
Bei Taste 1 wird LED 1 ausgeführt mit seinen ganzen blinken, heller/dunkler werden etc.
Wenn ich Taste 2 drücke soll alles in einer Schleife für LED 2 ausgeführt werden, bis wieder eine Taste gedrückt wird oder der Strom weggenommen wird.

Die prinzipielle Denkweise ist, dass dein “Programm” nicht darin besteht, dass loop einmal durchlaufen wird. Sondern stattdessen beschreibt, was im jetzigen Zeitpunkt zu tun ist:

  • meist gar nichts
  • manchmal ist so viel Zeit vergangen, dass die Helligkeit um eine Stufe verändert wird
  • wenn ein Taster betätigt ist, solltest du dir das merken und die bisherige Led ausschalten.
    (Sobald der Taster wieder losgelassen ist, läuft dann das neue Programm ab. Das Taster-Entprellen ist so schon mit enthalten. Dass der neue Programm-Start prellenderweise mehrfach versucht wird, sieht man gar nicht)

Wenn du keine while oder for Schleifen hast, brauchst du auch nichts abzubrechen. Das ist viel einfacher als deine bisherige Denkweise :slight_smile: nur anfangs ungewohnt

Grundsätzlich habe ich mir das so vorgestellt, das wenn ich zb. 3 Taster und 3 LED's habe.
Bei Taste 1 wird LED 1 ausgeführt mit seinen ganzen blinken, heller/dunkler werden etc.
Wenn ich Taste 2 drücke soll alles in einer Schleife für LED 2 ausgeführt werden, bis wieder eine Taste gedrückt wird oder der Strom weggenommen wird.

Das hört sich doch gut an!

Dafür braucht es nur eine kleine Sammlung endlicher Automaten.
Tastendruck entprellen
Flanken erkennen
Flanken zählen, und sei es auch nur bis 2, für die Umschaltung
Und dann noch die Automaten/Ablaufsteuerungen für die 3 Lichtspiele.

Das hört sich vielleicht viel an, ist es aber nicht wirklich.
Denn ob 1 fach oder 10 fach macht kaum einen Unterschied, wenn du das schön in Strukturen und Arrays verpackst.

OK, gibt es schon so ähnliche Beispiele? Damit ich mir erstmal das Grundprogramm anschauen kann.

Das Internet ist voll von Beispielen. Gute und schlechte, aber fast alle anders als deine Idee.
Wenn du genügend Beispiele angesehen hast und erkannt hast, was jeweils anders ist, ist viel Zeit vergangen. Ob diese Zeit sinnvoll verplempert wurde, musst wiederum du selbst entscheiden.

Das GrundProgramm ist BlinkWithoutDelay, wobei da “Blink” nur das Beispiel, “WithoutDelay” das Prinzip ist.

Einen Sketch hat man nicht, sondern man macht ihn. Und variiert ihn so oft, bis er wieder uninteressant ist.

matze12:
OK, gibt es schon so ähnliche Beispiele? Damit ich mir erstmal das Grundprogramm anschauen kann.

Ein Beispiel hatte ich Dir doch schon vorgeschlagen

matze12:
OK, gibt es schon so ähnliche Beispiele? Damit ich mir erstmal das Grundprogramm anschauen kann.

Klar, gibts sowas!
Nur ist es bedingt hilfreich.

Eigentlich ist es notwendig die dahinter stehende Idee verstanden zu haben, damit einem das Beispiel überhaupt irgendetwas sagen kann.

Aber gut....

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:

Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
ProtoThreads,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,

Automat (Informatik)
Blink Without Delay
Die Nachtwächter Erklärung

MicroBahner/MobaTools
Intervall Macro
Multitasking Macros
INTERVAL Ersatzstoff
CooperativeTask

Vielen dank

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