Проблемы с DFPlayer. Странно работает прошивка

Использую стандартную библиотеку DFRobotDFPlayerMini, на карте памяти у меня папка “mp3” и в ней 9 файлов, подписанных так: 0001 - 0009 .mp3. В папке “01” 2 файла Подписанных так:001-003.mp3, один запускается при старте, другой при каких нибудь ошибках. Проблема такая, не корректно считываются количество файлов и не правильно показывает номер воспроизведенного файла, поэтому пришлось сделать так:

Serial.print("Сейчас воспроизводится:");
  Serial.println(in_data);

хотя по задумке считывается реально запущенный файл этим кодом:

Serial.println(myDFPlayer.readCurrentFileNumber()); 

Показывает в 01 папке 2 файла корректно, а в mp3 вчера показывало корректно, а сегодня лажа, хотя вчера количество показывало корректно… В чем может быть проблема? mp3 менял, все работает так же.
при запуске порта вводя цифру 2 к примеру, запускается второй файл, то есть с выводом mp3 файлов проблем нет, есть только в считывании файлов.

Весь код выкладываю:

#include "DFRobotDFPlayerMini.h"
// библиотека для эмуляции Serial порта
#include <SoftwareSerial.h>
// создаём объект mySoftwareSerial и передаём номера управляющих пинов RX и TX
// RX - цифровой вывод 10, необходимо соединить с выводом TX дисплея
// TX - цифровой вывод 11, необходимо соединить с выводом RX дисплея
SoftwareSerial mySoftwareSerial(8, 9); // RX, TX для плеера DFPlayer Mini 
DFRobotDFPlayerMini myDFPlayer;
int launchMp3 = 1;   // звук при старте
int ErMp3 = 1;   // звук при ошибке
boolean isPlaying = false; // статус воспроизведения/пауза
void setup() {

  mySoftwareSerial.begin(9600); 
  Serial.begin(9600);
  delay(1000);
  Serial.println();
  Serial.println("Инициализация...");
  if (!myDFPlayer.begin(mySoftwareSerial)) {
    Serial.println("Не удается начать:");
    Serial.println("1.Пожалуйста, еще раз проверьте подключение!");
    Serial.println("2.Пожалуйста, вставьте SD-карту!");
    while (true);
  }
 
      
      
  
 // myDFPlayer.setTimeOut(300);
  //----Set volume----
  myDFPlayer.volume(30);  //Set volume value (0~30).
  //----Set different EQ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
  if(launchMp3==1){myDFPlayer.playFolder(01,1);delay(3000);}
  Serial.println(F("Инициализация прошла успешно!"));
  delay(3000);
   Serial.print("Количество аудио в папке MP3:");Serial.println(myDFPlayer.readFileCounts()-myDFPlayer.readFileCountsInFolder(1));
   delay(1000);
  Serial.print("Количество аудио в папке 01:");Serial.println(myDFPlayer.readFileCountsInFolder(1));
  delay(1000);
  

   
}




void loop() {
 
  if (myDFPlayer.available()) {
    
    printDetail(myDFPlayer.readType(), myDFPlayer.read());//Вывести подробное сообщение от DFPlayer для обработки различных ошибок и состояний.  }
  }

if(Serial.available()>0){//если есть доступные данные
  int in_data = Serial.parseInt();
if(in_data > 0){
 myDFPlayer.playMp3Folder(in_data);
 
  Serial.print("Сейчас воспроизводится:");
  Serial.println(in_data);
 
  


  

}

}
}
void errorMp3(){
  if(myDFPlayer.readFileCountsInFolder(1)){myDFPlayer.playFolder(01,2);}
}

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Время вышло"));
      break;
    case WrongStack:
      Serial.println(F("Стек неправильный!"));
      errorMp3();
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Карта вставлена!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Карта извлечена!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Карта онлайн!"));
      break;
    case DFPlayerUSBInserted:
      Serial.println("USB вставлен!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB удален!");
      break;
    case DFPlayerPlayFinished:
      Serial.println(F("Воспроизведение завершено!"));
      break;
    case DFPlayerError:
      Serial.print(F("Ошибка DFPlayer:"));
      switch (value) {
        case Busy:
          Serial.println(F("Карта не найдена "));errorMp3();
          break;
        case Sleeping:
          Serial.println(F("Спящий "));errorMp3();
          break;
        case SerialWrongStack:
          Serial.println(F("Получите неправильный стек"));errorMp3();
          break;
        case CheckSumNotMatch:
          Serial.println(F("Контрольная сумма не совпадает "));errorMp3();
          break;
        case FileIndexOut:
          Serial.println(F("Индекс файла вышел за пределы "));errorMp3();
          break;
        case FileMismatch:
          Serial.println(F("Невозможно найти файл "));errorMp3();
          break;
        case Advertise:
          Serial.println(F("В рекламе "));errorMp3();
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }

}

1 лайк

Лучше бы конечно сначала отформатировать код Ctrl-T и убрать лишние строки, а то читать неудобно.

Ну и такие куски в коде желательно не оставлять, если не хотите, чтобы над вами глумились:

2 лайка

Лучше не рассуждать абстрактно - “вчера нормально, сегодня лажа”, а точно воспроизвести конкретную ситуацию:

  1. Текущее содержимое sd карты (с компа вывод команды dir например), чтобы точно видны были все папки и файлы
  2. Вывод вашего скетча в монитор порта с этим содержимым карты

И то и другое текстом, не картинками
А то может это Вы как-то по-своему файлы считаете

А что в них плохого? Вполне осмысленный комментарий-шпаргалка.

сложновато как то у вас тут) у меня не получается чет через командную строку показать файлы которые на флешке. Буду показывать фотками.




Добавил паузу в 2000 и показало 2 файла вместо 11 в “Количество аудио в папке 01”. а в папке mp3 почему то 0, хотя они там есть. Вчера показывало 9, за ночь я не трогал ардуино и не перезаливал прошивку. Сегодня уже лажа. И да, в документации в папке mp3 должны быть номера 0001

Тоже не понял, что за плата с таким соответствием “цифровых выводов” и номеров gpio.

Был уверен, что уже встречал подобные вопросы на формах.
Залез в Гугль нашел интересные ссылки (ниже).

Суть проблемы в том. что плеер медленный, и когда вы ему даете несколько запросов подряд, как вот тут:

у вас на выходе перепутываются ответы. причем процесс это случайный и сегодня работает так, а завтра иначе.
Перепишите эту строчку так:

uint total_files_cnt = myDFPlayer.readFileCounts();
delay(300);
uint files_in_folder = myDFPlayer.readFileCountsInFolder(1));
Serial.print("Количество аудио в папке MP3:");
Serial.println(total_files_cnt -  files_in_folder );

подробнее тут

Ого, действительно заработало, спасибо большое!

Что у вас написано на плате плеера, “DFPlayer Mini” или “MP3-TF-16P”?
Мне вот достался “MP3-TF-16P”, это вроде как клон клона, и не все библиотеки с ним работают корректно. Элементарно файлы из папки не играли. В итоге с моими задачами справилась библиотека “DFPlayerMini_Fast”.
Попробуйте другие библиотеки.

да, именно так и написано) сейчас попробую глянуть)

Вам же русским языком сказали:

а Вы …