Frage, DfPlayer mini anzahl Ordner auslesen

Hat jemand eine Ahnung, ob der dfPlayer die Anzahl der Ordner auf der sdKarte auslesen kann? Ich würde gerne eine Funktion in den Code einarbeiten, die verhindert, dass der dfPlayer versucht auf einen nicht vorhandenen Ordner zuzugreifen. z.B. beim Programmieren der RFID-Karten, wenn die Ordner ausgewählt werden. Die Anzahl der Files kann er ja auslesen, aber wie ist es mit der Anzahl der Ordner?

Im Prinzip ja (das aber, siehe unten :wink: ). Habe ich aus den gleichen wie von dir angeführten Gründen anno 2018 in die DFPlayer Mini Library eingebracht:

Es gibt allerdings ein großes aber: Die Funktion wird nämlich nicht von allen Chips unterstützt und wenn es unterstützt wird gibt es je nach Chip auch gerne mal unterschiedliche Werte zurück - bei gleicher SD Karte. In der Breite also leider nicht zu gebrauchen.

Erst mal danke für die Info. Ich werde das mal ausprobieren, vielleicht klappt es ja. Schade nur, dass es nicht von allen chipsätzen unterstützt wird.

Die besten Chancen hast du glaub ich mit dem MH-ET Live, ich bin mir aber grad nich mehr :100: sicher, dafür isses schon zu lange her.

Habe es jetzt erst mal probiert, die Anzahl der Ordner beim Start im ser Monitor anzuzeigen. Im Setup habe folgendes nach dem Initialisieren des DFplayers eingefügt.

numFolders = (mp3.getTotalFolderCount( ));
  Serial.print("Folders in SD: ");
  Serial.println (numFolders);

Vorher natürlich auch die Variable numFolders deklariert

// ******************** DF-Player **************************
// DFPlayer Mini
SoftwareSerial mySoftwareSerial(2, 3); // RX, TX   // Digitalpins zur Steuerung des DF-Players
uint8_t numFolders;                                // Anzahl der Ordner im Speichermedium
uint8_t numTracksInFolder;                         // Anzahl der Tracks im Ordner
uint8_t firstTrack;                                // erster Track
uint8_t currentQueueIndex;                         // index in queue[] aktuelle Tracknr in der queue
uint8_t queueSize;                                 // Länge der queue
uint8_t queue[255];                                // max 255 tracks/folder. entries 0..254 and values 1..255 are used.
uint8_t volume;                                    // Lautstärke

Die Anzeige im SerMonitor klappt schon mal und zeigt auch die Anzahl der Ordner inklusive advert und mp3 richtig an.

Magst du uns verraten, welchen Chip dein DfPlayer Mini nutzt?

Es ist der MH-ETLive. Die Funktionen zum Begrenzen der Ordnerauswahl auf die vorhandenen Ordner funktioniert auch. Code folgt. Außerdem habe ich noch die Auswahl der Optionen in den Voicemenüs umlaufend gemacht, so dass man von der höchsten Option beim Weiterschalten direkt zu Option 1 kommt. Rückwärts geht das auch.

1 Like

Ich habe zur Zeit drei verschiedene zur Auswahl,
JL AA19HF859-94
YX5200-24SS und den
MH-ET Live MH2024K-24SS.

Leider habe ich überhaut keine Ahnung vom Programmieren und kann die Idee nicht verwirklichen.
Ansonsten habe ich drei Boxen zusammengebaut, davon zwei mit der Platine von Thorsten.
So hat ein Rentner eine Aufgabe und schaut in glänzende Augen der Enkel.

Danke an alle für diese SUPER Leistung.

So hier der Code.

// ------------------------------------------------------------------------------------------------ 
#define CountFolders          // Die Anzahl der Ordner des Speichermediums im DfPlayer wird ermittelt
                              // und als Begrenzung bei der Ordnerauswahl verwendet.
                              // Abhängig vom Chipsatz des DfPlayers ist die Funktion nicht immer verfügbar.
                              // Dann deaktivieren ! Es werden dann wieder die Funktionen des Originalcodes verwendet.
                              // Getestet mit MH-ETLive und funktioniert.



// Deklaration der Variable uint_8t numFolders hinzufügen

// ******************** DF-Player **************************
// DFPlayer Mini
SoftwareSerial mySoftwareSerial(2, 3); // RX, TX   // Digitalpins zur Steuerung des DF-Players
uint8_t numFolders;                                // Anzahl der Ordner im Speichermedium
uint8_t numTracksInFolder;                         // Anzahl der Tracks im Ordner
uint8_t firstTrack;                                // erster Track
uint8_t currentQueueIndex;                         // index in queue[] aktuelle Tracknr in der queue
uint8_t queueSize;                                 // Länge der queue
uint8_t queue[255];                                // max 255 tracks/folder. entries 0..254 and values 1..255 are used.
uint8_t volume;                                    // Lautstärke



//In den Voicemenüs folgende Änderungen bzw Ergänzungen vornehmen
//im Abschnitt submenu 2, Einzelkarten.... Die Nr des submenü kann abweichen, da ich eine andere Reihenfolge in den Menüs habe.

#ifdef CountFolders
   tempCard.nfcFolderSettings.folder = voiceMenu(numFolders - 2, 301, 0, true);  // Verwende die Lautstärketasten um einen Ordner auszuwählen
 #endif
    
 #ifndef CountFolders   
    tempCard.nfcFolderSettings.folder = voiceMenu(99, 301, 0, true);  // Verwende die Lautstärketasten um einen Ordner auszuwählen
 #endif                                                                // 001 - 099 setzt die Ordnernummer Kurzer Druck + oder - 1
                                                                      //                                  Langer Druck + oder - 10



// In den Foldersettings folgende Änderungen bzw Ergänzungen einarbeiten

 bool setupFolder(folderSettings * theFolder) 
  {
  // Ordner abfragen
  #ifdef CountFolders
  theFolder->folder = voiceMenu(numFolders - 2, 301, 0, true, 0, 0, true);  // 301 - Wähle den Ordner aus ( 1 bis numFolders-2) 
  #endif 
  #ifndef CountFolders 
  theFolder->folder = voiceMenu(99, 301, 0, true, 0, 0, true);      // 301 - Wähle den Ordner aus ( 1 - 99)
  #endif
  if (theFolder->folder == 0) return false;

  // Wiedergabemodus abfragen
  theFolder->mode = voiceMenu(9, 310, 310, false, 0, 0, true);      // 310 - Wähle den Wiedergabemodus ( Alle Abspielmodi)
                                                                    // 311 - Hörspielmodus
                                                                    // 312 - Albummodus
                                                                    // 313 - Partymodus
                                                                    // 314 - Einzelmodus





// Im Setup Folgendes Ändern

 //*************** DFPlayer Mini initialisieren ***********************
  mp3.begin();
  
  
 
  delay(2000);   // Zwei Sekunden warten bis der DFPlayer Mini initialisiert ist ohne Nutzung des USB-Stick
  

  #ifdef CountFolders
  numFolders = (mp3.getTotalFolderCount( ));
  Serial.print("Folders in SD: ");
  Serial.println (numFolders);
  #endif
    

// Zweites Thema Umlaufende Optionen in den Auswahlmodi
// Für das durchschalten der Auswahloptionen muss folgendes angepasst werden


readButtons();
      mp3.loop();
               
        if (pauseButton.pressedFor(LONG_PRESS))       // Abbruch durch Taste
        {
        Serial.println(F("=== Abbruch === "));
        mp3.playMp3FolderTrack(802);                  // 802- "OK, ich habe den Vorgang abgebrochen.
        waitForTrackToFinish();
        ignorePauseButton = true;
        setstandbyTimer(); 
        return defaultValue;
        }
      if (pauseButton.wasReleased()) 
        {
        if (returnValue != 0) 
          {
          AdmTimeOut = millis();                                        // Neustart TimeOut Timer
          Serial.print(F("Auswahl "));
          Serial.print(returnValue);
          Serial.println(F(" ok"));
          return returnValue;
          }
        delay(1000);
         }
      // ************ 10-er Schritt** vorwärts ************** 
    if (upButton.pressedFor(LONG_PRESS)) 
      {
      AdmTimeOut = millis();                                            // Neustart TimeOut Timer
      if(returnValue == numberOfOptions)                                // Rücksprung zum Anfang der Optionen
      returnValue = 0;  
      returnValue = min(returnValue + 10, numberOfOptions);             // 10 Schritte hoch
      Serial.println(returnValue);
      mp3.pause();                                                                      
      mp3.playMp3FolderTrack(messageOffset + returnValue);
      waitForTrackToFinish();

       //************ preview *****************************
      
      if (preview) 
        {
        if (previewFromFolder == 0)
          mp3.playFolderTrack(returnValue, 1);
        else
          mp3.playFolderTrack(previewFromFolder, returnValue);
        }
       
      ignoreUpButton = true;
    }
    else if (upButton.wasReleased()) 
      {
      AdmTimeOut = millis();                                      // Neustart TimeOut Timer
      if (!ignoreUpButton) 
        {
        if(returnValue == numberOfOptions)                        // Rücksprung zum Anfang der Optionen
        returnValue = 0;  
        returnValue = min(returnValue + 1, numberOfOptions);      // 1 Schritt weiter
        Serial.print("Auswahl: ");
        Serial.println(returnValue);
        mp3.pause();                                                            
        mp3.playMp3FolderTrack(messageOffset + returnValue);
        if (preview) 
          {
          waitForTrackToFinish();
          if (previewFromFolder == 0) 
            {
            mp3.playFolderTrack(returnValue, 1);
            } 
            else
              {
              mp3.playFolderTrack(previewFromFolder, returnValue);
              }
            delay(1000);
          }
        } 
        else 
        {
        ignoreUpButton = false;
        }
    }
    // ************* 10-er Schritt* zurück ***************
    
    if (downButton.pressedFor(LONG_PRESS)) 
      {
      AdmTimeOut = millis();                              // Neustart TimeOut Timer
      if(returnValue == 1)                                // Rücksprung zum Ende der Optionen
      returnValue = (numberOfOptions +1);  
      returnValue = max(returnValue - 10, 1);             // 10 Schritte zurück
      
      Serial.print("Auswahl: ");
      Serial.println(returnValue);
      mp3.pause();                                                          
      mp3.playMp3FolderTrack(messageOffset + returnValue);
      waitForTrackToFinish();
      
      //************ preview *****************************
       
      if (preview) 
        {
        if (previewFromFolder == 0)
          mp3.playFolderTrack(returnValue, 1);
        else
          mp3.playFolderTrack(previewFromFolder, returnValue);
        }
       
        
      ignoreDownButton = true;
      }
      else if (downButton.wasReleased()) 
        {
        AdmTimeOut = millis();                                        // Neustart TimeOut Timer
        if (!ignoreDownButton) 
          {
          if(returnValue == 1)                                        // Rücksprung zum Ende der Optionen
          returnValue = (numberOfOptions +1);  
          returnValue = max(returnValue - 1, 1);                      // 1 Schritt zurück
          Serial.print("Auswahl: ");
          Serial.println(returnValue);
          mp3.pause();                                                      
          mp3.playMp3FolderTrack(messageOffset + returnValue);
          if (preview) 
            {
            waitForTrackToFinish();
            if (previewFromFolder == 0) 
              {
              mp3.playFolderTrack(returnValue, 1);
              }
            else 
            {
            mp3.playFolderTrack(previewFromFolder, returnValue);
            }
          delay(1000);
            }
          } 
          else 
          {
          ignoreDownButton = false;
          }
      }
    } while (true);
}
1 Like

Vielen Dank für die schnelle Hilfe, ich werde versuchen den Code an die richtigen Stellen zu platzieren.
Und über das Ergebnis berichten.

Danke

Noch ein Hinweis. Speichere dir deinen Originalcode vor den Änderungen unter anderem Namen ab. So kannst du immer wieder auf den alten Stand wechseln, falls es nicht klappt.

Danke für diese Information, kam leider drei Minuten zu spät. Aber ich bin lernfähig und habe noch einmal von Vorne angefangen. Der Rentner gibt sich alle Mühe, mal sehen was daraus ensteht.

Hallo @stephan und alle interessierten.
Ich habe jetzt die Funktion mit 4 verschiedenen DfPlayern mit unterschiedlichen Chipsätzen getestet.
YX 5200 24 SS funktioniert ohne Probleme, Ordneranzahl wird korrekt ausgelesen.
MH ET Live funktioniert ohne Probleme, Ordneranzahl wird korrekt ausgelesen.
IL AA19 HF 2120 funktioniert ohne Probleme,Ordneranzahl wird korrekt ausgelesen.
IL AA19 HF 8328 funktioniert ohne Probleme, Ordnerzahl wird korrekt ausgelesen.
SD Karte ist eine Intenso 32Gb Class 10 Karte.

Ich weiß nicht, ob noch andere Chipsätze existieren, aber bei diesen funktioniert das Auslesen der Ordnerzahl.
Wenn das jemand übernimmt und andere Chipsätze einsetzt wäre ein feedback super.

Die verwendete Bibliothek für den dfPlayer ist die aktuellste Version 1.07 .

2 Like

Das sind schon die wichtigsten. Du musst aber bedenken, es gibt z.b. vom YX Chips aus verschiedenen Jahren. Da kann das mal sein, das es nicht geht usw. einfach im Hinterkopf behalten.

Guten Morgen, Danke für die Information.
Nachdem ich die fehlenden Zeilen ( AdmTimeOut) zum Code gefunden habe läuft alles ohne Fehler beim Kompilieren durch. So wie es die Zeit zulässt werde ich einmal meine vorhandenen DF-Player testen.
Ich wünsche allen einen schönen Tag und bleibt gesund.

Hallo @stephan

Das sind schon die wichtigsten. Du musst aber bedenken, es gibt z.b. vom YX Chips aus verschiedenen Jahren. Da kann das mal sein, das es nicht geht usw. einfach im Hinterkopf behalten.

Genau aus diesem Grund kann man diese Funktion auch über die #define ausschalten und hat dann automatisch den alten code, ohne aufwändig alles wieder umschreiben zu müssen.
Danke noch mal für deine Hilfe, der Hinweis auf diese Funktion hat mir sehr geholfen.

Ich habe noch was festgestellt. Es ist äusserst wichtig, dass auf der sd-Karte keine Tonuino-fremden Ordner vorhanden sind. z.B der versteckte Ordner Systeminfo, den Windows schon mal gerne anlegt. Diese Ordner werden nämlich mitgezählt und dann funktionieren die Codeteile, die die Ordnerzahl verwenden nicht richtig.

Das Problem ist bekannt und wurde schon mehrfach erwähnt, danke.
Allen ein schönes Wochenende, trotz Regen.