Как правильно обработать ошибки взятые из библиотеки DFRobotDFPlayerMini, или почему у меня не получается корректно их обработать?

Похоже кому-то просто нечем заняться 1 января…

3 лайка

Буму))

Ну , и?

P.S. И ещё. Странно, что я сразу не обратил внимание на это:

Спойлер

Такой подход не годится.
Многократное обращение к плееру в условии?
Пока будем обращаться к плееру, очередной раз, ситуация может измениться. Отсюда и разночтения.

Надо примерно так: один раз на проход loop() опрашиваем плеер, и сохраняем значения в переменные.
Потом с ними работаем в условии.

Спойлер
	        static uint8_t rdType = 0; 
static uint16_t Rd = 0;
				  
				   if (myDFPlayer.available()) {
                        printDetail(myDFPlayer.readType(), myDFPlayer.read());
                   // Serial.println(ase);//Вывести подробное      сообщение от DFPlayer для обработки
// различных ошибок и состояний.  
                  }
				 /* 
				    rdType = readType();
				    Rd = read();
				  */                      //   Выбрать какой нибудь   вариант
				  
				  rdType = myDFPlayer.readType();
				  Rd = myDFPlayer.read();
				  
				   if (rdType == 3 && Rd == 0) {
                    //Если карта памяти не вставлена, то вывжу json инфу об этом клиенту
                    doc["SD"] = "mp3";
                    doc["MP3"] = ID;
                    doc["statusText"] = "Карта памяти не вставлена! 0000";
                    doc["status"] = false;
                  } else {
                    Serial.println();
                    Serial.print(rdType);
                    Serial.print("|");
                    Serial.print(Rd);
                    Serial.println();


                    if (rdType == 6 && Rd == 6) {
                      //Если файла нет
                      doc["SD"] = "mp3";
                      doc["MP3"] = ID;
                      doc["statusText"] = "Такого файла нет! 0";
                      doc["status"] = false;
                      doc["E1"] = rdType;
                      doc["E2"] = Rd;
                    } else if (rdType == 5 && Rd == 1) {
                      //Если файл есть
                      doc["SD"] = "mp3";
                      doc["MP3"] = ID;
                      doc["statusText"] = "Файл воспроизводится! 1";
                      doc["status"] = true;
                      doc["E1"] = rdType;
                      doc["E2"] = Rd;
                    } else {
                      //Если что то пошло не так
                      doc["SD"] = "mp3";
                      doc["MP3"] = ID;
                      doc["statusText"] = "Произошла не известная ошибка!";
                      doc["status"] = false;
                      doc["E1"] = rdType;
                      doc["E2"] = Rd;
                    }
                  }

Заведите уже enum’ы, сами то помните что всё эти цифры (5/6/0/3 и тд) означают?

Есть же комментарии))
Стараюсь исправлять “родной” код как можно меньше, самое необходимое. Или это будет уже другой код
А так да, в библиотеке уже есть дефайны, можно пользоваться

Спасибо что выделяете время, что то советуете. К сожлению я пока не решил проблему, но по экспериментировав немного, я пришел к такому мнению, что статус воспроизведения происходит в следующем цикле loop после воспроизведения mp3. Как это профиксить, не могу понять.
что я сделал?

if (GET == "dir") {
       if (DIR == "mp3") {
            //если я пытаюсь запустить файл из папки mp3
            if (GET1 == "name") {  //Проверяю название параметра
                if (ID > 0) {  
                      myDFPlayer.playMp3Folder(ID);
                      if (myDFPlayer.available()) {
                          rdType = myDFPlayer.readType();
	                  Rd = myDFPlayer.read();
                         printDetail(rdType, Rd);// тут тоже выводит предыдущее значение
                         Serial.println(rdType );
                         Serial.println(Rd );  
                        doc["SD"] = "mp3";
                       serializeJsonPretty(doc, client);
                      }
                     break;
                 }
            }
       }
}

в этом случае у меня воспроизводит несколько раз аудио, но страница с json не загружается. так же я пробовал делать паузу после воспроизведения аудио, так же… У меня получилось пру рааз профиксить эту проблему, когд я раз 5 запускал mp3, типа такого:

myDFPlayer.volume(0);delay(30);
myDFPlayer.playMp3Folder(ID);delay(30);
myDFPlayer.playMp3Folder(ID);delay(30);
myDFPlayer.playMp3Folder(ID);delay(30);
myDFPlayer.playMp3Folder(ID);delay(30);
myDFPlayer.playMp3Folder(ID);
myDFPlayer.volume(30);

но даже в этом случае я как правило получал не всегда верные данные.

if (!myDFPlayer.begin(mySoftwareSerial, false, true)) {

использовав этот код у меня просто ничего не происходит

наверное придется делать редирект и следующим циклом получть значения…

Для понимания происходящего необходим кратенький скетч, в котором следует:
a) дать команду плееру;
b) покрутится в цикле, считывая и выводя в дебаг статусы и время их смены.

Таким образом получите таймлайн, на котором будут отмечены как все стадии процессинга плеера, их длительность и задержки между ними.

После этого чешите голову - уложить их в конечный автомат или пары дилэев достаточно будет.

1 лайк

Жаль нет у меня такого плеера, было бы всё проще…
Попробуйте так

Спойлер
if (GET == "dir") {
       if (DIR == "mp3") {
            //если я пытаюсь запустить файл из папки mp3
            if (GET1 == "name") {  //Проверяю название параметра
                if (ID > 0) {  
                      myDFPlayer.playMp3Folder(ID);
					  //=======================================
					   uint8_t waitmr = 0;
					   //ждём плеер
                      while (!myDFPlayer.available() && waitmr++ < 100))//100*4=400мс
						       delay(4);//Подобрать таймаут выхода из ожидания
						//=====================================
                         if (myDFPlayer.available()) {						
                         rdType = myDFPlayer.readType();
	                     Rd = myDFPlayer.read();
                         printDetail(rdType, Rd);// тут тоже выводит предыдущее значение
                         Serial.println(rdType );
                         Serial.println(Rd );  
                         doc["SD"] = "mp3";
						   doc["E1"] = rdType;
                         doc["E2"] = Rd;
                         serializeJsonPretty(doc, client);
						 }
                     break;// )))
                 }
            }
       }
}

Сама железка, вроде бы, ничем не отличается от такой:

Увы, никакой нет))

Закажи. Не дорого. Я для экспериментов брал ))

1 лайк