immer wieder lande ich bei dem Punkt, an dem ich mir einen einfach zu programmierenden und zugleich sehr flexiblen (Eintritt, Austritt, Timer,..) endlichen Zustandsautomaten wünsche.
Gibt es so etwas im Arduinouniversum überhaupt?
Wenn ich da jedesmal bei Null anfange, lande ich immer wieder beim setzen globaler Variablen, mit denen ich mich dann spaghetticodemäßig durch's FSM-Chaos wurstel.
also es gibt sehr verschiedene Arten Zustandsautomaten zu programmieren. Verschachtelte Switch Statements, Tabelle, das State Pattern (Buch "Entwurfsmuster").
Vielleicht ist das eine Lektüre für dich, Teile des Buchs gibt es mittlerweile frei als PDF
Der Buchautor ist Entwickler einer eigenen Software, geht aber auch auf andere Ansätze ein. Allerdings sind diese Kapitel nicht im obigen PDF. Über die Software von state-machine.com gab es zumindest hier auch mal einen Eintrag im Arduino Playground. Finde ihn gerade nicht. Bin allerdings bisher nicht so richtig warm damit geworden.
Einen endlichen Zustandsautomaten realisiere ich üblicherweise mittels switch/case. Das habe ich ein paarmal geübt, bis ich nicht mehr darüber nachdenken muß. Und wenn man es dann kann, ist es ganz einfach
Zu Anfang meiner Arduino-Zeit habe ich ein paar Timer-Bibliotheken geladen, aber nutzen tue ich sie nicht.
Es gibt auch INTERVAL mit dem Beispiel Doppelblitzer:
Das switch/case das hier immer verwendet wird es lediglich eine Variante um Zustandsautomaten zu implementieren. Einfach, aber keineswegs am besten
Man kann Funktionen so verknüpfen dass eine Funktion einen Zeiger auf die nächste Funktion zurückgibt. Entweder über void Zeiger oder indem man den Zeiger in ein struct verpackt.
Serenifly:
Das switch/case das hier immer verwendet wird es lediglich eine Variante um Zustandsautomaten zu implementieren. Einfach, aber keineswegs am besten
Jawoll...
Wie immer: Ein Problem und Tausend verschiedene Wege zum Ziel.
Goto!
(Computed Goto)
Ist eine dieser Möglichkeiten.
Und nicht die schlechteste.
(mögen auch andere dabei dicke Backen bekommen)
Gibt es so etwas im Arduinouniversum überhaupt?
Natürlich!
Nahezu alle Arduinoprogramme sind endliche Automaten.
Und das hat nichts damit zu tun, ob der Autor den Begriff überhaupt schon mal gehört hat.
Tipp:
Multitasking und endliche Automaten werden gerne in einen Topf geworfen.
Kommen oft gemeinsam vor, ist aber nicht das gleiche.
Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,
Für FSMs habe ich immer zwei Ansätze je nach Komplexität.
Entweder die schon beschriebene switch/case Konstrukte, oder
Arrays mit Zustandsübergängen und Funktionspointern.
D.h. bewirkt z.B. ein Byte einen Zustandswechsel des Hauptautomaten, so landet man beim nächsten
Byte automatisch in einer anderen Funktion. Statt switch/case wird hier ein Funktionspointer umgesetzt.
Oft auch eine Kombination.
Also Hauptautomat über Funktionspointer und irgentwelche "Subautomaten" über Switch/case.