Einen Loop zeitlich begrenzen

Die loop begrenzen ist sicher keine gute Idee.
Die sollte immer durchlaufen und dann lässt du millis() mitzählen und schaltest das Geflacker aus.
Per Taster kannst du es dann bei Bedarf wieder einschalten.
Und nach der gewünschten Zeit schaltet es wieder aus.

Den Loop möchte ich gerne zeitlich begrenzen, also z.B. auf eine Dauer von 2 Minuten.
Ich weiß aber nicht, wie das geht.
Kann mir hier jemand behilflich sein?

Klar!

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:

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

Blink Without Delay
Der Wachmann

Multitasking Macros
Intervall Macro

Den Loop möchte ich gerne zeitlich begrenzen, also z.B. auf eine Dauer von 2 Minuten.

void loop() {
  if (millis() > 2*60*1000L) return;  // nach 2 Minuten nichts mehr machen. 
...
}

reagiert dann nur noch auf Reset

Normalerweise nimmt man statt eines Absolutwerts millis() immer eine Differenz (millis ( ) - startzeit) und macht doch noch ein bisschen mehr als nichts, nach Ablauf der Zeit.

Hallo zusammen,

vielen Dank für eure Antworten!

Ich habe mich anscheinend zu ungenau ausgedrückt. Sorry!

Daher möchte ich präziser beschreiben, was ich eigentlich möchte:

Ich möchte das Programm für das Wohnzimmer eines Hauses auf meiner Modellbahn nutzen und dabei den folgenden Ablauf simulieren:

Wenn das Wohnzimmer "betreten wird", soll die Wohnzimmer-Lampe (eine separate weiße LED) an gehen, 20 Sekunden später soll die im Sketch dargestellte TV-Simulation starten, diese soll für eine bestimmte Zeit laufen (die erwähnten 2 Minuten), dann TV-Simulation aus und 20 Sekunden später soll auch die weiße LED aus gehen (Wohnzimmer wird verlassen).

Es wäre super nett, wenn ihr mir Programmzeilen schreiben könntet. Sowas wie Endlicher Automat,
State Machine, Multitasking, Coroutinen, Ablaufsteuerung ... sagen mir überhaupt nichts!

DANKE!

Die von Dir noch nicht beantwortete Frage lautete: Wodurch soll der Ablauf (dann wieder) gestartet werden?

Gruß Tommy

Es wäre super nett, wenn ihr mir Programmzeilen schreiben könntet.

Ich nenne das mal vorsichtig: Überzogene Erwartungshaltung.

Sowas wie Endlicher Automat, State Machine, Multitasking, Coroutinen, Ablaufsteuerung ... sagen mir überhaupt nichts!

Das kannst du ändern.

@Tommy, ich habe mir so gedacht, ich würde anschließend in anderen Räumen die Lichter in unterschiedlichen Zeitabständen an und ausschalten lassen, um dann den von mir beschriebenen Ablauf im Wohnzimmer erneut zu starten.

Also damit ich das jetzt richtig verstehe:

  • Reset des Arduinos
  • Wohnzimmerlampe geht an
  • 20 Sekunden Wartezeit
  • Geflacker startet
  • 2 Minuten Geflacker
  • Geflacker geht aus
  • 20 Sekunden Wartezeit
  • Wohnzimmerlampe geht aus
  • bis zum nächsten Reset warten

Stimmt das so oder habe ich das falsch verstanden?

Also 2 bis 8 definitiv ja.
Ob das mit dem Reset so sein muss, das kann ich nicht sagen (fehlende Kenntnisse :confused:)

Einfacher wäre:
9. 5 Minuten warten, dann weiter bei 2.

Dann kann man das ewig laufen lassen.

Hallo,

weil Weihnachten ist lauffähig abgeändert. :slight_smile:
Pins und Zeiten kannste selbst für dich korrigieren.
Das Einzigste was blockiert ist die for Schleife in der simulation_TV() aber das stört hier nicht.
Dadurch läuft die TV Simu noch einmal komplett durch wenn die TV EIN-Zeit vorher knapp "verpasst" wurde.
Sollte hier auch egal sein. Die Dauer eines TV Simulationsdurchlaufes kannste ausrechnen.

Ist zu lang zum einbetten.

pussy123_flackern_RGB_LED.ino (9.17 KB)

Guten Morgen Doc-Arduino,
vielen, vielen Dank für den Sketch. Läuft super. Spiele jetzt mit den Zeiten rum.
Demnächst versuche ich weitere LEDs mit unterschiedlichen Ein- und Aus-Zeiten zu implementieren.
Werde mich sicherlich noch mal melden :smiley:
Vielen Dank auch an alle anderen.
Wünsche noch einen angenehmen 2. Weihnachtstag.

Hallo,

genau spiele rum, lerne zu verstehen was im Sketch alles wie passiert. Am Bestern wäre wenn du den Sketch irgendwann komplett lesen kannst. Dann haste viel gewonnen.

@ noiasca: :grin:

Kleine Idee: Verändere doch den Sketch so, dass das Flackern nicht immer gleich ist, sondern zufällig generiert. 1. ist es dann etwas realistischer, da ja nicht immer das gleiche Programm im Fernsehen läuft und 2. musst du dann nicht dieses KByte oder wie viel das ist für das Speichern der Werte im Array draufgehen lassen.

Hallo,

wir machen noch eine kleine Schönheitsänderung.
Das RGB ausschalten am Ende der simulation_TV Funktion nehmen wir raus.
Das schreiben wir in den case Zweig TV_Simu rein. Das 3x digitalWrite meine ich.

case TV_SIMU: if ( verzoegerung(10000, letzte_zeit) ) {  // 10 Sekunden
                   letzte_zeit = millis();
                   digitalWrite(redPin, LOW);
                   digitalWrite(greenPin, LOW);
                   digitalWrite(bluePin, LOW);
                   Serial.println("TV Simulation aus ... Pause 2"); 
                   zustand = PAUSE_ZWEI;
                 }
                 else {
                  zustand = TV_EIN;
                 }
                 break;

Das bewirkt das Endgültige aus erst beim Zustandswechsel zur nächsten Pause. Damit kannste nahtlos wiederholende Lichteffekte erstellen ohne das nach Durchlaufende der TV zwangsweise kurz ausgeht.

hallo ich habe auch soetwas vor, habe aber keinen plan von dem Programmtext. könnte mir jemand grob erklären, was dort passiert

Was wo passiert ?

Und was genau hast du vor ?

@rothe_jakob
Lies Dir die 17 Posts über Dir durch, dann sollte ungefähr die Lösung, Die für pussy123 ersonnen wurde, auch Deine sein.
Solltre sich Dein Problem von Diesem hier unterscheiden, eröffne bitte einen eigenen Thread mit aussagekräftigem Titel und gib und sämtliche Informationen über Deinen Sketch nebst Hardware, Die wir zur Lösung brauchen werden.

MfG

Hallo

Selber: Hallo!