DFPlayer mit Nano Every ansteuern

Servus, ich habe ein Problem mit dem Nano Every. Ich möchte den DFPlayer über den Nano Every steuern, doch leider baut er keine verbindung zum Modul auf. Mit einem UNO Funktioniert es Problem los nur mit dem Nano Every nicht.

Ich habe gelesen das der Chip ATMEGA4809 vom Nano Every anscheinend zu schnell für den DFPlayer ist und er nicht hinterher kommt. Stimmt das?
Wenn ja, gibt es eine Lösung das zu beheben?

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

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

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  
  Serial.println();
  Serial.println(F("DFPlayer Mini Bahnhof"));
  Serial.println(F("Initialisiere DFPlayer ... (Bitte warten! Kann bis zu 5 Sekunden dauern)"));
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("MP3 Player nicht ereichbar:"));
    Serial.println(F("1.Bitte überprüfen Sie die Verbindung!"));
    Serial.println(F("2.Prüfen sie ob eine SD-Karte eingelegt ist!"));
    Serial.println(F("3.Prüfen sie ob RX und TX richtig angeschlossen ist!"));
    Serial.println(F("4.Prüfen sie die Spannungsversorgung auf 5V!"));
    Serial.println(F("Danach bitte Reset drücken!"));
    while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.volume(25);  //Set volume value. From 0 to 30
  myDFPlayer.play(2);  //Play the first mp3
}
 
void loop()
{
  static unsigned long timer = millis();
  
  if (millis() - timer > 200000) {
    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("Auszeit!"));
      break;
    case WrongStack:
      Serial.println(F("Stapel falsch!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Karte eingelegt!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Karte entfernt!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Karte Online!"));
      break;
    case DFPlayerUSBInserted:
      Serial.println("USB Eingefügt!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB entfernt!");
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Nummer:"));
      Serial.print(value);
      Serial.println(F(" Spielen beendet!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Karte nicht gefunden"));
          break;
        case Sleeping:
          Serial.println(F("Schlafen"));
          break;
        case SerialWrongStack:
          Serial.println(F("Holen Sie sich den falschen Stapel"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Prüfsumme stimmt nicht überein"));
          break;
        case FileIndexOut:
          Serial.println(F("Datei Index außerhalb der Grenzen"));
          break;
        case FileMismatch:
          Serial.println(F("Datei nicht auffindbar"));
          break;
        case Advertise:
          Serial.println(F("In Werbung"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
  
}

Probier statt der SoftwareSerial doch die Hardware Serial1, mit der der Every ausgestattet ist. Sollte damit gehen.. (Pins D0 & D1)

Oh man, das ärgert mich jetzt das ich da nicht selbst draufgekommen bin. Danke dir!
Mit einem delay(20) funktioniert das jetzt problemlos.

Hier nochmal der Code zu Vollständigkeit, falls andere auch mal das Problem haben.

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

DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
  delay(20);
  Serial.println();
  Serial.println(F("DFPlayer Mini Bahnhof"));
  Serial.println(F("Initialisiere DFPlayer ... (Bitte warten! Kann bis zu 5 Sekunden dauern)"));
  
  if (!myDFPlayer.begin(Serial1)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("MP3 Player nicht ereichbar:"));
    Serial.println(F("1.Bitte überprüfen Sie die Verbindung!"));
    Serial.println(F("2.Prüfen sie ob eine SD-Karte eingelegt ist!"));
    Serial.println(F("3.Prüfen sie ob RX und TX richtig angeschlossen ist!"));
    Serial.println(F("4.Prüfen sie die Spannungsversorgung auf 5V!"));
    Serial.println(F("Danach bitte Reset drücken!"));
    while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.volume(25);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}
 
void loop()
{
  static unsigned long timer = millis();
  
  if (millis() - timer > 200000) {
    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("Auszeit!"));
      break;
    case WrongStack:
      Serial.println(F("Stapel falsch!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Karte eingelegt!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Karte entfernt!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Karte Online!"));
      break;
    case DFPlayerUSBInserted:
      Serial.println("USB Eingefügt!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB entfernt!");
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Nummer:"));
      Serial.print(value);
      Serial.println(F(" Spielen beendet!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Karte nicht gefunden"));
          break;
        case Sleeping:
          Serial.println(F("Schlafen"));
          break;
        case SerialWrongStack:
          Serial.println(F("Holen Sie sich den falschen Stapel"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Prüfsumme stimmt nicht überein"));
          break;
        case FileIndexOut:
          Serial.println(F("Datei Index außerhalb der Grenzen"));
          break;
        case FileMismatch:
          Serial.println(F("Datei nicht auffindbar"));
          break;
        case Advertise:
          Serial.println(F("In Werbung"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
  
}

Der Kommentar verwirrt mich - und das while(true) weiter unten auch. Da nehme ich an, dass es der Compiler wegoptimiert, sonst würdest Du ja nie was hören können.

Vorher schreibt er noch "... bitte Reset drücken!"
Passiert nur im Fehlerfall und soll dann absichtlich nicht weitergehen.

Ah ja stimmt. Habe ich übersehen.

Brauche ich das Überhaubt?
Bruche ich doch nur für den ESP oder?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.