ich habe eine adressierbare LED (SK6812) die während meines umfangreichen Setups den Status über verschiedene Farben darstellen soll. Einige von den Routinen im Setup können bis zu 5 Sekunden dauern. Somit möchte ich nicht nur einen einfachen Farbwechsel, sondern insbesondere auch Pulsendes Licht (Blinken).
Delays kann ich nicht nehmen, da sie den Code unterbrechen und auch Millis würde nicht parallel zum Setup laufen.
In VB.NET gibt es einen sogenannten BackgroundWorker.. gibt es sowas auch im Umfeld der Arduino Syntax?
Hat vielleicht jemand schon einen Code Schnipsel für die Aufgabe ?
Optimalerweise habe ich einen void FeedbackStatus(Mode as Integer, Color as Color) den ich nur bei Zustandsänderung einmal Aufrufe und im Falle des Modus „Blinken“ dieses parallel zum Code ausgeführt wird.
HotSystems:
Aus meiner Sicht kann das im Setup nicht funktionieren, da hier noch keine Loop am werkeln ist.
Wenn ich den OP richtig verstehe, geht es darum, verschiedene „setup()-Stadien“ darzustellen, also ungefähr „wo der µC gerade ackert“. Ob es dazu wirklich blinken muss stelle ich mal infrage.
wenn da auch z.b. ein while (!IrgendwasVerbundenStatus) drinnen ist, dann kannst du natürlich auch innerhalb dieser Schleife "blinken"
Ansonsten zum Mitverfolgen wenn schon RGB Leds im Einsatz sind - einfach mit unterschiedlichen Farben arbeiten, dann weist auch sehr genau wo dein Setup gerade ist ...
gregorss:
Wenn ich den OP richtig verstehe, geht es darum, verschiedene „setup()-Stadien“ darzustellen, also ungefähr „wo der µC gerade ackert“. Ob es dazu wirklich blinken muss stelle ich mal infrage.
Ich habe mir abgewöhnt, Wünsche von Fragestellern "in Frage" zu stellen.
Hier wir Blinken gewünscht und das geht nur mit einer Schleife.
Und da hat noiasca ja die "while" reingeworfen, die wohl auch funktioniert aber die versuche zu vermeiden.
Dann lege ich lieber alles in die loop und durchlaufe das beim Start einmalig.
Das Blinken ist schon feste Zielvorgabe. Ein reines anzeigen der Farbe reicht mir leider nicht die Problematik mit dem fehlenden Loop im Setup stimmt, aber mein Problem besteht auch im Loop, da keine asynchronen Funktionen möglich sind. Bin mir nicht sicher ob das der richtige Fachausdruck ist.
Meine Setup-Funktionen bedienen sich leider keiner Schleifen, sonst wäre das Blinken nicht schwer.
Sollte der Begriff Asyncrone Funktion fehl am Platz sein, hier nochmal anders beschrieben.
Natürlich kann die MCU nur iterativ den Quellcode durcharbeiten, heißt eins nach dem anderen. Aber in JavaScript oder Visual Basic z.B wäre es ohne weiteres möglich eine Funktion „neben“ meinem Setup laufen zu lassen, die den LED Pin jede Sekunde auf high bzw. Low zieht, bzw. das entsprechende Signal schickt. Hört sich aber an, als sei das doch nicht so leicht
Sollte der Begriff Asyncrone Funktion fehl am Platz sein,
Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,
also im loop - jetzt siehst dir bitte mal dringen das Beispiel "BlinkWithoutDelay" an. (!)
und wenn du das nun immer noch im setup auch willst, dann ergänze mal in deinen Sketch mit Kommentaren, welche Blinkfrequenz in welchem Abschnitt sein soll und stell das mal in code - tags hier rein.
Der liebe agmue wird's schon machen wenns irgendwie sinnvoll möglich ist
combie:
Meine Standardantwort zu Ablaufsteuerungen:
Schön, dass Du schon wach bist. An Dein Makro dachte ich gerade, als ich nochmal gelesen habe, worum es genau geht. Ich kenne Dein Makro nicht und habe grad auch null Hirn, um das wirklich verstehen zu können. Nur eine kurze Zwischenfrage hierzu: Arbeitest Du da mit Interrupts?
INTERVAL.h geht im setup() nicht, da nur ein Durchgang da ist.
Lösungsvorschlag:
Bau dir eine state machine mit den Zuständen setupp und loopp in den loop. Wenn du dann im Setupp alles abgekaspert hast, was du tun musst, schaltest du die Led auf Ok und setzt die state Variable auf loopp.
In der setupp musst du die Aufgaben auch in state machine packen, so dass immer nur kurz was gemacht wird. Sonst blinkt es nämlich nicht. Wenn du das alles richtig gemacht hast, siehst du am Nichtblinken, das beim setupp was schief gelaufen ist.
ElEspanol: @Uwe: wenn der setup Teil im loop nur einmal abgearbeitet wird, blinkt da auch nicht viel, und macht zum normalen setup() keinen Unterschied
Da hast Du mich falsch verstanden.
Der Loop ist und bleibt eine Schleife nur daß am Anfang nach dem Einschalten ein bestimmter Codeteil abgearbeitet wird der ruhig zig Schleifendurchgänge dauern kann und nicht blockierend ist und danach eimal abgearbeitet nicht mehr ausgeführt wird und stattdessen der Hautpteil des Sketches ausgeführt wird. Einfach ein endlicher Automat.
zB:
loop(){
Tastatureinlesen;
LEDansteuerung
andere Ausgaben
if (start == 0)
{setup
if (setup fertig) start =1;
}
else
{Hauptteil }
}
Wie ich Das verstehe, braucht die setup()-Funktion eben diese x Sekunden (kA, ins WiFi einloggen, Google kontaktieren, Brötchen beim Bäcker bestellen, ...) und in dieser Zeit hätte der TO gerne, daß die LED blinkt.
Da die bremsenden Aufrufe wohl genauso blockierend, wie lang sind, sehe ich hier nur eine Timer-ISR.
Allerdings scheut es mich davor, in dieser ISR den Stripe mit Daten versorgen zu wollen.
In die Richtung hatte combie(?) ja schon geschrieben, daß eine ISR eigentlich 'so schlank wie möglich' zu bleiben hat.
Aber selbst, wenn diese Aufrufe in eine State-Maschine in loop kommen, sind Diese immer noch blockierend - Da blinkt dann auch Nichts, da diese '5 Sekunden' eben kein loop()-Durchlauf vorhanden ist.
... reine Interpretation ...
MfG
PS: Wenn man eine 'ganz normale LED' nimmt? Die könnte man in der Timer-ISR mit einer Hand voll Befehle blinken lassen.
(in ASM mit genau Einem, wenn der Timer nicht weiter runter geteilt werden soll)