DFPlayerMini

nurgazin_d@mail.ru
Offline
Зарегистрирован: 18.12.2017

Здравствуйте Ув. участники форума!

Подскажите библиотеку для DFPlayerMini.

Задача: нужно чтобы с папки мр3 музыка (0001.мр3...0255.мр3) воспроизводилась рандомно, а по окончанию работы воспроизводился файл "сеанс окончен".

Вопрос: как сделать это?, чтобы в процессе рандомного воспроизведения не воспроизвелся файл "Сеанс окончен".

СПАСИБО!!!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Для начала хотелось бы услышать Вашу версию насчет того, что такое "рандомное воспроизведение".

Потому как может оказаться, что:

1. Ваша задача невыполнима.

2. Результат Вас не устроит (например, возможно повторное воспроизведение того же самого трека).

nurgazin_d@mail.ru
Offline
Зарегистрирован: 18.12.2017

чтобы воспроизводилось в случайном порядке, повторение песен не страшно, а воспроизведение файла во время сеанса, который должен прозвучать по команде в конце не хотелось бы!

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Нормально так, только "сеанс начался" - фиииигак и сразу же - "сеанс окончен", все по домам )))

sadman41
Offline
Зарегистрирован: 19.10.2016

По-простому: берется массив на 254 элементов, туда записываются числа от 1 до 255. Потом по нему пускается цикл с рандомайзом, который переставляет элементы массива. Затем осуществляется последовательный проход и каждый элемент массива скармливается плееру в качестве номера трека. После окончания прохода воспроизводится трек "сеанс окончен".

nurgazin_d@mail.ru
Offline
Зарегистрирован: 18.12.2017

Мысль очень хорошая, можете примерчик показать, я начинаю познавать тонкости ide, СПАСИБО!!!

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

nurgazin_d@mail.ru пишет:

Мысль очень хорошая, можете примерчик показать, я начинаю познавать тонкости ide, СПАСИБО!!!

А причём тут тонкости IDE? Тебе полный алгоритм дали - воплоти его в код. Если что-то не будет получаться - ВМЕСТЕ С КОДОМ (то есть предоставив его по всем правилам форума)  спросишь ещё раз.

sadman41
Offline
Зарегистрирован: 19.10.2016

nurgazin_d@mail.ru пишет:

Мысль очень хорошая, можете примерчик показать, я начинаю познавать тонкости ide, СПАСИБО!!!

Все "примерчики" я прогоняю в железе. А это требует времени гораздо больше, чем написать "Мысль очень хорошая". Если нужен готовый и отлаженный скетч - обращайтесь в "Ищу исполнителя".    

nurgazin_d@mail.ru
Offline
Зарегистрирован: 18.12.2017

Спасибо!

Я подумал что мне тут могут посоветовать библиотеку с функционалом например таким, который помог бы мне решить мою проблему,

Играй всю папку условно "sd:/0001" по кругу, а если надо обратится к конкретному треку то играй папку "sd:/0002/0001.мр3"

Я использую "DFPlayerMini_Fast.h", у нее есть myMP3.play(24) - играй конкретный трек "0024", myMP3.randomAll() - играй папку mp3 случайно.

в ней нет обращения к конкретным папкам, чтобы можно было файлы раскидать и нет рандома например от1 до 20 или играй рандомно конкретную папку, да и вообще не понятно как влк play типа играй по порядку, она не понимает что песне конец и надо след, так работает только в рандоме, но рандом захватывает треки которые должны звучать по команде. 

Не надо мне "примерчиков"))), посоветуйте библиотеку с похожим функционалом!

sadman41
Offline
Зарегистрирован: 19.10.2016

Такой библиотеки не встречал. Это частное решение, которое нет особого смысла "библиотезировать".

Насколько я помню -  DFPlayer вообще на имена может не смотреть в некоторых командах. Играет по тому порядку, в котором файлы писались на флешку.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Неправильно вставленный код буду удалять.  Правила почитай хотя бы счас, если за 5 лет не сподобился

 

nurgazin_d@mail.ru
Offline
Зарегистрирован: 18.12.2017

Забыл )

#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.setTimeOut(500); //Set serial communictaion time out 500ms
  
  //----Set volume----
  myDFPlayer.volume(10);  //Set volume value (0~30).
  myDFPlayer.volumeUp(); //Volume Up
  myDFPlayer.volumeDown(); //Volume Down
  
  //----Set different EQ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
//  myDFPlayer.EQ(DFPLAYER_EQ_POP);
//  myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
//  myDFPlayer.EQ(DFPLAYER_EQ_JAZZ);
//  myDFPlayer.EQ(DFPLAYER_EQ_CLASSIC);
//  myDFPlayer.EQ(DFPLAYER_EQ_BASS);
  
  //----Set device we use SD as default----
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_U_DISK);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_AUX);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SLEEP);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_FLASH);
  
  //----Mp3 control----
//  myDFPlayer.sleep();     //sleep
//  myDFPlayer.reset();     //Reset the module
//  myDFPlayer.enableDAC();  //Enable On-chip DAC
//  myDFPlayer.disableDAC();  //Disable On-chip DAC
//  myDFPlayer.outputSetting(true, 15); //output setting, enable the output and set the gain to 15
  
  //----Mp3 play----
  myDFPlayer.next();  //Play next mp3
  delay(1000);
  myDFPlayer.previous();  //Play previous mp3
  delay(1000);
  myDFPlayer.play(1);  //Play the first mp3
  delay(1000);
  myDFPlayer.loop(1);  //Loop the first mp3
  delay(1000);
  myDFPlayer.pause();  //pause the mp3
  delay(1000);
  myDFPlayer.start();  //start the mp3 from the pause
  delay(1000);
  myDFPlayer.playFolder(15, 4);  //play specific mp3 in SD:/15/004.mp3; Folder Name(1~99); File Name(1~255)
  delay(1000);
  myDFPlayer.enableLoopAll(); //loop all mp3 files.
  delay(1000);
  myDFPlayer.disableLoopAll(); //stop loop all mp3 files.
  delay(1000);
  myDFPlayer.playMp3Folder(4); //play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535)
  delay(1000);
  myDFPlayer.advertise(3); //advertise specific mp3 in SD:/ADVERT/0003.mp3; File Name(0~65535)
  delay(1000);
  myDFPlayer.stopAdvertise(); //stop advertise
  delay(1000);
  myDFPlayer.playLargeFolder(2, 999); //play specific mp3 in SD:/02/004.mp3; Folder Name(1~10); File Name(1~1000)
  delay(1000);
  myDFPlayer.loopFolder(5); //loop all mp3 files in folder SD:/05.
  delay(1000);
  myDFPlayer.randomAll(); //Random play all the mp3.
  delay(1000);
  myDFPlayer.enableLoop(); //enable loop.
  delay(1000);
  myDFPlayer.disableLoop(); //disable loop.
  delay(1000);

  //----Read imformation----
  Serial.println(myDFPlayer.readState()); //read mp3 state
  Serial.println(myDFPlayer.readVolume()); //read current volume
  Serial.println(myDFPlayer.readEQ()); //read EQ setting
  Serial.println(myDFPlayer.readFileCounts()); //read all file counts in SD card
  Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
  Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read file counts in folder SD:/03
}

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 DFPlayerUSBInserted:
      Serial.println("USB Inserted!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB Removed!");
      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;
  }
  
}

 

nurgazin_d@mail.ru
Offline
Зарегистрирован: 18.12.2017

Есть мысль все сделать так: играй от 1 до 20 трека а 21,22,23 обращаться по команде, не понятно только как ардуино поймет что надо играй след трек. В примерах все реализовано через "delay"

 

b707
Offline
Зарегистрирован: 26.05.2017

nurgazin_d@mail.ru пишет:

Есть мысль все сделать так

Что вы фигней маетесь... вам же Садман написал, как сделать. Чем вас не устраивает его решение?

Цитата:
не понятно только как ардуино поймет что надо играй след трек.

Если не ошибаюсь, у плеера можно запросить статус - играет он еще текущую песню или уже закончил. Запустили одну, как закончил - запускайте следующую... и так в цикле по всем.

 

меня поражает, сколько вопросов на форумах по этому плееру... вещь-то простейшая, вроде...

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

sadman41 пишет:

Насколько я помню -  DFPlayer вообще на имена может не смотреть в некоторых командах. Играет по тому порядку, в котором файлы писались на флешку.

так и есть!!

долго искал причину, проводник виндовса своими потоками записывает пронумерованные по феншую файлы на флешку в хаотичном порядке, а потом разбирайся почему на имя 00001.mp3 проигрывается все что угодно только не нужный файл, и да стирание и перезапись не помогает, нужно форматирование, видимо FAT читает как то "специфично" .

b707 пишет:
вещь-то простейшая, вроде...

ой не простая... поверь, а еще кол-во модификаций, короче совсем не простая. 

это если нужен мало мальский функционал, "пропеть одну песенку" - тут, да, все просто.

я тут наткнулся на еще одно подобное чудо - DY-SV17F, вот жду пока придет.

b707
Offline
Зарегистрирован: 26.05.2017

xDriver пишет:

проводник виндовса своими потоками записывает пронумерованные по феншую файлы на флешку в хаотичном порядке

известная фигня. У меня в машине СД-чейнджер тоже читает файлы с диска не по именам, а в том порядке, как они записывались на диск.

Борюсь так - сначала переименовываешь файлы в нужном порядке, потом открываю проводник, сортирую файлы по именам и копирую в чистую пустую папку. А вот уже из этой папки пишу на носитель. Файлы оказываются отсортированы строго в нужном порядке

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

FAT выделяет первую свободную запись каталога...поэтому файл с именем 1.ххх может быть где угодно

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

FAT выделяет первую свободную запись каталога...поэтому файл с именем 1.ххх может быть где угодно

очередное бессмысленное сообщение

nurgazin_d@mail.ru
Offline
Зарегистрирован: 18.12.2017

ничего себе как тут все по делу)

nurgazin_d@mail.ru
Offline
Зарегистрирован: 18.12.2017

Ришени нашел пока такое: на флешке папка 01 содержит треки, 02 команды,

вызываю так

myDFPlayer.playFolder(2, 1); delay(3000);
myDFPlayer.playFolder(2, 2); delay(3000);
myDFPlayer.playFolder(2, 3); delay(3000);

а проигрываю так

myDFPlayer.loopFolder(1);

все песни играют одна за другой но есть огромный минус они играют всегда с 1 и закончится допустим на 5,

а когда вкл ардуино опять начинают играть с 1 по куда успеет например по 5ю, а хочется чтобы продолжалось воспроизведение с остановившейся, пробывал играться с  "myDFPlayer.advertise" но не понял как оно раб, в "myDFPlayer.randomAll()" зацепляет треки из папки 02, подскажите как сделать рандом только папки 01 ПЛИЗ! бошка уже пухнет)))

PS 

myDFPlayer.pause();

для паузы но не срабатывает

Onkel
Offline
Зарегистрирован: 22.02.2016

у плейера есть пин накотором 0 если работает и 1 если висит. Подключаем его к пину 9. У меня есть фрагмент кода проигрывающий случайные песни (до 255 ) по их номеру записи, которую 1 записали та и первая. В loop() пишу

 

 if(digitalRead(9)== HIGH)

PlayMusic( byte( random(   NUMBEROFSONGS   )  ));

вызывают функцию проигрывания

void PlayMusic(byte NofSound)
{
 
  delay(1);
  
Serial.begin(9600);
Serial.write( 0x7E);
Serial.write( 0xFF);
Serial.write( 0x06);
Serial.write( 0x03);
Serial.write( 0x00);
Serial.write( 0x00);
Serial.write( NofSound+1);
Serial.write( 0xFE );
Serial.write(  byte(0xF8-NofSound-1));
Serial.write( 0xEF);


delay(12);
 
 Serial.end();
 
} 

Остается только счетчик поставить чтобы выйти из прокрутки.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

nurgazin_d@mail.ru пишет:

Забыл )...

ты где спер этот код?

и зачем сюда его поместил?

sadman41
Offline
Зарегистрирован: 19.10.2016

Я записываю так: скидываю файлы в каталог на диске, фаром туды иду, сортирую по имени и фаром же копирую на пустую карту. Все ложится как следует, номера в именах соответствуют физическому положению файлов.

nurgazin_d@mail.ru
Offline
Зарегистрирован: 18.12.2017

Ну я его не спер а взял из примера библиотеки, к чему этот вопрос не понимаю.

nurgazin_d@mail.ru
Offline
Зарегистрирован: 18.12.2017

Да вы все верно сказали, busy если не ошибаюсь.

Этот код сходится с библиотекой? Или надо др ?