Arduino - Musik abspielen und gleichzeitig LEDs steuern?
In meinem Projekt möchte ich mit einem Elegoo Uno R3 einen mini DVPlayer von AZDelivery (MP3-Player auf kleiner Platine) bedienen und einen Song abspielen.
Gleichzeitig sollen zwei LEDs nach einem Muster blinken.
Ist soviel Multitasking mit irgendeinem Workaround möglich?
Hier der Code, wie müsste ich das mit den LEDs einpflegen?
/***************************************************
DFPlayer - A Mini MP3 Player For Arduino
<https://www.dfrobot.com/product-1121.html>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
void setup()
{
mySoftwareSerial.begin(9600);
Serial.begin(115200);
Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
Serial.println(F("Unable to begin:"));
while(true){
delay(0); // Code to compatible with ESP8266 watch dog.
}
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.volume(30); // Set volume 0-30
myDFPlayer.play(1); //Play first mp3
}
void loop()
{
static unsigned long timer = millis();
if (millis() - timer > 3000) {
timer = millis();
// myDFPlayer.next(); //Play next mp3 eve
}
if (myDFPlayer.available()) {
printDetail(myDFPlayer.readType(), myDFPlayer.read());
}
}
void printDetail(uint8_t type, int value){
switch (type) {
case TimeOut:
Serial.println(F("Time Out!"));
break;
case WrongStack:
Serial.println(F("Stack Wrong!"));
break;
case DFPlayerCardInserted:
Serial.println(F("Card Inserted!"));
break;
case DFPlayerCardRemoved:
Serial.println(F("Card Removed!"));
break;
case DFPlayerCardOnline:
Serial.println(F("Card Online!"));
break;
case DFPlayerPlayFinished:
Serial.print(F("Number:"));
Serial.print(value);
Serial.println(F(" Play Finished!"));
break;
case DFPlayerError:
Serial.print(F("DFPlayerError:"));
switch (value) {
case Busy:
Serial.println(F("Card not found"));
break;
case Sleeping:
Serial.println(F("Sleeping"));
break;
case SerialWrongStack:
Serial.println(F("Get Wrong Stack"));
break;
case CheckSumNotMatch:
Serial.println(F("Check Sum Not Match"));
break;
case FileIndexOut:
Serial.println(F("File Index Out of Bound"));
break;
case FileMismatch:
Serial.println(F("Cannot Find File"));
break;
case Advertise:
Serial.println(F("In Advertise"));
break;
default:
break;
}
break;
default:
break;
}
}
1 Antwort
Wie auf einfachen Mikrocontrollern üblich kann man ein rudimentäres Multitasking mit Hilfe der eingebauten Timer erreichen. Die lösen in den programmierten Abständen Interrupts aus, von denen du eigene Funktionen aufrufen lassen kannst ("Interrupt Service Routine").
Zu dem Thema gibt's wie beim Arduino gewohnt zig Tutorials im Netz, hier ein schnell ergoogletes: https://www.aranacorp.com/en/using-the-arduino-timers/
Alternativ kannst du auch in deiner Loop-Funktion die Millisekunden zählen und entsprechend blinken, aber das wird recht schnell unübersichtlich. Geht auch nur, wenn da drin nichts länger blockiert.