nettips.ru

Воспроизведение текущего времени с помощью arduino и mp3 dfplayer mini

На главную Cisco Systems VoIP маршрутизатор Беларусь Asterisk коммутатор Arduino Nateks Alcatel MTS Gigaset Velcom ZTE Grandstream Android Huawei админы шутят о сайте Zelax Allied Telesis D-Link Штрихкоды HP
Телефонные номера доступа sip операторов Телефонные коды городов и стран мира.

Рейтинг статьи: 4.333/5 Рейтинг 4.33 из 5Рейтинг 4.33 из 5Рейтинг 4.33 из 5Рейтинг 4.33 из 5Рейтинг 4.33 из 5 (6 голосов).

Нюансы работы с модулем 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!
)

После чего перемещаем все в ADVERT
Теперь ноль минут ("ровно") можно оставить в "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 и примерами их использования.

На этом все, улыбайтесь чаще, и мир станет лучше.

Arduino Программирование

Пожалуйста, оцените и ВЫ эту статью:

Комментариев нет. Снаньте первым!


Ваши отзывы и предложения по работе сайта направляйте на форму обратной связи.

Яндекс.Метрика