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;
  }
}


Arduino, Arduino Uno, Elegoo
ESP8266 mit OLED Display?

Ich habe ein ESP8266 Developer Board, und möchte damit ein OLED-Display steuern (.94", 128x64px).

Ich finde nur Tutorials für Displays mit einem I2C-Protokoll, da hat das Display die Pins GND, VCC, SCL und SDA. Ich habe die Pins GND, VDD, SCK und SDA.

Laut meiner Recherche ist das ein SPI-Protokoll. Wenn ich dafür nach Tutorials suche, finde ich nur welche für Displays mit 6 Pins.

Mein Code (von einem I2C Tutorial) benutzt die Adafruit SDD1306 Library, keine Ahnung ob die nur mit I2C oder auch mit ISP funktioniert.

Wenn ich mit einem I2C Scanner die Screen Address suche, findet es das Display nicht.

Meine Schaltung:

OLED GND --> Chip GND

OLED VDD --> Chip 3V3

OLED SCK --> Digital IO 1

OLED SDA --> Digital IO 2

Kann ich einfach die ISP Adresse in den Code einfügen, und wenn ja wie finde ich diese? Oder brauch ich ganz anderen Code / Schaltung?

Code:

 #include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels


// Declaration for SSD1306 display connected using I2C
#define OLED_RESET     -1 // Reset pin
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


void setup() {
  Serial.begin(9600);
  display.clearDisplay(); //Clear
  
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,28);
  display.println("Hello world!");
  display.display();
  delay(2000);
}


void loop() {
  delay(1000);
}

Display (Ich weiß dass die Schutzfolie noch drauf ist):

Bild zum Beitrag
Display, Technik, programmieren, Arduino, ISP, ESP8266

Meistgelesene Beiträge zum Thema Arduino