Asynchrone Funktionsaufrufe in Arduino-Skizze

14

Gibt es in einer Arduino-Skizze eine Möglichkeit, innerhalb der Schleife asynchrone Funktionsaufrufe durchzuführen? Als würde man Anfragen über einen http-Server abhören und sie nicht blockierend verarbeiten .

Jacer Omri
quelle
1
Wenn Sie kein C ++ - Anfänger sind, können Sie sich die Cosa-Bibliothek ansehen ( github.com/mikaelpatel/Cosa ). Es ist eine vollständige Neufassung der Arduino-Bibliothek, um sie zu verbessern: OOP und im Allgemeinen Interrupt-gesteuert. Ich denke, sie unterstützen HTTP, aber ich habe diesen Teil noch nicht überprüft.
jfpoilpret

Antworten:

11

Ja und nein. Du bist ein bisschen vage, was du tun willst. Ich habe dies in ein paar verschiedene Abschnitte unterteilt (hauptsächlich das Lesen von Sensordaten ... es gilt für alles, aber das ist der Kontext, den ich verwende):

Themen

AFAIK alle Arduinos haben nur einen Kern (sie können eine Sache auf einmal tun). Bei den meisten Arduino-Boards wird Hardware-Multithreading nicht unterstützt. Es gibt jedoch Möglichkeiten, Software-Multithreading zu implementieren . Der Ansatz von AsheeshR würde nicht gut für Funktionen funktionieren, die lange Zeit in Anspruch nehmen (dh etwas in einer Bibliothek, das eine Weile dauert oder eine Verzögerung), da es durch diese Anweisungen blockiert würde, aber für kurze Zeit gut funktionieren würde funktioniert wie pinMode(). Die dort aufgelistete Protothreads-Bibliothek könnte diesbezüglich besser sein, aber ich weiß es nicht wirklich.

Es wäre schwierig, dies mit HTTP zu orchestrieren, zumal man es machen muss

Verzögerungen

Eine übliche Methode zum Stehenbleiben einer Skizze ist die Verwendung einer Verzögerung. Dies kann gelöst werden, indem in der Hauptschleife eine if-Anweisung und die millis()Funktion verwendet werden, die eine Zeit zurückgibt (keine Uhrzeit, sondern die Zeit seit dem Start des Arduino). Sie können auch eine Schleife innerhalb der Schleife ausführen, um Sensordaten abzufragen.

Der millis()Ansatz würde nicht gut mit Dingen funktionieren, die dazu führen, dass das gesamte Programm zum Stillstand kommt (dh mehr Verzögerungen oder Schleifen, die merklich länger dauern). Beachten Sie, dass 100 ms IIRC die allgemeine maximale Zeit ist, um eine Benutzeroberfläche nicht verzögert erscheinen zu lassen.

Interrupts

Interrupts sind eine großartige Möglichkeit, Dinge fast asynchron zu halten. Sie führen jedes Mal, wenn sich ein Pin-Status ändert, einen kurzen Code aus (den Sie angeben). Es bricht ab loop()und kehrt dorthin zurück, wo es aufgehört hat, nachdem das " ISR " ausgeführt wurde. Ich habe nicht viel Zeit, um zu erklären, wie das geht, aber eine schnelle Google-Suche wird viele Ergebnisse bringen.


Für Sie ist der Threading-Abschnitt am besten geeignet. Dieses Thema ist ziemlich vage, Sie müssen also mit ein paar Dingen experimentieren und etwas finden, das funktioniert.

Anonymer Pinguin
quelle
3

Ich habe kürzlich einen Code für einen Aufgabenplaner auf dem Spielplatz veröffentlicht. Vielleicht möchten Sie einen Blick darauf werfen, vielleicht können Sie ihn an Ihre Bedürfnisse anpassen.

Der Prozessor des Arduino ist von Natur aus Single-Threaded und kann keine Multitasking-Aufgaben ausführen. Wie bereits erwähnt, gibt es jedoch Möglichkeiten, die Illusion von Multitasking zu erzeugen. Annonomus Penguin traf diese ziemlich gut.

Schauen Sie sich auch TimerOne an (es ist wahrscheinlich besser;)

Aurast
quelle
TimerOne ist eine schlechte Idee, da es nur mit AVR-basierten Arduinos funktioniert. Zum Beispiel funktioniert mein Wemos D1 R1 nicht
Vyachaslav Gerchicov