DFPlayer in bestehenden Sketch einbinden

Hallo Community

Ich versuche gerade ein kleines Projekt zu realisieren, stehe nun jedoch vor einem Problem.
Dieses kann ich leider mit meinem momentanen Wissensstand nicht lösen :frowning:

Das Projekt ist eine Halloween Deko, diese wird über einen PIR aktiviert.
Die gewünschte Funktion wäre LED und Musik einschalten und nach Ablauf des PIR timer (ca. 70-80sec) wieder ausschalten.

Die LEDs sowie der TFPlayer sind soweit verkabelt und programmiert jedoch auf jeweils einem separaten Arduino Nano.

Nun möchte ich natürlich nur einen nutzen und müsste die Codes zusammenfügen und zwar so dass sie
die oben genannten Funktion haben.

Folgende Codes werden verwendet, diese habe ich mir zusammengewürfelt. Ich bin noch am lernen, bitte um Verständnis wenn diese nicht perfekt sind.

#include "Arduino.h"
#include "SoftwareSerial.h"


// Define connection pins:
#define pirPin 2

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.
int ledPin1 = 5;
int ledPin2 = 6;
int ledPin3 = 7;

void setup() {
  
  pinMode(pirPin, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);  

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

void loop() {
  // Read out the pirPin and store as val:
  val = digitalRead(pirPin);

  // If motion is detected (pirPin = HIGH), do the following:
  if (val == HIGH)
 
    analogWrite(ledPin1, random(120)+135);
    analogWrite(ledPin2, random(120)+135);
    analogWrite(ledPin3, random(120)+135);
    delay(random(100));

    // Change the motion state to true (motion detected):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }

  // If no motion is detected (pirPin = LOW), do the following:
  else {
    analogWrite(ledPin1, LOW);
    analogWrite(ledPin2, LOW);
    analogWrite(ledPin3, LOW);
    delay(random(100));
    
 // Change the motion state to false (no motion):
    if (motionState == true) {
      Serial.println("Motion ended!");
      motionState = false;
    }
  }
}
#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:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(17);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
  myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
  myDFPlayer.randomAll();
}

void loop()
{
  static unsigned long timer = millis();

  if (millis() - timer > 3000) {
    timer = millis();
    //myDFPlayer.next();  //Play next mp3 every 3 second.
  }

  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}

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

Alle Versuche die Codes zusammenzufügen sink kläglich gescheitert. Hier der Code, bis zum void loop habe ich es geschafft ohne Fehler, doch hier komme ich ohne Frust nicht weiter da jeder Versuch mit diversen Fehlern quittiert wird >:(

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

// Define connection pins:
#define pirPin 2

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.
int ledPin1 = 5;
int ledPin2 = 6;
int ledPin3 = 7;

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:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(17);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
  myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
  myDFPlayer.randomAll();
  
  pinMode(pirPin, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);  

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

void loop() {
  // Read out the pirPin and store as val:
  val = digitalRead(pirPin);

  // If motion is detected (pirPin = HIGH), do the following:
  if (val == HIGH)
 
    analogWrite(ledPin1, random(120)+135);
    analogWrite(ledPin2, random(120)+135);
    analogWrite(ledPin3, random(120)+135);
    delay(random(100));

    // Change the motion state to true (motion detected):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }

  // If no motion is detected (pirPin = LOW), do the following:
  else {
    analogWrite(ledPin1, LOW);
    analogWrite(ledPin2, LOW);
    analogWrite(ledPin3, LOW);
    delay(random(100));
    
 // Change the motion state to false (no motion):
    if (motionState == true) {
      Serial.println("Motion ended!");
      motionState = false;
    }
  }
}

Werden die Serial Prints eigentlich für die library benötigt? Da ich den Monitor sowie kein Display nutze wären sie für mich eigentlich überflüssig.

Danke schonmal für eure Unterstützung

Gruss Enzo

Hi

Alleine schon im PIR-Sketch fällt mir ein delay() auf - Das MUSST Du auf einen Endlichen Automaten/State-Maschine umstricken.
Die Einzel-Funktionen dürfen KEINE Zeit brauchen.
Wenn Du die Funktion aufrufst, dort aber 'jetzt gerade' Nichts zu tun ist, dann wird die Funktion wieder verlassen.
Wenn doch, wird Was (eine Kleinigkeit, wir dürfen auch beim Arbeiten keine Zeit brauchen) gemacht und dann die Funktion wieder verlassen.

Die Serial.print(9600) sollten dann auch verschwinden, oder um Einiges schneller werden - so braucht jedes Zeichen knapp 1ms Zeit - ein Serial.print("Hallo"); wäre einem delay(5) gleichzusetzen - wenn Du mehr an Text ausgibst, dauert Das auch länger.

Die Fehlermeldungen im Player wird wohl Keiner lesen - wenn der nano am Einsatzort auf Gäste wartet - Da wäre mir ein Blink-Code sinnvoller, daß man auch ohne angesteckten PC vor der haustür erkennen kann, woran der Nano gerade erkrankt ist - z.B. fehlende SD-Karte ... 2x Blinken, Pause ... jupp, Die sitzt nicht richtig.

Wobei ich hier nicht sehe, wie der Player weiterhin bedient wird - wo bin ich falsch?

MfG