DFPlayer Mini kommuniziert nicht mit Arduino

Liebes Forum

Ich habe eine Schaltung erstellt, welche mit einem Arduino Uno und einem DFPlayer Mini einen Ton auf einer SD-Karte abspielen soll, welche sich im DFPlayer befindet.

Das hat auch alles gut funktioniert, doch als ich an der eigentlichen Schaltung etwas rumgetüftelt habe, wurde der Ton nicht mehr abgespielt.

Deshalb habe ich dann diesen Teil von der anderen Schaltung weggenommen, um das Problem etwas einzuschränken. Aber auch bei einem einfachen Code, welcher einmal funktionierte, klappt es nicht.
Genauer gesagt, wird im SM bei dem Code unten "Connecting to DFPlayer Mini failed!" ausgegeben.

Noch wichtig zu wissen ist evtl. dass wenn ich den Ton über dem DFPlayer abspielen lassen will (indem ich den IO_1 Pin kurz mit GND verbinde) dann wird der Ton abgespielt, dass ist jedoch nicht so wie ich es eigentlich gerne haben würde...

Die Pins sind so mit dem Arduino Uno verbunden:

Arduino Uno - DFPlayer Mini

5V - VCC
GND - GND
Pin 10 (TX) - RX (über einen 1kOhm Widerstand)
Pin 11 (RX) - TX
------------------SPK_1 und SPK_2 mit einem 3 W Lautsprecher
image

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

// Use pins 2 and 3 to communicate with DFPlayer Mini
static const uint8_t PIN_MP3_TX = 10; // Connects to module's RX GELB
static const uint8_t PIN_MP3_RX = 11; // Connects to module's TX GRÜN
SoftwareSerial softwareSerial(PIN_MP3_RX, PIN_MP3_TX);

// Create the Player object
DFRobotDFPlayerMini player;

void setup() {

  // Init USB serial port for debugging
  Serial.begin(9600);
  // Init serial port for DFPlayer Mini
  softwareSerial.begin(9600);

  // Start communication with DFPlayer Mini
  if (player.begin(softwareSerial)) {
   Serial.println("OK");

    // Set volume to maximum (0 to 30).
    player.volume(30);
    // Play the first MP3 file on the SD card
    player.play(0001);
  } else {
    Serial.println("Connecting to DFPlayer Mini failed!");
  }   
}

void loop() {
}

Ich hoffe Ihr könnt mir helfen :grinning:
Freundliche Grüsse
Dominic

Hm..
Ich würde mal meinen, das der DF-Player nicht (mehr) seriell kommunizieren will.
Irgendwo mal nen Kurzschluß eines Pin in Richtung 5V gehabt?

Ich sehe momentan keine Chance das Ding wieder zu beleben, wenn der schon beim Init nicht kommt....

1 Like

Schon mal alle Verbindungen, Steckkontakte und Kabel überprüft?
Wenn du mit einem Steckbrett arbeitest, kann schon mal ein Kontakt schlecht sein.

Ok sieht wirklich so aus, da es an einem anderen Arduino funktioniert.

Vielen herzlichen Dank

Dann ist es ja nicht der DFPlayer.
Probier doch einfach mal andere Pins am Arduino zum DFPlayer.

okay ich schaue mal...

weiss nebenbei jemand, wie ich das kurze Störgeräusch vor dem Abspielen des Tones wegbekomme?

Also irgendwie scheint das Problem doch nicht ganz behoben.

Mein Projekt ist eben eine digitale Kuckucksuhr...

Jetzt hatte ich ein Problem, dass ich zu viele Bauteile benötigt habe, für einen Arduino Mega (dieser schaltet mehrere 7-Segmente sowie auch 12 LEDs an) weil ich allerdings noch mehrere Bauteile angeschlossen habe, ist er immer wieder zurückgesetzt worden.

Deshalb habe ich nun noch einen Arduino Uno der Schaltung beigefügt (dieser steuert einen Servo um den Kuckuck herauszufahren und eben den DFPlayer Mini), dieser bekommt jede Stunde ein Signal vom Arduino Mega (Pin 11) zum Uno (Pin 7) dieses Signal wird auch gut übertragen und kommt an, so wie ich es am SM sehe. Dann soll er den Servo auf 180 setzen und den Ton über dem DFPlayer Mini abspielen lassen.

Leider ist es nun eine Lotterie, ob der Ton Tatsächlich abgespielt wird oder eben nicht und am SM die Meldung "Connecting to DFPlayer Mini failed!" erscheint.

Die Schaltung ist gleich wie oben schon beschrieben.

Dies tritt bei diesem Code auf:

#include <Servo.h>
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
Servo myservo;  // create servo object to control a servo

// Use pins 2 and 3 to communicate with DFPlayer Mini
static const uint8_t PIN_MP3_TX = 5;  // Connects to module's RX GELB
static const uint8_t PIN_MP3_RX = 6;  // Connects to module's TX GRÜN
SoftwareSerial softwareSerial(PIN_MP3_RX, PIN_MP3_TX);
//SoftwareSerial mySerial(10, 11); // RX, TX

// Create the Player object
DFRobotDFPlayerMini player;

const int busy = 8;

const int signal = 7;

int signalState = 0;

int busyState = 0;

//char message;

void setup() {

    softwareSerial.begin(9600);

  myservo.attach(9);
  myservo.write(0);

  pinMode(busy, INPUT);
  pinMode(signal, INPUT);


Serial.begin(9600);
//mySerial.begin(9600);
//kuckuck();
  Serial.println("bin start");

}

void loop() {

  /*
  busyState = digitalRead(busy);
  //Serial.println("bin 1");

  if (mySerial.available()){
  //Serial.println("bin 2");

    message = mySerial.read();
    if (message == '1'){
            delay (50);            
            Serial.println("bin 2.3");
            kuckuck();
            Serial.println("bin 2.4");
 // Serial.println("bin 3");
  delay(50);
    }
    else if (message == '0')
    {
  myservo.write(0);
  //Serial.print("n");
  delay(25);
    }
     // Serial.println("bin 4");

  }
  if (busyState == 0){
    myservo.write(180);
    //  Serial.println("bin 5.6");

  }
  else if (busyState == 1) 
  {
    myservo.write(0);   
//  Serial.println("bin 5.7");

      //Serial.print("p");
  }
   // Serial.println("bin 6");

  delay(20);
*/
  
  signalState = digitalRead(signal);
  busyState = digitalRead(busy);

  
if (signalState == 1){
  kuckuck();
  delay(10);
  myservo.write(180);
}
  if (busyState == 0){
    myservo.write(180);
  }
  else if (busyState == 1) 
  {
    myservo.write(0);
  }
  
    Serial.print("busy: ");
  Serial.print(busyState);
  Serial.print("  signal: ");
  Serial.println(signalState);

}

void kuckuck() {
  if (player.begin(softwareSerial)) {
   Serial.println("OK");

    // Set volume to maximum (0 to 30).
    player.volume(20);
    // Play the first MP3 file on the SD card
    player.play(0001);
  } else {
    Serial.println("Connecting to DFPlayer Mini failed!");
  }   
}

Also habe ich mir gedacht, ich prüfe einmal einen einfacheren Code und mit diesem unten passiert folgendes, beim ersten Ton wird er abgespielt, den zweiten spielt er nicht ab und ab dann spielt er wieder alle ab (ich habe jetzt bis 6) gemessen.

#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
/*

#include <Servo.h>
Servo myservo;  // create servo object to control a servo
*/
// Use pins 2 and 3 to communicate with DFPlayer Mini
static const uint8_t PIN_MP3_TX = 5; // Connects to module's RX GELB
static const uint8_t PIN_MP3_RX = 6; // Connects to module's TX GRÜN
SoftwareSerial softwareSerial(PIN_MP3_RX, PIN_MP3_TX);

// Create the Player object
DFRobotDFPlayerMini player;
/*
const int busy = 8;

const int signal = 7;

int signalState = 0;

int busyState = 0;
*/
void setup() {/*
  myservo.attach(9);
  myservo.write(0);*/
  // Init USB serial port for debugging
  Serial.begin(9600);
  // Init serial port for DFPlayer Mini
  softwareSerial.begin(9600);

  
}

void loop() {
  // Start communication with DFPlayer Mini
  if (player.begin(softwareSerial)) {
   Serial.println("OK");

    // Set volume to maximum (0 to 30).
    player.volume(20);
    // Play the first MP3 file on the SD card
    player.play(0001);
  } else {
    Serial.println("Connecting to DFPlayer Mini failed!");
  }   

delay(10000);

}

Weiss jemand, woran das liegen könnte?

Welches Störgeräusch ?
Bei meinen Projekten habe ich keine Störgeräusche.
Ich muss allerdings dazu sagen, dass mein DFPlayer immer eine eigene 5Volt Versorgung (eigener Spannungsregler) bekommt. Damit kann man schon viele Probleme ausschalten.

Eigentlich ist es ein kurzer Lauter Ton, bevor der eigentliche Ton abgespielt wird.

Was für ein Ton ?
Frequenz ?
Oder ist der evtl. mit auf der SD-Card drauf ?

1 Like

Diesen Ton ist wie wenn man einen Klinkenstecker einsteckt dort kommt doch auch ab und an ein kurzer lauter störton und nein er ist nicht auf der SD Karte mitdrauf

Aber hättest du noch einen Lösungsansatz zum anderen Problem?

Ungefähr so klingt es, wie am Anfang kurbzu hören ist.

Ton Störgeräusch

Dazu muss ich tiefer in deinen Sketch einsteigen. Da komme ich heute leider nicht mehr zu.

1 Like

Deine Störgeräusche klingen mir sehr nach einem billigen Servo.
Grüße Uwe

1 Like

Hab mal den DFPlayer an den Arduino mega Angeschlossen und den Servo ausgesteckt, der Störton tritt aber immernoch auf...

Wenn es dir evtl. Hilft, ich habe noch den DFPlayer mini an den Arduino Mega angeschlossen um zu schauen, ob es am Uno liegt.

Jedoch ist es auch bim Mega eine Lotterie, ob der Ton abgespielt wird oder nicht.

Code Mega:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include "Adafruit_LEDBackpack.h"
#include <RTClib.h>  // Hinzufügen der RTC-Bibliothek
//#include <Servo.h>

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

#include <ShiftRegister74HC595.h>
//START eingefügt von slave webby
#define SDI_M 8 //SDI-Leitung für das Monat-Display
#define SCL_M 12 //SCL-Leitung für das Monat-Display
#define LOAD_M 3 //KLOAD-Leitung für das Monat-Display

#define SDI_T 5 //SDI-Leitung für das Tag-Display
#define SCL_T 6 //SCL-Leitung für das Tag-Display
#define LOAD_T 7//KLOAD-Leitung für das Tag-Display

#define SDI_C 33 //SDI-Leitung für das Tag-Display
#define SCL_C 31 //SCL-Leitung für das Tag-Display
#define LOAD_C 29//KLOAD-Leitung für das Tag-Display

//Definition für die Ansteuerung der Zahlen
uint8_t  digits[] = {B11000000, //0
                      B11111001, //1 
                      B10100100, //2
                      B10110000, //3 
                      B10011001, //4
                      B10010010, //5
                      B10000010, //6 
                      B11111000, //7
                      B10000000, //8
                      B10010000, //9
                      B11111111 //10
                     };
//END eingefügt von slave webby

// Use pins 2 and 3 to communicate with DFPlayer Mini
static const uint8_t PIN_MP3_TX = 11;  // Connects to module's RX GELB
static const uint8_t PIN_MP3_RX = 10;  // Connects to module's TX GRÜN
SoftwareSerial softwareSerial(PIN_MP3_RX, PIN_MP3_TX);

// Create the Player object
DFRobotDFPlayerMini player;
Adafruit_7segment matrix = Adafruit_7segment();
//START eingefügt von slave webby
ShiftRegister74HC595 monatDisplay(2, SDI_M, SCL_M, LOAD_M);
ShiftRegister74HC595 tagDisplay(2, SDI_T, SCL_T, LOAD_T);
ShiftRegister74HC595 tmpDisplay(2, SDI_C, SCL_C, LOAD_C);

//END eingefügt von slave webby

int ausZaehler = 0;

const int TMP36 = A0;
const int DegreeAnode = 35;
const int DegreeKathode = 34;

float sensorValue = 0;
int temperature = 0;

int minuten = 0;
int stunden = 0;
int sekunden = 0; 

const int setPin = 22;
const int downPin = 24;
const int upPin = 26;
const int setPinHigh = 23;
const int downPinHigh = 25;
const int upPinHigh = 27;

const int busy = 13;

const int intPin = 2;  //Pin für den Interrupt der RTC

const int led1 = 53;
const int led2 = 52;
const int led3 = 51;
const int led4 = 50;
const int led5 = 49;
const int led6 = 48;
const int led7 = 47;
const int led8 = 46;
const int led9 = 45;
const int led10 = 44;
const int led11 = 43;
const int led12 = 42;

int lastSekAnzeigeF;
int SekAnzeigeF;
int SekAnzeigeZahler = 0;
int minAnzeigeZahler = 0;
int minAnzeigeF;
int StdAnzeigeF;

int ledCounter = 0;
int sekunde = 0;
int lastSekunde = 0;
int fuenfer = 0;

bool blinker = true;

const int VCC = 29;

int second = 0;
int newMillis = 0;

int setCount = 0;
int upCount = 0;
int downCount = 0;

int setPinState = 0;
int upPinState = 0;
int downPinState = 0;

int NewsetPinState = 0;
int NewupPinState = 0;
int NewdownPinState = 0;

int setClock = 0;
int upClock = 0;
int downClock = 0;

int minClock = 0;
int stdClock = 0;
int tagClock = 0;
int monClock = 0;

//const int signal = 11;

int stdClockSchwelle1 = 10;
int stdClockSchwelle2 = 2 * stdClockSchwelle1;

int tagClockSchwelle1 = stdClockSchwelle1;
int tagClockSchwelle2 = 2 * stdClockSchwelle1;

int monClockSchwelle1 = stdClockSchwelle1;
int monClockSchwelle2 = 2 * stdClockSchwelle1;

int minClockSchwelle1 = stdClockSchwelle1;
int minClockSchwelle2 = 2 * stdClockSchwelle1;

int hour = 0;
int lasthour = 0;

int setSchwelle = 30;
int upSchwelle = 2;
int downSchwelle = 2;
//Servo myservo;  // create servo object to control a servo


boolean drawDots = false;
///START eingefügt von slave webby
volatile boolean newTime = false;  //Variable zum Signalisieren, das eine neue Zeit geholt werden muss
int tag = 0; //Variable für den Tag
int mon = 0; //Variable für den Monat
//END eingefügt von slave webby

RTC_DS1307 rtc;  // Erstellen eines RTC-Objekts

void setup() {
  Serial.begin(9600);
  softwareSerial.begin(9600);

  matrix.begin(0x70);

  pinMode(setPin, INPUT_PULLUP);
  pinMode(downPin, INPUT_PULLUP);
  pinMode(upPin, INPUT_PULLUP);
  pinMode(setPinHigh, OUTPUT);
  pinMode(upPinHigh, OUTPUT);
  pinMode(downPinHigh, OUTPUT);
  pinMode(VCC, OUTPUT);
  digitalWrite(VCC, HIGH);

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led8, OUTPUT);
  pinMode(led9, OUTPUT);
  pinMode(led10, OUTPUT);
  pinMode(led11, OUTPUT);
  pinMode(led12, OUTPUT);

//pinMode(signal, OUTPUT);
//digitalWrite(signal, LOW);

  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
  digitalWrite(led6, LOW);
  digitalWrite(led7, LOW);
  digitalWrite(led8, LOW);
  digitalWrite(led9, LOW);
  digitalWrite(led10, LOW);
  digitalWrite(led11, LOW);
  digitalWrite(led12, LOW);

  pinMode(TMP36, INPUT);
  pinMode(DegreeAnode, OUTPUT);
  //myservo.attach(9);
  //myservo.write(0);
  pinMode(busy, INPUT);
  digitalWrite(DegreeAnode, HIGH);

  // Umschreiben der digitalen Pins zu GND-Pins
  digitalWrite(setPinHigh, LOW);
  digitalWrite(downPinHigh, LOW);
  digitalWrite(upPinHigh, LOW);

  rtc.begin();  // RTC initialisieren

  /// START eingefügt von slave webby
  //RTC Interrupt-Pin konfigurieren und Interrupt-Routine festlegen
  rtc.writeSqwPinMode(DS1307_SquareWave1HZ);
  pinMode(intPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(intPin), secInterrupt, FALLING);
  /// END eingefügt von slave webby 

  // Überprüfen, ob das RTC-Modul gestartet wurde
  rtc.adjust(DateTime(rtc.now().year(), rtc.now().month(), rtc.now().day(), rtc.now().hour(), rtc.now().minute(), 0));

  setPinState = digitalRead(setPin);    //int NewsetPinState;
  upPinState = digitalRead(upPin);      //NewupPinState
  downPinState = digitalRead(downPin);  //NewdownPinState
  //Beim Start die RTC lesen und die Zeit anzeigen
//  kuckuck();
  updateTimeVariables();
  tmpLesen();
  tmpAnzeigen();
  Anzeigen();
  tagAnzeigen();
  monAnzeigen();
}

void loop() {
  //  setPinState = digitalRead(setPin);//int NewsetPinState;
  //  upPinState = digitalRead(upPin);//NewupPinState
  //  downPinState = digitalRead(downPin);//NewdownPinState
  NewsetPinState = digitalRead(setPin);
  NewupPinState = digitalRead(upPin);
  NewdownPinState = digitalRead(downPin);

  //Serial.println("bin 1");
  /*
  // SetPin Zustand prüfen und SetZähler hochzählen
  if (NewsetPinState != setPinState) {
    setCount++;
  }
*/


  
  //Checking button 1
  if (NewsetPinState != setPinState){
      setClock++;
      if(setClock > setSchwelle){
        setClock = 0;
        setCount++;
      }
  }
  else{
    setClock = 0;
  }
//Serial.println("bin 2");

NewsetPinState = digitalRead(setPin);
NewupPinState = digitalRead(upPin);
NewdownPinState = digitalRead(downPin);

  // Prüft den Zustand vom SetZähler
  if (setCount == 1 ) { 
    
    if (NewupPinState != upPinState) {
      upClock++;
        if (upClock > upSchwelle){
          upClock = 0;
          minuten++;
          UhrenLogik();


        // RTC-Zeit einstellen
        rtc.adjust(DateTime(rtc.now().year(), rtc.now().month(), rtc.now().day(), rtc.now().hour(), minuten, rtc.now().second()));
        minAnzeigeZahler = rtc.now().minute();

          }
        }
        else{
          upClock = 0;
        }

    if (NewdownPinState != downPinState) {
      downClock++;
        if(downClock > downSchwelle){
          downClock = 0;
           minuten--;
           UhrenLogik();

          // RTC-Zeit einstellen
          rtc.adjust(DateTime(rtc.now().year(), rtc.now().month(), rtc.now().day(), rtc.now().hour(), minuten, rtc.now().second()));
          minAnzeigeZahler = rtc.now().minute();


      }
    }
    else{
      downClock = 0;
    }
  }
// Serial.println("bin 3");


  if (setCount == 2 ) {
    
    if (NewupPinState != upPinState) {
      upClock++;
        if (upClock > upSchwelle){
          upClock = 0;
          stunden++;
          UhrenLogik();


        // RTC-Zeit einstellen
        rtc.adjust(DateTime(rtc.now().year(), rtc.now().month(), rtc.now().day(), stunden, rtc.now().minute(), rtc.now().second()));
        lasthour = stunden;

          }
        }
        else{
          upClock = 0;
        }


    if (NewdownPinState != downPinState) {
      downClock++;
        if(downClock > downSchwelle){
          downClock = 0;
           stunden--;
           UhrenLogik();


          // RTC-Zeit einstellen
          rtc.adjust(DateTime(rtc.now().year(), rtc.now().month(), rtc.now().day(), stunden, rtc.now().minute(), rtc.now().second()));
          lasthour = stunden;
      }
    }
    else{
      downClock = 0;
    }
  }
//Serial.println("bin 4");

  if (setCount == 5) { 
    setCount = 0;
  }



  if (setCount == 3 ) {
    
    if (NewupPinState != upPinState) {
      upClock++;
        if (upClock > upSchwelle){
          upClock = 0;
          mon++;
           monatsLogik();


        // RTC-Zeit einstellen
        rtc.adjust(DateTime(rtc.now().year(), mon, rtc.now().day(), rtc.now().hour(), rtc.now().minute(), rtc.now().second()));
          }
        }
        else{
          upClock = 0;
        }


    if (NewdownPinState != downPinState) {
      downClock++;
        if(downClock > downSchwelle){
          downClock = 0;
           mon--;
           monatsLogik();

          // RTC-Zeit einstellen
        rtc.adjust(DateTime(rtc.now().year(), mon, rtc.now().day(), rtc.now().hour(), rtc.now().minute(), rtc.now().second()));

      }
    }
    else{
      downClock = 0;
    }
  }

  if (setCount == 4 ) {
    
    if (NewupPinState != upPinState) {
      upClock++;
        if (upClock > upSchwelle){
          upClock = 0;
          tag++;
           monatsLogik();


        // RTC-Zeit einstellen
        rtc.adjust(DateTime(rtc.now().year(), rtc.now().month(), tag, rtc.now().hour(), rtc.now().minute(), rtc.now().second()));
          }
        }
        else{
          upClock = 0;
        }


    if (NewdownPinState != downPinState) {
      downClock++;
        if(downClock > downSchwelle){
          downClock = 0;
           tag--;
           monatsLogik();

          // RTC-Zeit einstellen
        rtc.adjust(DateTime(rtc.now().year(), rtc.now().month(), tag, rtc.now().hour(), rtc.now().minute(), rtc.now().second()));

      }
    }
    else{
      downClock = 0;
    }
  }
//Serial.println("bin 4");

  if (setCount == 5) { 
    setCount = 0;
  }
 
//Serial.println("bin 5");
  // Aktualisiere die Zeitwerte
 // updateTimeVariables();
  if(setCount == 0){
  Anzeigen();
  }

  if (setCount == 1){
    stdAnzeigen();
    monAnzeigen();
    tagAnzeigen();
    /*
    if (drawDots){
      minAnzeigen();
    }
    else {
      deleteMinAnzeige();
    }
    */
    minClock++;
    if (minClock <= minClockSchwelle1){
      minAnzeigen();
    }
    if(minClock >= minClockSchwelle1 ) {
      deleteMinAnzeige();
    }
    if (minClock > minClockSchwelle2){
      minClock = 0;
    }
  }
  else {
    minClock = 0;
  }  
 // Serial.println("bin 6");


 if (setCount == 2){
    minAnzeigen();
    monAnzeigen();
    tagAnzeigen();
    /*
    if (drawDots){
      stdAnzeigen();
    }
    else {
      deleteStdAnzeige();
    }
    */
    stdClock++;
    if (stdClock <= stdClockSchwelle1){
      stdAnzeigen();
    }
    if (stdClock >= stdClockSchwelle1) {
      deleteStdAnzeige();
    }
    if (stdClock >= stdClockSchwelle2){
      stdClock = 0;
    }
    
  } 
else {
    stdClock = 0;
    }

 if (setCount == 3){
    stdAnzeigen();
    tagAnzeigen();
    minAnzeigen();
    /*
    if (drawDots){
      monAnzeigen();
    }
    else {
      deleteMonAnzeigen();
    }
    */
    monClock++;
    if (monClock <= monClockSchwelle1){
      monAnzeigen();
    }
    if (monClock >= monClockSchwelle1) {
      deleteMonAnzeigen();
    }
    if (monClock >= monClockSchwelle2){
      monClock = 0;
    }
    
  } 
else {
    monClock = 0;
    }


 if (setCount == 4){
    stdAnzeigen();
    monAnzeigen();
    minAnzeigen();
    /*
    if (drawDots){
      tagAnzeigen();
    }
    else {
      deleteTagAnzeigen();
    }
    */
    tagClock++;
    if (tagClock <= tagClockSchwelle1){
      tagAnzeigen();
    }
    if (tagClock > tagClockSchwelle1) {
      deleteTagAnzeigen();
    }
    if (tagClock >= tagClockSchwelle2){
      tagClock = 0;
    }
    
  } 
else {
    tagClock = 0;
    }


//Serial.println("bin 7");

if (sekunden % 2 == 0) {
    drawDots = false;
  } 
  else {
    drawDots = true;
  }
  matrix.drawColon(drawDots);  // schaltet den Doppelpunkt ein
  matrix.writeDisplay();
  
//Serial.println("bin 8");

//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// prüft ob Mission Kuckuck gestartet werden soll

/*
  // Prüfe, ob eine neue Stunde erreicht wurde
  if (rtc.now().minute() == 0) {
    if(rtc.now().second() == 0){
  if (hour != lasthour){
    lasthour = hour;
    if(hour > 6){
    Serial.println("über if");
    kuckuck(); // Führe die Funktion kuckuck aus
    }
    if(hour == 0){
    Serial.println("über if");
    kuckuck(); // Führe die Funktion kuckuck aus
    }
  }}}
*/

///START eingefügt von slave webby newTime wird einmal pro Sekunde per Interrupt auf true gesetzt, dann werden die Funktionen in dieser if-Abfrage ausgeführt
  if (newTime) {
    sekunden++;
        //displayTimeVariables();
    newTime = false; //newTime wird wieder auf false gesetzt, damit diese Funktionen nicht mehr ausgeführt werden, bis der Interrupt es wieder auf true setzt
  }
  
  if (sekunden == 60){
    sekunden = 0;
    minuten++;
      updateTimeVariables(); //Diese Funktion wird dann einmal am Tagesbeginn aufgerufen
    tmpLesen();
    //Serial.println(temperature);
  }

  if (minuten == 60){
    minuten = 0;
    stunden++;
    }
  
  
  if (stunden == 24){
      stunden = 0;
  }
 
  
      tmpAnzeigen();
    ledSekundenzeiger();  //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  
    //displayAllVariables();
    
  if (sekunden == 0 && minuten == 0){
    if (stunden != lasthour){
    lasthour = stunden;

    if(stunden == 0){
      kuckuck();
      //digitalWrite(signal, HIGH);
    //  Serial.println("1"); 
    delay(50);
    }

    if(stunden > 6){
      kuckuck();
     // Serial.println("1");
      //digitalWrite(signal, HIGH);

    }
    }
    }
    else {
      //digitalWrite(signal, LOW);
     // Serial.println("0");
    }
      
      delay(50);

  ///END eingefügt von slave webby
}
// Ende LOOP-Teil------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/// START eingefügt von slave webby: diese Funktion wird ausgeführt, wenn die RTC einen Sekunden-Interrupt auslöst
void secInterrupt() {
  newTime = true;
}
/// END eingefügt von slave webby

//überprüft die Zustände der Schalter------------------------------------------------------------------------------------------------------------
void checkSwitch() {
  setPinState = digitalRead(setPin);
  upPinState = digitalRead(upPin);
  downPinState = digitalRead(downPin);
}

//START geändert von slave webby: Diese Funktion muss nur im setup und beim Beginn eines neuen Tages aufgrufen werden
void updateTimeVariables() {
  DateTime now = rtc.now();
  delay(100);

  minuten = now.minute();
  stunden = now.hour();
  sekunden = now.second();

  tag = now.day();
  mon = now.month();
}

// Kuckuck sound wird ausgeführt--------------------------------------------------------------------
void kuckuck() {
    
  if (player.begin(softwareSerial)) {
    Serial.println("OK");
    // Set volume to maximum (0 to 30).
    player.volume(20);

    // Play the first MP3 file on the SD card
    player.play(0001);
  }
}

void servoKuckuck(){/*
int busyState = digitalRead(busy);

  if (busyState == LOW){
    myservo.write(180);
    delay(10);
  }
  else{
myservo.write(0);
delay(10);

  }*/

}

void Anzeigen(){
  matrix.writeDigitNum(4, minuten % 10);   // digit ganz rechts

  matrix.writeDigitNum(3, int(minuten / 10));   // digit 2. von rechts

  matrix.drawColon(drawDots);

  matrix.writeDigitNum(1, stunden % 10);   // digit 2. von links

  matrix.writeDigitNum(0, int(stunden / 10));   // digit ganz links

  matrix.writeDisplay();

  int mon2 = mon % 10;
  int mon1 = (mon/10) % 10;
  uint8_t monatsAnzeige[] = {digits[mon2], digits[mon1]};
  monatDisplay.setAll(monatsAnzeige);
  //delay(200);

  int tag2 = tag % 10;
  int tag1 = (tag/10) % 10;

  uint8_t tagAnzeige[] = {digits[tag2], digits[tag1]};
  tagDisplay.setAll(tagAnzeige);
  //delay(200);
}
void minAnzeigen(){
  matrix.writeDigitNum(4, minuten % 10);   // digit ganz rechts

  matrix.writeDigitNum(3, int(minuten / 10));   // digit 2. von rechts

  matrix.drawColon(drawDots);
  matrix.writeDisplay();
}

void stdAnzeigen(){
  matrix.drawColon(drawDots);
    matrix.writeDigitNum(1, stunden % 10);   // digit 2. von links

  matrix.writeDigitNum(0, int(stunden / 10));   // digit ganz links
  matrix.writeDisplay();
}

/*
void zeitAnzeigen() {
  matrix.writeDigitNum(4, minuten % 10);       // digit ganz rechts
  matrix.writeDigitNum(3, int(minuten / 10));  // digit 2. von rechts
  matrix.drawColon(drawDots);
  matrix.writeDigitNum(1, stunden % 10);       // digit 2. von links
  matrix.writeDigitNum(0, int(stunden / 10));  // digit ganz links
  matrix.writeDisplay();
  delay(100);
}
*/   
void tmpLesen(){

 //if (rtc.now().second() == 3){
  sensorValue = analogRead(TMP36);

  temperature = sensorValue * 0.235 - 54.118;
  //}
}
void monAnzeigen(){
  int mon2 = mon % 10;
  int mon1 = (mon/10) % 10;
  uint8_t monatsAnzeige[] = {digits[mon2], digits[mon1]};
  monatDisplay.setAll(monatsAnzeige);
  //delay(200);
}

void tagAnzeigen(){
  int tag2 = tag % 10;
  int tag1 = (tag/10) % 10;

  uint8_t tagAnzeige[] = {digits[tag2], digits[tag1]};
  tagDisplay.setAll(tagAnzeige);
  //delay(200);

}

void tmpAnzeigen(){
  int tmp2 = temperature % 10;
  int tmp1 = (temperature/10) % 10;

  uint8_t tmpAnzeige[] = {digits[tmp2], digits[tmp1]};
  tmpDisplay.setAll(tmpAnzeige);
  //delay(200);

}

void deleteStdAnzeige(){
    matrix.writeDigitRaw(1, 0);
    matrix.writeDigitRaw(0, 0);
    matrix.writeDisplay();
    
}

void deleteMinAnzeige(){
    matrix.writeDigitRaw(4, 0);
    matrix.writeDigitRaw(3, 0);
    matrix.writeDisplay(); 
}

void deleteMonAnzeigen(){
  uint8_t numberToPrint2[] = {digits[10], digits[10]};//wähle das zehnte von uint8_t
  monatDisplay.setAll(numberToPrint2);
}

void deleteTagAnzeigen(){
    uint8_t numberToPrint2[] = {digits[10], digits[10]};//wähle das zehnte von uint8_t
  tagDisplay.setAll(numberToPrint2);

}

void UhrenLogik(){
  if (minuten > 59){
    minuten = 0;
  }
  if (minuten < 0){
    minuten = 59;
  }
  if (stunden > 23){
    stunden = 0;
  }
  if (stunden < 0){
    stunden = 23;
  }
}

void doppelPunkt() {
  Serial.print("DrawDots: ");
  Serial.println(drawDots);
  matrix.drawColon(drawDots);  // schaltet den Doppelpunkt ein
  matrix.writeDisplay();
  //delay(200);
  if(drawDots == true){
    drawDots = false;
  }
  else drawDots = true;
}



void displayAllVariables(){ 
  Serial.print("Second:"); 
  Serial.print(second);  
  Serial.print("  ");
  Serial.print("setCount:"); 
  Serial.print(setCount);  
  Serial.print("  "); 
  Serial.print("upCount:"); 
  Serial.print(upCount);  
  Serial.print("  ");  
  Serial.print("downCount:"); 
  Serial.print(downCount);  
  Serial.print("  ");  
  Serial.print("SetpinState:"); 
  Serial.print(setPinState);  
  Serial.print("  ");  
  Serial.print("UpPinState:"); 
  Serial.print(upPinState);  
  Serial.print("  ");  
  Serial.print("downPinState:"); 
  Serial.print(downPinState);  
  Serial.print("  ");  
  Serial.print("NewsetPinState:"); 
  Serial.print(NewsetPinState);  
  Serial.print("  ");   
  Serial.print("NewUpPinState:"); 
  Serial.print(NewupPinState);  
  Serial.print("  ");   
  Serial.print("NewDownPinState:"); 
  Serial.print(NewdownPinState);  
  Serial.print("  ");   
  Serial.print("setClock:"); 
  Serial.print(setClock);  
  Serial.print("  ");   
  Serial.print("upClock:"); 
  Serial.print(upClock);  
  Serial.print("  ");   
  Serial.print("downClock:"); 
  Serial.print(downClock);  
  Serial.print("  ");   
  Serial.print("minClock:"); 
  Serial.print(minClock);  
  Serial.print("  ");   
  Serial.print("stdClock:"); 
  Serial.print(stdClock);  
  Serial.print("  ");   
  Serial.print("DrawDots:"); 
  Serial.println(drawDots);  
}


void displayTimeVariables() {
  Serial.print("Tag: ");
  Serial.print(rtc.now().day());
  Serial.print(" Monat: ");
  Serial.print(rtc.now().month());
  Serial.print("  Jahr: ");
  Serial.print(rtc.now().year());
  Serial.print(" Stunden: ");
  Serial.print(rtc.now().hour());
  Serial.print(" Minuten: ");
  Serial.print(rtc.now().minute());
  Serial.print(" Sekunden: ");
  Serial.println(sekunden);
}


void ledSekundenzeiger(){


 // sekunde = rtc.now().second();
  /*
  if (sekunde != lastSekunde){  
    lastSekunde = sekunde;

  if (sekunde % 5 == 0){
    ledCounter++;
    if (ledCounter != 12){
      if(sekunde / ledCounter != 5){
      ledCounter--;
  }
  }
  if (ledCounter == 12){
    if (sekunde > 3 && sekunde != 59){
      ledCounter--;
    }
  }
  }
  }


  if (sekunde >= 5 && sekunde < 10){
          //Serial.println("l1"); 
    digitalWrite(led1, HIGH);

  }
  else if (sekunde >= 10 && sekunde < 15){
         // Serial.println("l2"); 
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    
  }
  else if (sekunde >= 15 && sekunde < 20){
        //  Serial.println("l3"); 
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
   
      }
  else if (sekunde >= 20 && sekunde < 25){
         // Serial.println("l4"); 
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    
       }
  else if (sekunde >= 25 && sekunde < 30){
         // Serial.println("l5"); 
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
      
       }
  else if (sekunde >= 30 && sekunde < 35){
      //    Serial.println("l6"); 
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
    digitalWrite(led6, HIGH);
    
       }
  else if (sekunde >= 35 && sekunde < 40){
       //   Serial.println("l7"); 
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
    digitalWrite(led6, HIGH);
    digitalWrite(led7, HIGH);
      
       }
  else if (sekunde >= 40 && sekunde < 45){
        //  Serial.println("l8"); 
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
    digitalWrite(led6, HIGH);
    digitalWrite(led7, HIGH);
    digitalWrite(led8, HIGH);
      
       }
  else if (sekunde >= 45 && sekunde < 50){
        //  Serial.println("l9"); 
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
    digitalWrite(led6, HIGH);
    digitalWrite(led7, HIGH);
    digitalWrite(led8, HIGH);
    digitalWrite(led9, HIGH);
     
       }
  else if (sekunde >= 50 && sekunde < 55){
         // Serial.println("l10"); 
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
    digitalWrite(led6, HIGH);
    digitalWrite(led7, HIGH);
    digitalWrite(led8, HIGH);
    digitalWrite(led9, HIGH);
    digitalWrite(led10, HIGH);
        
       }
  else if (sekunde >= 55 && sekunde < 60){
         // Serial.println("l11"); 

    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
    digitalWrite(led6, HIGH);
    digitalWrite(led7, HIGH);
    digitalWrite(led8, HIGH);
    digitalWrite(led9, HIGH);
    digitalWrite(led10, HIGH);
    digitalWrite(led11, HIGH);
       }
  else if (sekunde >= 0 && sekunde < 2){
      //Serial.println("l12"); 

    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
    digitalWrite(led6, HIGH);
    digitalWrite(led7, HIGH);
    digitalWrite(led8, HIGH);
    digitalWrite(led9, HIGH);
    digitalWrite(led10, HIGH);
    digitalWrite(led11, HIGH);
    digitalWrite(led12, HIGH);    
       }
    
      if (sekunde == 2){
      ledCounter = 0;
      fuenfer = 0;
    }
     if (sekunde >= 2 && sekunde < 5){
       //   Serial.println("l0"); 
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    digitalWrite(led9, LOW);
    digitalWrite(led10, LOW);
    digitalWrite(led11, LOW);
    digitalWrite(led12, LOW); 
    }
    

*/
//Variante nur eine LED------------------------------------------------------------------
  sekunde = rtc.now().second();
  if (sekunde != lastSekunde){  
    lastSekunde = sekunde;
  if (sekunde % 5 == 0){
    ledCounter++;
    if (ledCounter != 12){
      if(sekunde / ledCounter != 5){
      ledCounter--;
  }
  }
  if (ledCounter == 12){
    if (sekunde > 3 && sekunde != 59){
      ledCounter--;
    }
  }
  
  }
  
  }
  if (sekunde % 5 == 0){
  if (ledCounter == 1){
          //Serial.println("l1"); 
    digitalWrite(led1, HIGH);
    
  }
  else if (ledCounter == 2){
         // Serial.println("l2"); 
    digitalWrite(led1, LOW);   
    digitalWrite(led2, HIGH);
    
  }
  else if (ledCounter == 3){
        //  Serial.println("l3"); 

    digitalWrite(led3, HIGH);
        digitalWrite(led2, LOW);

   
      }
  else if (ledCounter == 4){
         // Serial.println("l4"); 

    digitalWrite(led4, HIGH);
        digitalWrite(led3, LOW);

    
       }
  else if (ledCounter == 5){
  //        Serial.println("l5"); 

    digitalWrite(led5, HIGH);
            digitalWrite(led4, LOW);
  
      
       }
  else if (ledCounter == 6){
   //       Serial.println("l6"); 
  
    digitalWrite(led6, HIGH);
            digitalWrite(led5, LOW);
            
    
       }
  else if (ledCounter == 7){
      //    Serial.println("l7"); 

    digitalWrite(led7, HIGH);
       //     digitalWrite(led6, LOW);

      
       }
  else if (ledCounter == 8){
       //   Serial.println("l8"); 
  
    digitalWrite(led8, HIGH);
       //     digitalWrite(led7, LOW);

      
       }
  else if (ledCounter == 9){
  //        Serial.println("l9"); 
  
    digitalWrite(led9, HIGH);
            digitalWrite(led8, LOW);

     
       }
  else if (ledCounter == 10){
      //    Serial.println("l10"); 

    digitalWrite(led10, HIGH);
            digitalWrite(led9, LOW);

        
       }
  else if (ledCounter == 11){
      //    Serial.println("l11"); 

    digitalWrite(led11, HIGH);
            digitalWrite(led10, LOW);

       }
  else if (ledCounter > 11){
    //  Serial.println("l12"); 
              digitalWrite(led11, LOW);


    digitalWrite(led12, HIGH);    
       }
  }
  else if (sekunde % 10 == 2 || sekunde % 10 == 7){
   //Serial.println("alle aus");
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    digitalWrite(led9, LOW);
    digitalWrite(led10, LOW);
    digitalWrite(led11, LOW);
    digitalWrite(led12, LOW); 
  }
    
    if (sekunde == 2){
      ledCounter = 0;
    }

     if (ledCounter == 0){
       //   Serial.println("l0"); 
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led7, LOW);
    digitalWrite(led8, LOW);
    digitalWrite(led9, LOW);
    digitalWrite(led10, LOW);
    digitalWrite(led11, LOW);
    digitalWrite(led12, LOW); 
    }
}

void monatsLogik(){

if (mon > 12){
  mon = 1;
}

if (mon < 0){
  mon = 12;
}


    if (rtc.now().year() % 4 != 0){//kein schaltjahr
        switch (rtc.now().month()){// monate:
          if (tag > 31){
            tag = 1;
          }
          if (tag <= 0){
            tag = 31;
          }
        break;
        case 2:
          if (tag > 29){
            tag = 1;
          }
          if (tag <= 0){
            tag = 29;
          }

        break;
        case 3:
          if (tag > 31){
            tag = 1;
          }
          if (tag <= 0){
            tag = 31;
          }

        break;
        case 4:
          if (tag > 30){
            tag = 1;
          }
          if (tag <= 0){
            tag = 30;
          }

        break;
        case 5:
          if (tag > 31){
            tag = 1;
          }
          if (tag <= 0){
            tag = 31;
          }

        break;
        case 6:
          if (tag > 30){
            tag = 1;
          }
          if (tag <= 0){
            tag = 30;
          }

        break;
        case 7:
          if (tag > 31){
            tag = 1;
          }
          if (tag <= 0){
            tag = 31;
          }

        break;
        case 8:
          if (tag > 31){
            tag = 1;
          }
          if (tag <= 0){
            tag = 31;
          }

        break;
        case 9:
          if (tag > 30){
            tag = 1;
          }
          if (tag <= 0){
            tag = 30;
          }

        break;
        case 10:
          if (tag >= 31){
            tag = 1;
          }
          if (tag < 0){
            tag = 31;
          }

        break;
        case 11:
          if (tag > 30){
            tag = 1;
          }
          if (tag <= 0){
            tag = 30;
          }

        break;
        case 12:
          if (tag > 31){
            tag = 1;
          }
          if (tag <= 0){
            tag = 31;
          }

        break;
  }

  }


  if (rtc.now().year() % 4 == 0){
        switch (rtc.now().month()){// monate:
              if (tag > 31){
            tag = 1;
          }
          if (tag <= 0){
            tag = 31;
          }
        break;
        case 2:
          if (tag > 29){
            tag = 1;
          }
          if (tag <= 0){
            tag = 29;
          }

        break;
        case 3:
          if (tag > 31){
            tag = 1;
          }
          if (tag <= 0){
            tag = 31;
          }

        break;
        case 4:
          if (tag > 30){
            tag = 1;
          }
          if (tag <= 0){
            tag = 30;
          }

        break;
        case 5:
          if (tag > 31){
            tag = 1;
          }
          if (tag <= 0){
            tag = 31;
          }

        break;
        case 6:
          if (tag > 30){
            tag = 1;
          }
          if (tag <= 0){
            tag = 30;
          }

        break;
        case 7:
          if (tag > 31){
            tag = 1;
          }
          if (tag <= 0){
            tag = 31;
          }

        break;
        case 8:
          if (tag > 31){
            tag = 1;
          }
          if (tag <= 0){
            tag = 31;
          }

        break;
        case 9:
          if (tag > 30){
            tag = 1;
          }
          if (tag <= 0){
            tag = 30;
          }

        break;
        case 10:
          if (tag >= 31){
            tag = 1;
          }
          if (tag < 0){
            tag = 31;
          }

        break;
        case 11:
          if (tag > 30){
            tag = 1;
          }
          if (tag <= 0){
            tag = 30;
          }

        break;
        case 12:
          if (tag > 31){
            tag = 1;
          }
          if (tag <= 0){
            tag = 31;
          }

        break;
  }}



}

Code Uno:

#include <Servo.h>
//#include "SoftwareSerial.h"
//#include "DFRobotDFPlayerMini.h"
Servo myservo;  // create servo object to control a servo
/*
// Use pins 2 and 3 to communicate with DFPlayer Mini
static const uint8_t PIN_MP3_TX = 5;  // Connects to module's RX GELB
static const uint8_t PIN_MP3_RX = 6;  // Connects to module's TX GRÜN
SoftwareSerial softwareSerial(PIN_MP3_RX, PIN_MP3_TX);
//SoftwareSerial mySerial(10, 11); // RX, TX
*/
// Create the Player object
//DFRobotDFPlayerMini player;

const int busy = 8;

const int signal = 7;

//int signalState = 0;

//int busyState = 0;

//char message;

void setup() {

    //softwareSerial.begin(9600);

  myservo.attach(9);
  myservo.write(0);

  pinMode(busy, INPUT);
 // pinMode(signal, INPUT);


Serial.begin(9600);
//mySerial.begin(9600);
//kuckuck();
  Serial.println("bin start");

}

void loop() {

  /*
  busyState = digitalRead(busy);
  //Serial.println("bin 1");

  if (mySerial.available()){
  //Serial.println("bin 2");

    message = mySerial.read();
    if (message == '1'){
            delay (50);            
            Serial.println("bin 2.3");
            kuckuck();
            Serial.println("bin 2.4");
 // Serial.println("bin 3");
  delay(50);
    }
    else if (message == '0')
    {
  myservo.write(0);
  //Serial.print("n");
  delay(25);
    }
     // Serial.println("bin 4");

  }
  if (busyState == 0){
    myservo.write(180);
    //  Serial.println("bin 5.6");

  }
  else if (busyState == 1) 
  {
    myservo.write(0);   
//  Serial.println("bin 5.7");

      //Serial.print("p");
  }
   // Serial.println("bin 6");

  delay(20);
*/
  
  //signalState = digitalRead(signal);
  busyState = digitalRead(busy);
/*
  
if (signalState == 1){
  kuckuck();
  delay(10);
  myservo.write(180);
}*/
  if (busyState == 0){
    myservo.write(180);
  }
  else if (busyState == 1) 
  {
    myservo.write(0);
  }
  
    Serial.print("busy: ");
  Serial.print(busyState);
  Serial.print("  signal: ");
  Serial.println(signalState);

}

void kuckuck() {/*
  if (player.begin(softwareSerial)) {
   Serial.println("OK");

    // Set volume to maximum (0 to 30).
    player.volume(20);
    // Play the first MP3 file on the SD card
    player.play(0001);
  } else {
    Serial.println("Connecting to DFPlayer Mini failed!");
  }  */ 
}

Ich habe noch etwas über die Schaltung vom Arduino und dem DFPlayer geschaut und ich habe zwischen RX (DFPlayer) und dem TX (Arduino) keinen 1kOhm Widerstand, könnte das der Problem Auslöser sein.

Ich gehen nämlich ziemlich davon aus, dass es an der UART-Kommunikation zwischen Arduino und DFPlayer liegt...

Ich kann mir nicht vorstellen, dass der fehlende Widerstand für den Störton verantwortlich ist. Der schützt den RX-Pin des Players vor zu hoher Spannung, da der Pin nur 3,3 Volt ab kann. Der Pin kann durch die 5 Volt des Arduino beschädigt werden.

Um den Player ruhig zu bekommen, solltest du mal an eine getrennte Spannung (wie schon geschrieben) für den Player denken.

Was dein Problem mit dem Sketch betrifft, habe ich keinen Fehler erkennen können. Was auf Grund der komplexität des Sketches nichts heißen soll. Da ich keinen Mega und auch keine Schieberegister besitze, kann ich den Sketch auch nicht testen.

Mein Tipp wäre da, an geeigneter Stelle weitere serielle Ausgaben einzubauen, um so dem Problem auf die Schliche zu kommen.
Evtl. haben andere User ja noch Ideen zum Problem.

Aus Erfahrung kann ich sagen, daß ein fehlender Widerstand ein gut hörbares Störgeräusch in den Lautsprecher produziert.

Grüße Uwe

Kann das auch der Grund sein, weswegen es eine Lotterie ist, ob der Ton abgespielt wird oder nicht, oder ist das wohl eher ein anderes Problem.

Und sollte ich einen 1kOhm verwenden.