Ich habe ein Problem, das ich auf den ersten Blick (und als Neuling bei Arduino) eine perfekte Anwendung für ein Arduino war. Nachdem ich versucht habe und es nicht implementiert habe, bezweifle ich mich selbst!
Einfach - ich muss viele LEDs unabhängig voneinander steuern, von denen viele ihre eigenen individuellen Muster haben - zum Beispiel "5 Sekunden ein - 5 Sekunden aus". "Dauerblitze" - oder Sequenzen wie "2 Blitze, Pause, 1 Blitz". Ohne den Luxus von Fäden stecke ich natürlich ein wenig fest. Seien Sie schön zu hören, ob a) Arduino die beste Wahl ist und b) wenn ja - wie kann ich das machen!
Danke im Voraus :)
Antworten:
Mit einer Plattform wie Arduino ist es sicherlich möglich, mehrere Muster gleichzeitig zu verarbeiten, und es gibt eine Reihe von Möglichkeiten, wie Sie dies tun können.
Eine Methode, die ich in Betracht ziehen würde, ist das Schreiben von Funktionen, die jedes Muster effektiv mathematisch darstellen. Sie würden nur die Gesamtzeit übergeben, die bisher in Ihrem Programm vergangen ist, und es wird die entsprechende Aktion für diesen bestimmten Zeitpunkt ausführen. Es wird sofort danach zurückkehren (keine Verzögerungen oder irgendetwas).
Dazu müssen Sie zunächst wissen, wie lange ein einzelner Zyklus des Musters dauert. Sie können dann den Modulo-Operator verwenden, um herauszufinden, wie weit Sie durch den aktuellen Zyklus sind. Von dort aus müssen Sie lediglich einige
if
Bedingungen festlegen, um zu bestimmen, was zu einem bestimmten Zeitpunkt zu tun ist .So könnte es für Ihr Muster "5 Sekunden ein, 5 Sekunden aus" aussehen:
Zugegeben, ständig anzurufen,
digitalWrite()
wenn Sie es technisch nicht brauchen, ist nicht sehr effizient. Es sollte jedoch keinen Schaden anrichten und ist bei Bedarf recht einfach zu optimieren.Um das obige Beispiel in einer Skizze zu verwenden, müssen Sie es nur aufrufen
loop()
und die Nummer übergeben, von der Sie erhaltenmillis()
. z.B:Andere Muster sind komplexer, folgen jedoch demselben Prinzip. Sie müssten nur geeignete
if
Anweisungen verwenden, um Ihre Logik auszudrücken.Das Wichtigste ist, dass die Funktion einen bestimmten Zeitpunkt darstellt. Das Programm sollte niemals angehalten oder verzögert werden, da sonst die anderen Muster nicht ausgeführt werden können.
Bearbeiten: Timing im ersten Zyklus
Wie in den Kommentaren erwähnt, beginnt der allererste Zyklus an einem zufälligen Punkt. Dies liegt daran , das erste Mal , Sie rufen
millis()
inloop()
, wird es nicht bei 0 beginnen (das Gerät bereits für kurze Zeit in Betrieb gewesen sein, bevorloop()
wird aufgerufen). Bei Bedarf ist es jedoch leicht zu lösen.Sie würden dies tun, indem Sie den
totalTime
Wert um den Wert versetzen, den Sie beim ersten Mal erhalten habenloop()
. Zum Beispiel:quelle
%
Ansatz ist, dass das Timing beim ersten Mal nicht korrekt ist, da es zunächst nur zufällig ist.millis
einmal in der Schleife zu laufen und ihren Wert als Parameter an jede LED-Funktion zu übergeben, jede Funktion als parameterlose zu haben und Millis in jeder auszuführen. Dies würde es jeder Funktion ermöglichen, einen genaueren Wert zu erhalten, der abhängig von der Zeit, die jede Funktion in der Schleife für die Ausführung benötigt, und den Anforderungen an die Timing-Korrektheit der Anwendung wichtig sein kann oder nicht.Arduino ist eine gute Wahl für diese Aufgabe - einfach zu beginnen. Der Schlüssel ist, nicht blockierenden Code zu schreiben. Sie können sich das Beispiel von BlinkWithoutDelay ansehen.
Ich habe einen Vorschlag für Ihre Aufgabe gemacht:
quelle
Ich weiß, dass der Beitrag alt ist, aber ich habe das Beispiel mit dem Array-basierten Ansatz überprüft und meiner Meinung nach:
ergibt immer die zugewiesene Größe (Anzahl der Elemente) des Arrays - in diesem Fall 10. Das Timing wird also erst neu gestartet, wenn Sie das "Ende" des Arrays mit undefinierten Elementen erreicht haben. Für LED "0":
Grüße Tommy
quelle