ESP8266 Befehl startet Subroutine

Hallo zusammen,

ich wüsste jetzt nicht, mit welchen Begriffen ich zu meinem Problem suchen könnte. Folgendes Szenario: Ich stelle über einen Wemos D1 mini einen Webserver bereit, der „Kommandos“ in Form einer Webanfrage bekommen und auswerten kann. Soweit, so gut.

In der Loop des Sketch wird der Webrequest meist entgegen genommen und bezüglich seiner Parameter ausgewertet. Wenn ich jetzt auf Grund eines Parameters eine Funktion starte und diese „endlos“ laufen soll, wie kann dann der Webserver in der Loop einen neuen Befehl empfangen?

Also wie programmiere ich es, dass eine Subroutine (z.B. ein bestimmter Lichteffekt auf einem LED Strip) so lange läuft, bis der nächste Befehl (anderer Lichteffekt) den Webserver erreicht.

Ich hoffe mich verständlich ausgedrückt zu haben. Ansonsten gern nachfragen. Besten Dank, Gruß

Hi

Suche hier im Forum die Nachtwächter-Erklärung. Alternativ wären FSM (fine state machine), Endlicher Automat, Schritt-Kette in die gleiche Richtung.

MfG

Kommt drauf an, wie Deine Subroutine aussieht. Bei einem Lichteffekt dürfte es relativ einfach sein, der wartet ja die meiste Zeit bevor er den nächsten Schritt ausführen kann. Dann kann man entweder in diesen Pausen die Abfrage durchführen, oder die ganze Steuerung in einen Automaten umwandeln, der dann parallel zur Abfrage laufen kann.

das Kommando stellt eine bool Variable auf true.

im Loop fragst du auf die Variable ab, und führst es bei true aus.

Irgendwann musst du halt die Variable wieder auf false setzen, entweder durch Zeitablauf millis()-previousMillis>blabla

oder durch ein neues Kommando vom Webserver

Hallo,

das kann doch nur passieren wenn in Deiner "Subroutine" eine Endlosschleife enthalten ist, und das solltest Du vermeiden. Du musst die "Subroutine ", das ist ja eigendlich eine function, möglichst schnell wieder verlassen und in den loop zurück, und alles was zeitlich verzögert sein soll mit millls() abfragen.

Einfaches Beispiel ein Lauflicht alle 100 ms eine LED weiter

im Loop rufst Du immer die Funktion auf. In der Function fragst Du ab ob die 100 ms um sind, wenn nein dann wieder raus. Wenn ja erhöst du den Index für die LED Position. In einer For schleife stellst Du alle LED dunkel und nur die mit dem Index auf die gewünschte Farbe. Das geht bis hier sehr schnell. Dann machst Du einen LED.show(). Je nach dem wie viele LED Du in dem Streifen hast dauert das dann allerdings etwas. Wenns viele sind klappt das mit den 100ms danneventuell nicht mehr.

Wenn Du das Prinzip verstanden hast kannst du ja jetzt nicht alle LED löschen sondern alle mit zufälligen Farben ansteuern und mit einer längeren veränderlichen Zeit.

Damit hast Du dann für deinen Webserver schon mal zwei veränderliche Prameter, die Zeit wie schnell es gehen soll und die Programm-Nummer.

Damit sind dann Deiner Phantasie eigendlich keine Grenzen mehr gesetzt.

Heinz