DFPlayer : lecture interrompue ...LOW PIN (BUSY MODE)

Bonjour,

j'ai lu sur le forum que la lecture d'un DFPlayer est non bloquante et il semble que lorsque j'enchaine des lectures de son sans attendre leur fin au bout d'un moment le process de lecture déraille : son qui ne déclenchent plus ou très brièvement.

Le DFPlayer a un PIN BUSY qui est LOW lorsque la lecture est en cours si j'ai bien compris. Dois-je gérer cela pour stopper une lecture en cours avant d'en démarrer une autre?

A quoi sert ce pin au final, on pourrait très bien faire un STOP suivi d'un PLAY non.
Vos avis bienvenus avant que je doive tout tester ...

La ref :
https://github.com/DFRobot/DFRobotDFPlayerMini/blob/master/examples/FullFunction/FullFunction.ino

Mon code


#include "HardwareSerial.h"
#include "DFRobotDFPlayerMini.h"  //lib native du DFPLAYER par la cnie DFRobot

const byte RXD2 = 16;  // Connects to module's RX
const byte TXD2 = 17;  // Connects to module's TX


HardwareSerial dfSD(1);  // Use UART channel 1
DFRobotDFPlayerMini player;

void setup() {
  //Serial1.begin(9600, SERIAL_8N1,16,17);//RX,TX sur le port serial1 qui est le 3eme UART du SAOLA S2, voir https://forum.arduino.cc/t/comment-utiliser-avec-esp32s2-laffichage-sur-port-serie/941511/21?u=romainl
  Serial0.begin(115200);                        // Use UART channel 0 pour la connexion USB et les retours print() dans la console
  Serial0.println("Salut, je suis une vroum");  //test


  //Use hardware Serial pour la com avec DFPLAYER
  dfSD.begin(9600, SERIAL_8N1, RXD2, TXD2);  // 16,17
  delay(5000);

  if (player.begin(dfSD)) {
    Serial0.println("liaison UART avec DFPLAYER OK !");

    // Set volume to maximum (0 to 30).
    player.volume(25);  //30 is very loud
  } else {
    Serial0.println("Connecting to DFPlayer Mini failed!");
  }
}

void loop() {
  if (Serial0.available() > 0) {      // Vérifie s'il y a des données disponibles
    char caractere = Serial0.read();  // Lit le caractère entrant en code ascii

    //Serial0.print(caractere);
    Serial0.printf("la touche tapée est : %c", caractere);
    Serial0.println();

    if (isdigit(caractere)) {             // Vérifie si le caractère est un chiffre
      uint16_t nombre = caractere - '0';  // Convertit le caractère en un entier
                                          //en ascii le nombre 0 a pour code 48 , en soustrayant 48 du nombre entrant on obtient le bon nombre et pas le code ascii qui est un nombre 48x plus élevé
    //Le fichier son est joué en son entier à moins qu'on appelle un nouveau numéro
     player.play(nombre);

      //Serial0.print(nombre);
      //ici comme nombre est un nombre, le format doit être %d
      Serial0.printf("le nombre correspondant est : %d", nombre);
      Serial0.println();
    }
  }
}

Un autre topic suggère que le PIN BUSY permet qu'on attende la fin de l'allumage du player.
Au final BUSY = occupé en initialisation ou lors de la lecture courante ...?
Comment savoir la fonction de ce PIN ?

En lisant la datasheet :wink:

En effet, c'est une réponse. On se demanderait presque à quoi servent les forums :sweat_smile:

En revanche la doc n'explique pas le comportement du chip.
Je vais tenter avec un stop avant un nouveau play

Low means playing \High means no

Cela me semble clair pourtant.

https://github.com/DFRobot/DFRobotDFPlayerMini/blob/master/examples/FullFunction/FullFunction.ino

T'es tu posé la question de savoir à quoi pouvait servir l'événement DFPlayerPlayFinished dans cet exemple ?

Est-ce la fonction qui retourne l'état du BUSY PIN ?

Tu dois connaître digitalRead(), non ?

Ah oui c'est cette fonction digitalRead() qui lit la valeur d'un pin.
Donc comment sait-on à quoi sert DFPlayerPlayFinished ?

Lis le code de l'exemple FullFunction.ino que tu cites toi-même dans ta demande.

Oui je me pose la question mais je ne vois pas de commentaire d'explication dans ce code concernant cette fonction si ce n'est la façon dont on y fait appel :

case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;

Si tu as besoin d'explications sur un code aussi simple,il faut tout revoir en partant des bases du langage.

Si c'est un problème de traduction c'est grave.

ce n'est pas une fonction, donc on n'y fait pas appel.
c'est la fonction readType, qui renvois le type d'une valeur et read la valeur contenu dans le message envoyé par le module.
Donc le code contenant le "switch" est là pour afficher sur le moniteur série, l'évènement reçu et sa valeur si cela à un sens.

Okay je comprends mieux, merci :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.