Nabend zusammen.
Ich sehe den Wald vor lauter Bäumen nicht.
Ich programmiere eine treppenbeleuchtung mit sk6812 pixelstripes.
Über eine IR Fernbedienung stelle ich bestimmte Parameter wie Helligkeit, speed, fadetimes usw ein.
Klappt alles wunderbar.
U.a. starte ich per Tastendruck eine testroutine, die unter Umständen schon mal länger braucht bis sie durchgelaufen ist.
Nun möchte ich per erneuten (oder anderen) Tastendruck die Routine abbrechen und zurück zum "hauptmenü" gelangen.
Die Abfrage der Tasten der Fernbedienung läuft im der void look, alle anderen Funktionen in separaten void, also z.b. wird die Taste PLAY auf der FB gedrückt, wird die Funktion
Void testlauf() aufgerufen, was ja auch klappt, aber die Tastenabfrage ist natürlich so lange deaktiviert, bis die Funktion durchlaufen ist.
Ich habe bereits versucht die tastenabfrage nochmals in die laufende Funktion zu schreiben, aber auch ohne Erfolg.
Hat jemand eine Idee wie ich das realisieren kann?
BONEmedia:
Hat jemand eine Idee wie ich das realisieren kann?
Wenn Du quasi mehrere Dinge gleichzeitig erledigt haben möchtest (wie Testlauf und Tastenabfrage), kannst Du das meiner Erfahrung nach am besten mit einem „endlichen Automat“. Such hier im Forum z. B. nach der „Nachtwächtererklärung“ oder lies, was mir dazu eingefallen ist.
HTH
Gregor
Dieses Thema wurde hier schon mehrfach diskutiert.
Du wirst dein Problem nur lösen können, wenn du für die IR-Fernsteuerung einen weiteren Controller verwendest und mit diesem deine Led-Schleife unterbrichst.
Dazu kannst du einen Arduino Nano, Pro mini oder andere nehmen, oder auch einen ATtiny.
Beispiele für den ATtiny85 findest du im Beitrag "zeigt her eure geilen Projekte" hier im Forum.
Z.B hier.
Da ein Arduino bzw. ein ESP im Arduino-Mode kein Multitasking unterstützt, musst du da etwas "faken". Also z.B. sollte ....
- der IR-Empfänger einen Interrupt auslösen, solbald etwas "reinkommt"
- die empfangenen Kommandos schreibst du in einen Puffer zur späteren Interpretation
- in den Haupt-Loop und in die Methoden, die evtl. länger brauchen, kommen Aufrufe einer Interpreter-Methode, die "mal im Puffer nachsieht", ob es etwas zu tun gibt (ist ein Kommando im Puffer?)
- aus Schleifen bzw. Methoden kommst du bei Bedarf jederzeit mit "exit","break" oder "return" raus ...
Da die SK6812 eine keine getrennten Daten- und Takteingänge haben, werden bei ihnen, wie bei den WS2812, während der Übertragung die Interrupts gesperrt werden.
Deshalb wird ein gemeinsamer Betrieb von IR und Stripe auch mit "tricksen" nicht sauber möglich sein.
Wie Hotsystems bereits schrieb, hatten wir dieses Thema schon oft.
Gruß Tommy
Hi
Vll. sollte man einfach in der Test-Funktion keine stundenlange Schleifen ablaufen lassen, sondern dort eine State-Maschine einsetzen.
Bei JEDEM Aufruf der Funktion wird geschaut, ob bei der Test-Funktion 'gerade jetzt' eine Änderung ansteht - wenn Ja -> Ändern + .show(), wenn Nein -> return.
DAS hat natürlich den Nachteil, daß die Funktion auch verlassen wird, wenn Sie noch gar nicht durchgelaufen ist - Du musst also auch in den anderen Funktionen, Die bislang blockierend arbeiten, prüfen, ob der Testbetrieb derzeit aktiv ist.
Alles in Allem: Baue JEDE Funktion zu einer State-Maschine um.
Solltest Du Deinen Sketch posten (was bei Problemen immer von Vorteil ist), können wir zusammen die FOR und WHILE ausmerzen, damit die Test-Funktion eben immer nur Das macht, was gerade ansteht und dann die Kontrolle wieder an den Rest übergibt - z.B. das Auswerten der Fernbedienung.
Auch wäre interessant, welcher Arduino hier die Arbeiten übernehmen soll.
MfG
@postmaster-ino
Sehr guter Vorschlag
Nur leider wird auch das scheitern, da IRRemote auch mit Interrupts arbeitet und diese sind ja bekanntlich abgeschaltet.
Also bleibt das ohne einen 2. Controller zu verwenden, erfolglos.
Das wurde auch von agmue (ich hoffe hier irre ich mich nicht wieder
) hier schon mehrfach so geschrieben.
Erstmal danke für die vielen Vorschläge 
Aber verstehen tue ich es dennoch nicht 
-
Das Testprogramm läuft nicht ewig, aber schon recht lange da.
Es geht darum das ein zuvor erstelltes Programm im SetUp einmal Ablufen soll.
Das kann aber schon mal bis zu 30-40 Sekunden dauern. Wenn man direkt am
Anfang z.B. einen Fehler entdeckt, ist es nervig sich das Programm dann immer
wieder komplett angucken zu müssen. Daher die "abbrechen" Funktion.
-
Das mit dem zweiten Arduino (welcher auch immer) wäre grundsätzlich nicht das Problem,
aber welchen Unterschied macht es?
Habe ich einen Denkfehler?
void loop
Dort ist die Hauptfunktiuon drin für die Abfrage der FB oder Taster oder was auch immer.
void test
Dort sind mehrere Schleifen, delays, etc, drin, die halt das Testprogramm abspult.
Solange "test" läuft, wird "loop" oder jede andere Funktion nicht unterstützt, das habe ich doch richtig so verstanden. Selbst wenn jetzt von einem anderen Arduino die Auswertung der IR kommen würde, dann wird ja irgendwie (habe ich mich noch nie mit Beschäftigt) ein Befehl vom IR Arduino zum LED Arduino geschickt. Der muß doch auch augewertet werden, dann kann ich das doch auch direkt auf dem Arduino machen.
Oder muß ich tatsächlich in jedem Step der Schleife eine Abfrageroutine bauen die bestimmte Werte ausliest und wenn die zutreffen dann die Schleife abbrechen?
Probleme über Probleme 
BONEmedia:
Solange "test" läuft, wird "loop" oder jede andere Funktion nicht unterstützt,
genau das ist ein Teil des Problems. Das lässt sich durch umstellen auf einen endlichen Automaten beheben.
Das andere Problem ist, dass die IR Geschichte nicht auf demselben uC laufen kann, wie die sk6812 Lib.
Deswegen ein 2. uC, der schickt per i2c oder seriell die Befehle, der Hauptcontroller kann diese dann problemlos auswerten.
BONEmedia:
Oder muß ich tatsächlich in jedem Step der Schleife eine Abfrageroutine bauen die bestimmte Werte ausliest und wenn die zutreffen dann die Schleife abbrechen?
Probleme über Probleme 
Genau dass ist es.
Du musst in der Schleife, die wir nicht kennen, eine Abfrage einbauen, die auf ein Signal vom 2. Controller "wartet". Dieser macht dann deine IR-Auswertung.
Das ist aber kein Problem, nur technisch bedingt etwas aufwändiger.
Bitte packe doch mal deinen Sketch hier rein.
Denn es hört sich wie for schleifen mit delays drin an.
Aber da keiner dein Programm lesen kann, ist dies hier schwierig. Geht es um mehr Power, so kannst du auch den ESP32 nehmen, der hat zwei Cores die du auch mit ein bisschen Code im Arduino nutzen kannst. Dual Core ESP32
Gruß
DerDani