(Résolu) DFPlayer et affichage LCD I2C

salut à toutes et tous
je suis débutant (vraiment débutant), j'ai découvert Arduino il y a une semaine.
mon projet : une pédale avec 6 poussoirs :
Next / Play / Stop / Previous / Vol+ / Vol -
un fichier = un wave

le besoin : appuyer sur next pour incrémenter et passer au suivant et récupérer sur l'afficheur le nom du fichier.

  • 1 arduino uno
  • 6 boutons poussoirs
  • un dfplayer mp3 mini
  • une resistance 1k
  • un Lcd + 1 i2C
  • une carte sd
  • en option : un potentiomètre pour le volume.

mon petit soucis : l'affichage des fichiers lus par mon DFPlayer mini

Je souhaite afficher sur mon LCD le fichier lu avec la variable :

Serial.println(myDFPlayer.readCurrentFileNumber());
ou
myLcd.print(myDFPlayer.readCurrentFileNumber());

impossible d'afficher cela.

J'arrive à afficher sur le Lcd : Play, pause lorsque j'appuie sur le poussoir et que le lecteur est en mode play ou pause (appui sur poussoirs dédiés). Mais impossible de l'afficher (récupérer cela sur le Lcd).

Merci pour votre aide....
:grimacing: :roll_eyes: :weary:

mon code :

#include <DFRobotDFPlayerMini.h>
#include <LiquidCrystal_I2C.h>
#include "SoftwareSerial.h"
SoftwareSerial mySerial(10, 11);


# define Start_Byte 0x7E
# define Version_Byte 0xFF
# define Command_Length 0x06
# define End_Byte 0xEF
# define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]

# define ACTIVATED LOW

int buttonPlay = 4;
int buttonPause = 5;
int buttonNext = 6;
int buttonPrevious = 7;

boolean isPlaying = false;

// Create the LCD object
LiquidCrystal_I2C myLcd(0x27, 16, 2);
DFRobotDFPlayerMini myDFPlayer;

void setup () {
myLcd.begin(16, 2);  
myLcd.init();
myLcd.backlight();


pinMode(buttonPlay, INPUT);
digitalWrite(buttonPlay,HIGH);
pinMode(buttonPause, INPUT);
digitalWrite(buttonPause,HIGH);
pinMode(buttonNext, INPUT);
digitalWrite(buttonNext,HIGH);
pinMode(buttonPrevious, INPUT);
digitalWrite(buttonPrevious,HIGH);

mySerial.begin (9600);
delay(1000);
//playFirst();
isPlaying = true;//

}


void loop () { 

 if (digitalRead(buttonPause) == ACTIVATED)
  {
    if(isPlaying)
    {
      pause();
      isPlaying = false;
    }else
    {
      isPlaying = true;
      play();
      
    }
  }

  if (digitalRead(buttonPlay) == ACTIVATED)
  {
    if(isPlaying)
    {
      play();
     
    
      isPlaying = false;
    }else
    {
      isPlaying = true;
      play();
      
    }
  }


 if (digitalRead(buttonNext) == ACTIVATED)
  {
    if(isPlaying)
    {
      playNext();
    }
  }

   if (digitalRead(buttonPrevious) == ACTIVATED)
  {
    if(isPlaying)
    {
      playPrevious();
    }
  }

}
 
void pause()
{
  execute_CMD(0x16,0,0);
  delay(500);
      myLcd.setCursor(10, 0);
            myLcd.clear(); 
      myLcd.print("Pause");   
}
void play()
{
  execute_CMD(0x0D,0,1); 
  delay(500);
            myLcd.clear(); 
               myLcd.setCursor(0, 0);
      myLcd.print(myDFPlayer.readCurrentFileNumber());  
  }

void playNext()
{
  execute_CMD(0x01,0,1);
  delay(500);
  myLcd.clear();
  
}

void playPrevious()
{
  execute_CMD(0x02,0,1);
  delay(500);
  myLcd.clear();
}

void TrackNumberClear() {
  delay(500);
  myLcd.setCursor(6, 0);
  myLcd.print("   ");
  
}
void execute_CMD(byte CMD, byte Par1, byte Par2)
// Excecute the command and parameters
{
// Calculate the checksum (2 bytes)
word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);
// Build the command line
byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge,
Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte};
//Send the command line to the module
for (byte k=0; k<10; k++)
{
mySerial.write( Command_line[k]);
}
}

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

1 Like

bonjour Perry
je suis désolé mais je ne trouve pas le forum francophone....
je pense que le traducteur m'induit en erreur (traduction des menus, des liens etc...)
désolé pour l'erreur.

Bonjour gratt81 et Bienvenue sur ce Forum

le forum francophone est ici : https://forum.arduino.cc/c/international/francais/49 Les diverses langues autres que l'anglais sont dans la partie 'International'

Ton message y a déjà été transféré.

1 Like

diminué ?

Bonjour @gratt81

diminué ?

aucune idéé, le transfert se fait en principe sans modification.
(cas particulier : si le message initial était bilingue seule la partie française a été transférée ici)

Il t'est toujours possible d'éditer le message initial si des infos essentielles manquent après le transfert.

je vois pour ma part une description de montage, une description de problème et un code posté comme le demandent les "Bonnes Pratiques du Forum"

En patientant tu devrais avoir des suggestions pour faire ce que tu souhaites faire

merci à toi

voici le code pour play, pause, et incrémenter l'affichage du Lcd et l'afficher également sur le moniteur série.


#include <DFRobotDFPlayerMini.h>
#include <LiquidCrystal_I2C.h>
#include "SoftwareSerial.h"
SoftwareSerial mySerial(10, 11);


# define Start_Byte 0x7E
# define Version_Byte 0xFF
# define Command_Length 0x06
# define End_Byte 0xEF
# define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]

# define ACTIVATED LOW

int valeur = 0; // Variable où on stock la valeur du potentiomètre
int buttonPlay = 4;
int buttonPause = 5;
int buttonNext = 6;
int buttonPrevious = 7;

boolean isPlaying = false;

// Create the LCD object
LiquidCrystal_I2C myLcd(0x27, 16, 2);
DFRobotDFPlayerMini myDFPlayer;

void setup () {
  
myLcd.begin(16, 2);  
myLcd.init();
myLcd.backlight();

pinMode(buttonPlay, INPUT);
digitalWrite(buttonPlay,HIGH);
pinMode(buttonPause, INPUT);
digitalWrite(buttonPause,HIGH);
pinMode(buttonNext, INPUT);
digitalWrite(buttonNext,HIGH);
pinMode(buttonPrevious, INPUT);
digitalWrite(buttonPrevious,HIGH);

mySerial.begin (9600);
Serial.begin(115200);
delay(1000);
//playFirst();
isPlaying = true;//

Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  
  if (!myDFPlayer.begin(mySerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
  
  
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  
}


void loop () { 

// Set volume to maximum (0 to 30).
  myDFPlayer.volume(map(analogRead(A0), 0, 1023, 0, 30));
  myLcd.setCursor(10, 0);
  myLcd.print("VOL:");
  if (myDFPlayer.readVolume() < 10)
    myLcd.print(String ("0") + myDFPlayer.readVolume());
  else
    myLcd.print(myDFPlayer.readVolume());



 if (digitalRead(buttonPause) == ACTIVATED)
  {
    if(isPlaying)
    {
      pause();
      isPlaying = false;
    }else
    {
      isPlaying = true;
      play();    
    }
  }

  if (digitalRead(buttonPlay) == ACTIVATED)
  {
    if(isPlaying)
    {
      play();
     
      isPlaying = false;
    }else
    {
      isPlaying = true;
      play(); 
    }
  }

 if (digitalRead(buttonNext) == ACTIVATED)
  {
    if(isPlaying)
    {
      playNext();
    }
  }

   if (digitalRead(buttonPrevious) == ACTIVATED)
  {
    if(isPlaying)
    {
      playPrevious();
    }
  }


if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
    }
    
}

void printDetail(uint8_t type, int value){
  switch (type) {
    
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerUSBInserted:
      Serial.println("USB Inserted!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB Removed!");
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
  
} 
void pause()
{
  execute_CMD(0x16, 0, 0);
  delay(500);
  displayFileName();
  Serial.println ("Pause:");
  Serial.println (myDFPlayer.readCurrentFileNumber());
}
void play()
{
  execute_CMD(0x0D, 0, 1);
  delay(500);
  displayFileName();
  Serial.println ("Track:");
  Serial.println (myDFPlayer.readCurrentFileNumber());
}

void playNext()
{
  execute_CMD(0x01, 0, 1);
  delay(500);
  displayFileName();
  Serial.println ("Track:");
  Serial.println (myDFPlayer.readCurrentFileNumber());
}


void playPrevious()
{
  execute_CMD(0x02, 0, 1);
  delay(500);
  displayFileName();
  Serial.println ("Track:");
  Serial.println (myDFPlayer.readCurrentFileNumber());
  
}


void displayFileName()
{
  myLcd.clear();
  myLcd.setCursor(0,0);
  myLcd.print("Track :");
  myLcd.setCursor(0,1);
 
int fileNumber = myDFPlayer.readCurrentFileNumber();
  switch (fileNumber)
  {
    case 1:
      myLcd.print("musique1.mp3");
      break;
    case 2:
      myLcd.print("musique2.mp3");
      break;
    case 3:
      myLcd.print("musique3.mp3");
      break;
    case 4:
      myLcd.print("musique4.mp3");
      break;
    case 5:
      myLcd.print("musique5.mp3");
      break;
    default:
      break;
  }
  
}


void execute_CMD(byte CMD, byte Par1, byte Par2)
// Excecute the command and parameters
{
// Calculate the checksum (2 bytes)
word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);
// Build the command line
byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge,
Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte};
//Send the command line to the module
for (byte k=0; k<10; k++)
{
mySerial.write( Command_line[k]);
}
}

Je cherche la solution maintenant (mais j'ai fait un sujet) pour afficher le next et previous du dfplayer (récupérer la pin IO_1 et IO_2)
si quelqu'un a une idée...
merci