Code parallel ausführen arduino(GELÖST!)?
Hallo!
Für alle die das selbe Problem haben: https://pastebin.com/yMtqP03Z
Ich baue aktuell ein Haus mit Licht und Sound. Ich möchte das Licht und den Ton mit einer Fernbedienung steuern, was auch schon funktioniert, habe aber leider 2 Probleme:
1. Ich möchte während ein Lied läuft einen weiteren Befehl senden um z.B. das Licht mit der Fernsteuerung zu schalten.
2. Wenn ein Lied läuft und ich ein anderes mit der Fernbedienung starte, dass das erste abrupt aufhört und das zweite direkt startet.
Ich habe zwar gehört, dass das erste irgendwie über "millis"(?) umgesetzt werden kann, ich bekomme es trotz tutorials aber nicht hin.
Hoffe, dass mir jemand helfen kann und auch wenn ihr nur eine der beiden Lösungen kennt bitte schreiben.
Hier der Code
3 Antworten
Da brauchst Du "multitasking".
Das macht man in dem man einen Hardwaretimer setzt der dann mit bestimmtem Takt eine ISR aufruft (ISR = Interupt Service Routine) aufruft.
In der kannst Du dann z.B. nachgucken ob die Fernbedienung was macht.
Schwierig ist daran natürlich, dass die nur sehr kurz laufen kann und nicht auf irgendwas warten darf - sonst ist alles andere Blockiert und die ISR wird sogar erneut aufgerufen obwohl die noch läuft.
Bei der FB müsste man dann im passenden Takt gucken welches Bit gerade anliegt (IR LED an oder aus) und sich die Bits nacheinander merken. Das ist leider nicht so leicht.
Schau mal hier:
Vielen Dank sieht interessant aus! Ich werde auf jeden Fall schauen dass ich es so zum Laufen bekomm.
Also, erstmal zu Problem 2: Damit der Track stoppt, kannst du folgenden Code einfügen, bevor ein neuer Song gespielt wird:
mp3.stop();
Wenn ich das jetzt richtig verstehe, empfängt der arduino keine signale, während ein Lied läuft? Das heißt quasi der Arduino wartet, bis die Funktion playTrackNumber() fertig ist und führt erst dann einen neuen loop aus?
Welchen Arduino hast du?
Die meisten Arduinos haben nur einen Prozessorkern, und können daher immer nur eine Sache gleichzeitig machen. (Funktion 1 -> Funktion 2 -> Funktion 3)
Egal wie wir es drehen oder wenden, sobald einmal die playtracknumber Funktion aufgerufen wird, wartet der Arduino, bis die Funktion fertig ist, und kann danach erst wieder eine andere Funktion ausführen, zum Beispiel ein Signal empfangen. Auch mit Multitasking können wir das nicht beheben, einfach aus dem Grund, weil die Funktion so lange zum Ausführen braucht.
Mir fallen zwei Lösungen ein:
Einfache Lösung: Zweiten Arduino und ir Empfänger kaufen, Fernbedienung kann ja für beide verwendet werden.
Schwieriger: Eine andere Bibliothek für das Abspielen von Songs suchen, wobei ich nicht glaube, dass es eine gibt, die dieses Problem nicht hat
Ich schau mal wegen der Bibliothek weil zwischen Lautsprecher und arduino hängt noch so ein Audiomodul und das kann songs ja auch selbständig abspielen also hab ich eigentlich gedacht dass das arduino sozusagen ein start signal sendet und dann das Modul den Rest übernimmt.
Ich habe übrigens ein original Arduino
Wenn der arduino nur das startsignal sendet das wäre natürlich perfekt.
Super, das freut mich zu hören. Könntest du vielleicht noch die funktionierende Version hochstellen (Du kannst es auch einfach auf https://pastebin.com/ hochladen und den Link reinstellen) Dann wissen andere mit einem ähnlichen Problem, wie sie das beheben können.
Müsste man den Code sehen ansich eher schwierig umzusetzen mit einem Arduino. Muss man halt darauf achten wie du selbst sagst mit millis arbeiten anstatt delay und non blocking Code verwenden.
Welchen Code meinst du also das was bei mir nicht funktioniert
Genau er bleibt sozusagen bei "playtracknumber" stehen und wartet bis der Song zuende ist.