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

lylyk

✩✩✩✩✩✩✩
14 Мар 2019
9
0
всем привет. тут обстоят дела с прекрасным на первый взгляд датчиком.
короче собрала проект курсовой, нужно было, чтобы некоторые значения с других датчиков были воспроизведены благодаря этому модулю.
проблема в том, что он живет своей жизнью, он начнет работать, потом резко вырубается, и сколько не жди, он включаться не будет. А когда он работает, он проигрывает только кусочек текста, а колонка вся дребежит. можете помочь пожалуйста с этим проблемищем.
библиотека: <DFPlayer_Mini_Mp3.h>
 

Вложения

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,136
412
Москва
wan-derer.ru
@lylyk, дребезжит - в смысле громко играет? Так может сделать потише? А что модуль отрубается, может, питания не хватает?
 

lylyk

✩✩✩✩✩✩✩
14 Мар 2019
9
0
@lylyk, дребезжит - в смысле громко играет? Так может сделать потише? А что модуль отрубается, может, питания не хватает?
дребежит - будто бьет, стучит. слышен звук и удары какие-то. Сложно объяснить. Потише делала. Просто проверять очень неудобно - он включается очень редко, когда ему захочется :))
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,136
412
Москва
wan-derer.ru
@lylyk, пока мы не видим твоей схемы трудно сказать что-то определенное. Проверь модуль автономно, отдельно от остальной схемы. Запитай от аккумулятора. Проблема непонятная, м.б. связана с чем угодно.
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,136
412
Москва
wan-derer.ru

KennyUA

★✩✩✩✩✩✩
13 Ноя 2018
59
18
У этого модулька возникают проблемы при использовании внешнего усилителя, если пытаться повысить громкость, модуль просто вырубается. Какой динамик используете и как он подключен?
 

lylyk

✩✩✩✩✩✩✩
14 Мар 2019
9
0
У этого модулька возникают проблемы при использовании внешнего усилителя, если пытаться повысить громкость, модуль просто вырубается. Какой динамик используете и как он подключен?
Я его пробовала по-разному соединить, никак не получается... файлы прикрепляю.
 

Вложения

lylyk

✩✩✩✩✩✩✩
14 Мар 2019
9
0
То ли я не вижу, то ли земли не соединены? Сам модуль можно без ардуины проверить, подать питание и коротнуть IO0 на землю, должен запеть. Если вырубится - выбросить)
https://www.dfrobot.com/wiki/images/thumb/9/97/Speaker2.png/700px-Speaker2.png
Походу придется выкидывать :( Печально. накрылся курсач
 

KennyUA

★✩✩✩✩✩✩
13 Ноя 2018
59
18
Так он же копейки стоит) город какой? У меня пару штук новых даже есть
 

Gridzilla

★✩✩✩✩✩✩
29 Ноя 2019
26
14
Привет всем. Похоже я что-то не так делаю, ибо не могу добиться нужного. Хочу отображение номера проигрываемого трека на дисплее. Количество самих файлов на карте памяти рисует нормально, а вот номер не хочет. В зависимости от того как написать uint16_t или int16_t, он рисует или максимум свой 65535 или -1. Сам код, что пытаюсь сделать, вот:
C++:
#include <LCD_1602_RUS.h>
#include "DFRobotDFPlayerMini.h"
#include "SoftwareSerial.h"
#define RX_MP3_PIN 10
#define TX_MP3_PIN 11
SoftwareSerial mySoftwareSerial(RX_MP3_PIN, TX_MP3_PIN);
DFRobotDFPlayerMini myDFPlayer;

LCD_1602_RUS lcd(0x27, 16, 2);
uint16_t files = 0;        // счетчик в папке с музыкой

void oled_muz(uint16_t files) {
uint16_t trek = myDFPlayer.readCurrentFileNumber(); // считываем номер проигрываемого трека
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("ТРЕК"));
  lcd.setCursor(5, 0);
  lcd.print(trek);
  lcd.setCursor(10, 0);
  lcd.print(F("ИЗ"));
  lcd.setCursor(13, 0);
  lcd.print(files);
  lcd.setCursor(0, 1);
  lcd.print(F(" ПЛЕЕР ВКЛЮЧЕН  "));
}

void setup()  {
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
  delay(1000);
  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);
  }
  myDFPlayer.setTimeOut(300);
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  files = myDFPlayer.readFileCountsInFolder(3);        // Считаем сколько треков в папке с музыкой 03
  lcd.init();// инициализация дисплея
  lcd.backlight();
  lcd.clear();

oled_muz ();
}

void loop () {
oled_muz();
}
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
А ты музыку слушал как звучит ? не уверено, что без заикания. Но допустим звучание хорошее.
Как ты запускаешь музыку ? видимо кнопками ?
Допустим ты получил номер трека...и тут же опять его запросил и вывел , запросил и вывел и т.д. уверен, что сериал ответил корректно на ВСЕ запросы, которые идут без остановки ? Может быть такой вариант. ты запросил, плеер ответил , пусть 3, а на второй запрос плеер ответить не смог и выдал тебе -1 ,т.е. ошибку обработки. Что косвенно подтверждается куском кода из соотв. функции библиотеки:
C++:
  if (waitAvailable()) {
    if (readType() == DFPlayerFeedBack) {
      return read();
    }
    else{
      return -1;
    }
  }
  else{
    return -1;
  }
вывод! надо делать задержку между запросами. Какую ? какую то.
Далее. есть такой пин у плеера - бизи. он дает Lo, когда музыка играет и Hi когда нет. Если его читать , что очень просто, и в момент Hi выставлять не спрашивать плеер, а выдавать номер трека -1 (или 65535, как удобнее), то в этот момент можно выводить сообщение "пауза" и и поставить флаг, boolean NoTrack=true; Далее при изменении бизи с Hi на Lo проверять флаг и если он true, то делать запрос и флаг ставить в false, что бы на этом треке заново не запрашивать номер трека.
Есть и команда через Serial обратиться к плееру о занятости, но ее тоже надо писать с тайм-аутом, если делать часто, то плеер заикается.
 
  • Лойс +1
Реакции: Gridzilla

Gridzilla

★✩✩✩✩✩✩
29 Ноя 2019
26
14
@Старик Похабыч, О, спасибо! Примерно понял в чем моя ошибка. Попробую с бизи и флагами. Должно помочь.
И да, кстати, кнопками. Просто опустил их тут, с телефона и так задолбался куски копировать и строчить новые :geek: После выходных доберусь до ноута и попробую.
 

Roman-RV

★✩✩✩✩✩✩
21 Июн 2019
52
15
46
А ничего , что данный кусок кода даже не компилится. В функцию oled_muz ничего не передаём, хотя должны.
 

Gridzilla

★✩✩✩✩✩✩
29 Ноя 2019
26
14
@Старик Похабыч,
Что-то я запутался :) Пока в командировке читаю инструкции :)
C++:
boolean NoTrack=false;
void trek_Read (int trek) {
  if (digitalRead(BUSY_MP3_PIN) == 0) { // 0 - работаем
    trek = myDFPlayer.readCurrentFileNumber(); // читаем номер
   NoTrack=true; 
    }

}
Куда мне дальше копнуть?

@Roman-RV,
Да, извини.. Не полный код. Просто интересует сам механизм чтения номера.
 

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

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Разбор полета:

C++:
boolean NoTrack=false;
/* так процедура работать не будет ! Ну или она не полная. Ты передаешь значение trek и меняй его или не меняй оно будет меняться только в области видимости, т.е. внутри процедуры!  Надо делать нормальную функцию
int trek_Read (int trek) {
return trek; - функция вернет номер трека, 0 - не играет, номер - любой
}
*/
void trek_Read (int trek) {
  if (digitalRead(BUSY_MP3_PIN) == 0) { // 0 - работаем // допустим! а что делать если уже получали номер этого трека ? может лучше получать только если пин равен нулю и входящая переменная trek не равена нулю ?
    trek = myDFPlayer.readCurrentFileNumber(); // читаем номер
   NoTrack=true; // не совсем понял назначение этой переменной.
    } // тут сделать обработку else для !=0, просто trac=0; сразу будет понятно , что пауза.

}
 

Gridzilla

★✩✩✩✩✩✩
29 Ноя 2019
26
14
@Старик Похабыч,
Запутался со своими скудными знаниями :))
А если так? (проверить не на чем пока, в командировке)

C++:
files = myDFPlayer.readFileCountsInFolder(3);

void play_Trek(uint8_t files) {
  myDFPlayer.stop();
  delay(100);
  myDFPlayer.playFolder(3, random(files)+1);
  delay(100);
  int fileNUM = myDFPlayer.readCurrentFileNumber();

  while (fileNUM != files) {
  myDFPlayer.playFolder(3, random(files)+1);
  delay(100);
  fileNUM = myDFPlayer.readCurrentFileNumber();
  }

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(F("ТРЕК"));
  lcd.setCursor(6, 0);
  lcd.print(fileNUM);
  lcd.setCursor(10, 0);
  lcd.print(F("ИЗ"));
  lcd.setCursor(13, 0);
  lcd.print(files);
  lcd.setCursor(0, 1);
  lcd.print(F(" ПЛЕЕР ВКЛЮЧЕН  "));

}
 

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

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
while (fileNUM != files)
вот этот цикл намертво повесит ардуину, до тех пор, пока не сменится файл , потом выведет инфу и опять повесит. если больше ничего не нужно, от контроллера, то можно и так отсавить, вроде бы все логично. но если надо что бы что то еще происходило во время проигрывания, то это неприемлемо