Рейтинг статьи: 2.513/5 (39 голосов).
Нюансы работы с модулем dfplayer на примере воспроизведения текущего времениСпонсор этой страницы:
Возможные команды dfplayer mini для воспроизведения текущего времени.
*Имена файлов указаны в виде примера
command(0x03, 0, 1);Воспроизведение первого файла из корневой папки.
command(0x0F, 1, 1);Воспроизведение файла "001.mp3" из папки "01".
command(0x12, 10, 1);Воспроизведение файла "0001.mp3" из папки "01" (можно использовать папки "01" - "15").
command(0x13, 0, 1);Воспроизведение файла "0001.mp3" из папки "mp3".
command(0x14, 0, 1);Воспроизведение объявления "0001.mp3" из папки "ADVERT".
command(0x42, 0, 1);Запрос состояния (play/stop/pause)
Особенности работы dfplayer mini
Первое. Чем больше файлов на носителе, тем медленнее и глючнее будут выполняться команды и приходить ответы.
Второе. Время ответа зависит от номера папки. Для примера, имеем 24 файла в папке "02" и в папке "98", Время ответа на запрос о количестве файлов в папке "02" - 209 мсек, а в "98" - 1860.
timer_1 = millis();
command(0x4E, 0, 2);
while (not mp3.available()){ delay(5);}
answer();
Serial.print(String(i)+" files:"+String((((uint16_t)ansbuf[5]) << 8) | ansbuf[6])+" , time:"+String(millis()-timer_1));
timer_1 = millis();
command(0x4E, 0, 98);
while (not mp3.available()){ delay(5);}
answer();
Serial.print(String(i)+" files:"+String((((uint16_t)ansbuf[5]) << 8) | ansbuf[6])+" , time:"+String(millis()-timer_1));
Третье. 0x13 Воспроизведение объявления возможно только если уже что то воспроизводится. Музыка ставится на паузу, и после объявления производится с того же места. Определить запросом окончние объявления нельзя.
Четвертое. 0x03 Воспроизведение не зависит от номеров, а зависит от очередности записывания файлов на носитель.
Пятое. Файлы "000.mp3" и "0000.mp3" не воспроизводятся.
Команды command и answer и т.д. см. в статье Подключение модуля DFPlayer Mini к arduino.
И еще. Если в папке "01" будут лежать для примера файлы "0001.mp3" - "0024.mp3", то команда command(0x12, 10, 1); воспроизведет файл "0001.mp3", а command(0x0F, 1, 1); воспроизведет скорее всего файл "0010.mp3", или "0011.mp3".
Определение цели и метода
Для примера рассмотрим методы 0x0F и 0x13.
Построение алгоритма исходя из наличия ресурсов
После некоторых поисков была найдена коллекция фраз, типа "один час" и "одна минута" начитанные женским голосом.
Там же лежит и все остальное, описанное далее.
Файлы часов и минут лежат в папках "01" и "02". На этом материале проще всего организовать часы, не заморачивясь отличиями "час/часа/часов", а просто воспроизвести 2 файла подряд.
//h - часы, m - минуты
if (h==0) h=24;
command(0x0F, 1, h);
// Подождать
if (m==0) m=60;
command(0x0F, 2, m);
// Возможно подождать
В связи с тем, что длительность звучания, например "одна минута" и "пятьдесят одна минута" разные, то и задержка так же желательно разная. Если использовать command(0x0F, 1, h); можно определить окончание воспроизведения.
byte play_status(void)
{
int pl=255;
command(0x42, 0, 0);
while (not mp3.available()){ delay(5);}
if (answer())
if (ansbuf[3] == 0x42) pl=ansbuf[6];
if (ansbuf[3] == 0x3D) pl=0;
return pl;
}
if (h==0) h=24;
command(0x0F, 1, h);
delay(1000); //Что бы лишний раз не дергать модуль
while (play_status()==1) delay(100);
if (m==0) m=60;
command(0x0F, 2, m);
// Возможно подождать
// delay(1000);
// while (play_status()==1) delay(100);
Если мы планируем воспроизвести время в момент звучания фоновой музыки, используя command(0x13, 0, h);, то play_status() нам не поможет. Он будет показывать, что идет воспроизведение фоновой музыки.
В этом случае придется составлять массив времени задержки хотя бы часов.
Время воспроизведеня часов указано для существующего архива.
Переименовываем фалы в папке часов, например командой for %i in (*.*) do ren %i 0%i, получив файлики типа "0001.mp3"
И переименовываем файлики в папке минут (+100) типа "0101.mp3" используя bat файл
Setlocal EnableDelayedExpansion
for %%i in (*.mp3) do (
set a=%%i
set b=01!a:~1!
ren %%i !b!
)
Теперь ноль минут ("ровно") можно оставить в "0100.mp3"
Если лень переименовывать, не парьтесь. В архиве все есть.
uint16_t clock_delay[25]={0,1200,1176,1080,1320,1152,1296,1200,1248,1368,1488,1488,1632,1560,1584,1440,1560,1584,1656,1680,1416,1752,1656,1656,1056};
if (h==0) h=24;
command(0x13, 0, h); //сделать объявление "h часов"
delay(clock_delay[h]); //Подождать окончания объявления "h часов"
command(0x13, 0, m+100); //сделать объявление "m минут"
//Дальше можно не ждать.
Этот вариант мне нравится тем, что можно запустить циклически фоновую музыку, и по событию вставлять время.
delay(clock_delay[h]); можно использовать и в первом варианте вместо delay(1000);while (play_status()==1) delay(100); после часов.
В вышеуказанном архиве есть все файлики, и скетч для ардуино (time) с функциями play_time, play_time_ADVERT и примерами их использования.
На этом все, улыбайтесь чаще, и мир станет лучше.
Комментарии к статье:
-
2021-09-29 15:54:24, Гость :
Ошибки есть в статье конечно))) причем с первых команды ADVERT. А по делу,спасибо большое за краткость и удобство информации. Файл озвучки очень выручил !!!