ARDUINO Вопросы по модулю DFPlayer / DFPlayer mini

Старик Похабыч

★★★★★★★
14 Авг 2019
4,191
1,281
Москва
если кнопка подключена непосредственно к плееру, то даст, а если обработка кнопки на ардуине то нет

Но если управление через ардуину, то непонятно зачем тогда все эти танцы с бубнами с определением трека ?
если берешь рандом - запомни его номер и все. и один раз при рандоме выведи на экран. Нажатие след и пред + - 1. И т.д.

И я кажется напутал с просмотром кода.. он совсем что то не такой..
На входе в процедуру что? если кол-во файлов, то получается если проигрываемый файл не последний, то крутим постоянно цикл..
random(files)+1 - это уже и есть fileNUM , надо делать как то так
fileNUM =random(files)+1;
myDFPlayer.playFolder(3, fileNUM);
 
Изменено:
  • Лойс +1
Реакции: Gridzilla

Gridzilla

★✩✩✩✩✩✩
29 Ноя 2019
26
14
На входе в процедуру что? если кол-во файлов, то получается если проигрываемый файл не последний, то крутим постоянно цикл..
random(files)+1 - это уже и есть fileNUM , надо делать как то так
fileNUM =random(files)+1;
myDFPlayer.playFolder(3, fileNUM);
Да, количество файлов. Спасибо, разобрался. Дело было не в бобине, просто, кхм, сидел в кабине. Эти две строчи расставили все по своим местам. Теперь буду знать (y)
 

GermanIvanov

✩✩✩✩✩✩✩
10 Ноя 2020
7
0
День добрый.
Делаю говорящие часы на UNO и DFPlayer,
Подключил "DFRobotDFPlayerMini.h"
Хочу проиграть подряд два файла, первый содержит десятки часов, второй еденицы часов.
То есть имеется файл "двадцать" и файл "два" по задумке играем их подряд получаем ""двадцать два".

Первый вариант
C++:
myDFPlayer.playFolder(1,120);  //  файл содержащий 20
delay(1000);
myDFPlayer.playFolder(1,102); //  файл содержащий 2
delay(1000);
Работает, но как то некудряво.
Хотелось бы не задавать жестко паузу, а поймать момент окончания воспроизведения файла(мне потом это еще понадобится в другой функции девайса).
Покурил библиотеку DFRobotDFPlayerMini изменил код так

C++:
...
int state = myDFPlayer.readState();
myDFPlayer.playFolder(1,120); 
int busy = -1;
while(busy!=state)
{
   busy=myDFPlayer.readState();
   Serial.print(busy);
}
....
Пролетаем сквозь код практически без задержки не дожидаясь конца воспроизведения. readState пару раз выдает -1, затем возвращается к 512 :(
Покурил даташит. припаял проводок на 16 контакт модуля( busy) и завел его на 9 вход ардуинки.

Третий вариант кода.
C++:
...
  pinMode(9, INPUT);
...
myDFPlayer.playFolder(1,120);
int busy=0;
while(busy==0){
    busy=digitalRead(9);
   Serial.print(busy);
 }
...
Теже яйца только в профиль, :( Проскакивает пара 0, затем 1 не дожидаясь конца воспроизведения....

Никто не решал схожую задачу? Может подскажете что...
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,191
1,281
Москва
Должно четко работать. Сделай простую программу, которая только и будет делать , что выводить в монитор порта значение пина бизи с плеера. Я обычно храню 2 значения , предыдущее и текущее и вывожу на экран только если текущее отличается от предыдущего, как то так в loop:
C++:
old_biz=200;
biz=digiralRead(bizPin);
if (old_biz!=biz)
{
Serial.println(biz);
old_biz=biz;
}
А далее проводочком замкни на землю один из контактов, куда кнопка плей подключается. В мануале есть , найдешь. При воспроизведении звуков у меня на плеере загорается синий светодиод. В момент нажатия в монитор должна выскочить 1, в завершении трека - 0.
 

GermanIvanov

✩✩✩✩✩✩✩
10 Ноя 2020
7
0
у меня нет кнопки плей. :( По задумке все управление чисто программное через ардуину.
Лампочка в моем модуле красная и она исправно загорается, но срывается следующей командой плей.
Я смотрел осциллом, на бизи проскакивает сигнал, но он короткий.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,191
1,281
Москва
DF плеер позволяет управляться как программно. так и повесить кнопки. Посмотри в даташите, там на какие то выход... ща.. Вот. Если коротенько замкнуть контакты, то будет звук. Можно без резистора. Там много вариантов, но должен начать играть.
 

Вложения

GermanIvanov

✩✩✩✩✩✩✩
10 Ноя 2020
7
0
@Старик Похабыч,
Повесил кнопку, если быстро быстро жать кнопку плей, он переходит к следующему треку, не дожидаясь когда проиграет предыдущий. Счас гляну как в говорящий часах из сообщения выше сделали
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,282
945
58
Марий-Эл
Там главное идея и пакет программ для подготовки фраз.
Я сам ещё не пробовал, но рассчитываю чуть позже воспользоваться этой информацией.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,191
1,281
Москва
Ну вот только что подключил плеер без проблем. при воспроизведении четко горит огонек, тестировать надо начать на достаточно долгих треках.
 
  • Лойс +1
Реакции: GermanIvanov

GermanIvanov

✩✩✩✩✩✩✩
10 Ноя 2020
7
0
Там главное идея и пакет программ для подготовки фраз.
Пакет фраз есть у телефонистов, кодовые слова для гугла freeswitch-ru-RU-elena.
Я вытащил нужные файлы, а вот дальше и застрял на том, что не могу сделать так, чтобы модуль ждал окончания одного трека прежде чем переходить ко второму.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,191
1,281
Москва
Скинь мне в личку фразы и текст, завтра буду работать с плеером , заодно и гляну. Или сслыку на яндекс диск или еще куда
 

GermanIvanov

✩✩✩✩✩✩✩
10 Ноя 2020
7
0
Разобрался вроде. В двух словах после каждой команды надо дать модулю время ее переварить. Я такой задержки не делал, и поэтому код проскакивал до того, как модуль успевал выставить сигнал Busy. Правильно работающий кусок кода выглядит так.

C++:
myDFPlayer.playFolder(1,120);
delay(200);
int busy=0;
while(busy==0){
  busy=digitalRead(9);
}
myDFPlayer.playFolder(1,105);
delay(200);
busy=0;
while(busy==0){
   busy=digitalRead(9);
}
 

GermanIvanov

✩✩✩✩✩✩✩
10 Ноя 2020
7
0
Если вдруг надумаете одну ножку ардуинки сэкономить программный способ тоже вроде работает.

C++:
myDFPlayer.playFolder(1,120);
    delay(200);
    int busy=-1;
    while(busy!=512){
      busy=myDFPlayer.readState();
    }
 

Dis_21

✩✩✩✩✩✩✩
6 Фев 2021
1
0
Оформи код соответствующим тэгом
Доброго времени суток. Появилось желание сделать обучающую игрушку для ребёнка, в виде плюшевой зверушки. Т.е. идея такая на флешке будет записано 6-7 папок с 9 записями в каждой. Хотелось, чтобы каждая кнопка отвечала за свой номер трека и была возможность переключаться между папками. Но получается так, что 9 кнопок отвечают только за 1-ую папку, а при переключении между папками и нажатии кнопки любого трека ардуино всё равно перекидывает на первую папку и воспроизводит от туда.


#include "DFRobotDFPlayerMini.h"
// библиотека для эмуляции Serial порта
#include <SoftwareSerial.h>
// создаём объект mySoftwareSerial и передаём номера управляющих пинов RX и TX
// RX - цифровой вывод 12, необходимо соединить с выводом TX дисплея
// TX - цифровой вывод 13, необходимо соединить с выводом RX дисплея
SoftwareSerial mySoftwareSerial(12, 13); // RX, TX для плеера DFPlayer Mini
DFRobotDFPlayerMini myDFPlayer;

int i = 1; // счётчик папок
int j = 0; // счётчик файлов
int folders = 0; // максимальное количество папок
int files = 1; // количество треков в папке

int buttonKey2 = 2; // кнопка трек 1
int buttonKey3 = 3; // кнопка трек 2
int buttonKey4 = 4; // кнопка трек 3
int buttonKey5 = 5; // кнопка трек 4
int buttonKey6 = 6; // кнопка трек 5
int buttonKey7 = 7; // кнопка трек 6
int buttonKey8 = 8; // кнопка трек 7
int buttonKey9 = 9; // кнопка трек 8
int buttonKey10 = 10; // кнопка трек 9
int buttonNextFolder = 11; // кнопка следующая папка

boolean isPlaying = false; // статус воспроизведения/пауза

void setup() {
pinMode(buttonKey2, INPUT_PULLUP);
pinMode(buttonKey3, INPUT_PULLUP);
pinMode(buttonKey4, INPUT_PULLUP);
pinMode(buttonKey5, INPUT_PULLUP);
pinMode(buttonKey6, INPUT_PULLUP);
pinMode(buttonKey7, INPUT_PULLUP);
pinMode(buttonKey8, INPUT_PULLUP);
pinMode(buttonKey9, INPUT_PULLUP);
pinMode(buttonKey10, INPUT_PULLUP);
pinMode(buttonNextFolder, INPUT_PULLUP);


mySoftwareSerial.begin(9600);
Serial.begin(9600);

delay(1000);

Serial.println();
Serial.println("DFPlayer Mini Demo");
Serial.println("Initializing DFPlayer...");

if (!myDFPlayer.begin(mySoftwareSerial)) {
Serial.println("Unable to begin:");
Serial.println("1.Please recheck the connection!");
Serial.println("2.Please insert the SD card!");
while (true);
}
Serial.println(F("Подключено."));

myDFPlayer.setTimeOut(300);

//----Set volume----
myDFPlayer.volume(15); //Set volume value (0~30).

//----Set different EQ----
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);

myDFPlayer.play(1); //Воспроизведение первого mp3
isPlaying = true; // воспроизводим
Serial.println("Playing..");
//----Читать информацию----
Serial.println(myDFPlayer.readState()); //читать состояние mp3
Serial.println(myDFPlayer.readVolume()); //Текущая громкость
Serial.println(myDFPlayer.readEQ()); // читаем настройку эквалайзера
Serial.println(myDFPlayer.readFileCounts()); // читать все файлы на SD-карте
Serial.println(myDFPlayer.readCurrentFileNumber()); // текущий номер файла воспроизведения
}

void loop() {
if (digitalRead(buttonKey2) == LOW) {
if (isPlaying) {
myDFPlayer.play (1); // Track 1
Serial.println("Track 1.");
}
delay(500);
}
if (digitalRead(buttonKey3) == LOW) {
if (isPlaying) {
myDFPlayer.play (2); // Track 2
Serial.println("Track 2.");
}
delay(500);
}
if (digitalRead(buttonKey4) == LOW) {
if (isPlaying) {
myDFPlayer.play (3); //Track 3
Serial.println("Track 3.");
}
delay(500);
}
if (digitalRead(buttonKey5) == LOW) {
if (isPlaying) {
myDFPlayer.play (4); //Track 4
Serial.println("Track 4.");
}
delay(500);
}
if (digitalRead(buttonKey6) == LOW) {
if (isPlaying) {
myDFPlayer.play (5); //Track 5
Serial.println("Track 5.");
}
delay(500);
}
if (digitalRead(buttonKey7) == LOW) {
if (isPlaying) {
myDFPlayer.play (6); //Track 6
Serial.println("Track 6.");
}
delay(500);
}
if (digitalRead(buttonKey8) == LOW) {
if (isPlaying) {
myDFPlayer.play (7); //Track 7
Serial.println("Track 7.");
}
delay(500);
}
if (digitalRead(buttonKey9) == LOW) {
if (isPlaying) {
myDFPlayer.play (8); //Track 8
Serial.println("Track 8.");
}
delay(500);
}
if (digitalRead(buttonKey10) == LOW) {
if (isPlaying) {
myDFPlayer.play (9); //Track 9
Serial.println("Track 9.");
}
delay(500);
}

if (digitalRead(buttonPrevious) == LOW) {
if (isPlaying) {
j++;
if (j > files)
j = 1;
myDFPlayer.playFolder(i, j); //воспроизводить определенный mp3 в SD: /15/004.mp3; Имя папки (1 ~ 99);
Serial.print("Next folder = ");
Serial.print(i);
Serial.print(", mp3 file = ");
Serial.println(j);

}
delay(500);
}
}
 

bort707

★★★★★★✩
21 Сен 2020
2,899
863
получается так, что 9 кнопок отвечают только за 1-ую папку, а при переключении между папками и нажатии кнопки любого трека ардуино всё равно перекидывает на первую папку и воспроизводит от туда.
Так вы нигде в коде номер папки не меняете - поэтому все и работает так... как в коде написано
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,191
1,281
Москва
Вообще эти плееры очень примитивно работают с сортировкой файлов. Треки имеют сплошную нумерацию. Т.е. 1-ый файл из 2-ой папки будет иметь номер 10
 

blackgrom

✩✩✩✩✩✩✩
18 Июн 2022
4
0
Есть mp3 модуль dfplayer подключен к nodemcu через программный softwareserial на пины d3 и d4. Пройгрывает звуки отлично но бывает иногда надо включать звуки быстро то есть треки один за другим сразу же и вот тут возникает проблема, он перестает играть звуки. Индикатор на модуле горит оповещая о том что звук пройгрывается но по факту звука нет. Проблема решается если отключить и заново включить питание, или же подождать примерно минуту тогда он снова работает но хотелось бы знать как сделать так чтоб он работал без остановки шустро. (Все звуки в формате .mp3)
 

Alexs-vplicei

✩✩✩✩✩✩✩
18 Авг 2021
55
3
Вечер добрый.

Столкнулся с такой проблемой с платой Wemos (на UNO тоже) - подключил плеер черех RX TX. Он работает. Но почему то только проигрывает следующий, предыдущий и рандомные файлы. А мне надо по номеру. Есть mp3_play(N), но не работает. Пробовал разные библиотеки. Результат аналогичен. Точно скажу, что на контроллерах, где есть TX1 RX1 все хорошо. Есть варианты решения проблемы? Или нам менять железо?
Помогите люди мудрые. Если что-то надо прислать (коды, фото и прочее), напишите. Честно говоря, очень надо. Дальше двигаться без этого не получится. Делаю устройство для подачи школьных звонков. Хотел обойтись next-ом, но он mp3_next() проигрывает в каком-то своем только ему понятном порядке.
Вот такой вот вопрос.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,191
1,281
Москва
Порядок он берет с карты. Т.е. если совсем плохо , то надо заново отформатировать карту и записывать файлы по одному, в нужном порядке.