(résolu) - DFPlayer et volume par potentiometre

salut à toutes et tous.

mon projet de pédale backingtrack arrive bientôt au bout.
j'ai toujours un ptit problème dans mon code pour régler le volume avec le potentiomètre.
Il est branché sur la broche A0 de l'arduino Uno.

Une âme charitable pour un coup de main pour me trouver l'erreur qui me fait planter le DFplayer ou l'arduino. Les deux deviennent incontrôlables : action sur les pédales inutile et affichage Led en vrille.
Merci d'avance.
Voici le code pour gérer le potentiomètre et le DFplayer :

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());

le code total :

#include <LiquidCrystal_I2C.h>
// Create the LCD object
LiquidCrystal_I2C myLcd(0x27, 16, 2);

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySerial(10, 11); // RX, TX
# 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]


DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

int PinButtonPrevious = 3;
int PinButtonPlay = 4;
int PinButtonStop = 5;
int PinButtonNext = 6;
int PinButtonReset = 7;

boolean isPlaying = true;
# define ACTIVATED LOW

void setup()
{
  myLcd.init(); 
  myLcd.backlight();
  mySerial.begin(9600);
  Serial.begin(115200);

  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);
  }
  Serial.println(F("DFPlayer Mini online."));
  myLcd.print("Ready");
  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms

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


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

  //----Set device we use SD as default----
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);

//  myDFPlayer.reset();     //Reset the module


  //----Read imformation----
  Serial.println(myDFPlayer.readState()); //read mp3 state
  Serial.println(myDFPlayer.readVolume()); //read current volume
  Serial.println(myDFPlayer.readEQ()); //read EQ setting
  Serial.println(myDFPlayer.readFileCounts()); //read all file counts in SD card
  Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
  Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read fill counts in folder SD:/03

pinMode(PinButtonPlay, INPUT_PULLUP);
pinMode(PinButtonStop, INPUT_PULLUP);
pinMode(PinButtonNext, INPUT_PULLUP);
pinMode(PinButtonPrevious, INPUT_PULLUP);
pinMode(PinButtonReset, INPUT_PULLUP);
}

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(PinButtonPlay) == ACTIVATED)
    {
      play();
    }
 if (digitalRead(PinButtonStop) == ACTIVATED)
    {
      stop();
    }    
 if (digitalRead(PinButtonNext) == ACTIVATED)

    {
      playNext();
    }
 if (digitalRead(PinButtonPrevious) == ACTIVATED)

    {
      playPrevious();
    }   

 if (digitalRead(PinButtonReset) == ACTIVATED)
    {
      reset();
    }
    
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 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 stop()
{
  execute_CMD(0x16,0,0);
  delay(500);
  Serial.println ("Stoppé:");
    myLcd.clear();
  myLcd.setCursor(0,0);
  myLcd.print("Stop de :");
  myLcd.setCursor(0,1);
  displayFileName();
}

void play()
{
  execute_CMD(0x0D,0,0); 
  delay(500); 
  Serial.println ("Play:");
    myLcd.clear();
  myLcd.setCursor(0,0);
  myLcd.print("Playing...");
  myLcd.setCursor(0,1);
  displayFileName();
}

void playNext()
{
  execute_CMD(0x01,0,0);
  delay(500);
  Serial.println ("Next :");
    myLcd.clear();
  myLcd.setCursor(0,0);
  myLcd.print("Playing...");
  myLcd.setCursor(0,1);
  displayFileName();
 
}

void playPrevious()
{
  execute_CMD(0x02,0,0);
  delay(500);
  Serial.println ("Clic Previous :"); 
  myLcd.clear();
  myLcd.setCursor(0,0);
  myLcd.print("Playing...");
  myLcd.setCursor(0,1);
  displayFileName();
  
}

void reset()
    {
    execute_CMD(0x0C,0,0);
    }

void displayFileName()
{
    
    
       
int fileNumber = myDFPlayer.readCurrentFileNumber();
  switch (fileNumber)
  {
    case 1:
      myLcd.print("Manu All");
      Serial.println ("musique1.mp3");
      break;
    case 2:
      myLcd.print("Manu Saxs");
      Serial.println ("musique2.mp3");
      break;
    case 3:
      myLcd.print("Manu Batterie ");
      Serial.println ("musique3.mp3");
      break;
    case 4:
      myLcd.print("Renaud");
      Serial.println ("musique4.mp3");
      break;
    case 5:
      myLcd.print("Clandestino");
      Serial.println ("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]);
}
}    

Changez de ligne

myDFPlayer.volume(map(analogRead(A0), 0, 1023, 0, 30));

à cet autre

int vol = map(analogRead(A0), 0, 1024, 0, 30);
if (vol < 0) {vol = 0;}
if (vol > 30) {vol = 30;}
myDFPlayer.volume(vol);

La fonction map est un peu bizarre et donne parfois des valeurs hors de la plage que vous définissez, voyons si c'est le cas.

merci à toi pour ton aide ...c'est super gentil...

error: expected ',' or ';' before 'if'
 if (vol < 0) {vol = 0;}
 ^~
exit status 1
expected ',' or ';' before 'if'

D'accord, j'en avais mangé un ; vous l'avez déjà réparé.

int vol = map(analogRead(A0), 0, 1024, 0, 30);

alors pareil : beug.... :weary:

@gonpezzi il y a un détail qui me chagrine dans le code :

en fait, les if qui suivent sont dans la suite logique du code et j'ai peur que l'arduino interprête cela comme la condition qui découle.... non ? (une suite de if..)
j'ai mis entre /...../ le code qui fait planter.

// 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(PinButtonPlay) == ACTIVATED)
    {
      play();
    }
 if (digitalRead(PinButtonStop) == ACTIVATED)
    {
      stop();
    }    
 if (digitalRead(PinButtonNext) == ACTIVATED)

    {
      playNext();
    }
 if (digitalRead(PinButtonPrevious) == ACTIVATED)

    {
      playPrevious();
    }   

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



Que if-else est mal écrit, il devrait ressembler à ceci :

if (myDFPlayer.readVolume() < 10) {
    myLcd.print(String ("0") + myDFPlayer.readVolume());
}
  else {
    myLcd.print(myDFPlayer.readVolume());
}

il te manquait toutes les parenthèses

@gonpezzi j'avais essayé cela... résultat identique.
pour afficher et changer le volume j'ai compilé un nouveau code car celui là ne fonctionne pas et fait planter le dfplayer et l'arduino, mais c'est pas parfait.
pourrais-tu m'expliquer ce code (ou someone else) ? merci à toi (et aux autres.

int valvolume = analogRead(potvolume);
    
  valvolume = map(valvolume, 0, 1023, 0, 30);
  myLcd.setCursor(10, 0);
  myLcd.print("VOL:");
  if(Valvolume != valvolume){
    myDFPlayer.volume(valvolume); 
    Valvolume = valvolume;
    if (myDFPlayer.readVolume() < 10) {
    myLcd.print(String ("0") + myDFPlayer.readVolume());
}
  else {
    myLcd.print(myDFPlayer.readVolume());      
  }
int valvolume = analogRead(potvolume); // Lecture du potentiomètre connecté à la broche potvolume
// "Carte". convertit les valeurs de potentiomètre lues de 0 à 1023
// ceux que le DFplayer comprend de 0 à 30
valvolume = map(valvolume, 0, 1023, 0, 30);
// cette fonction ne fonctionne pas très bien et dans les lectures proches de 0, elle peut donner des valeurs négatives
// et environ 1023 valeurs supérieures à celles indiquées dans la fonction, j'aime bien rajouter
// toujours les deux prochains IF pour éviter les erreurs
if (valvolume < 0 ) {
  valvolume = 0;
}
if (valvolume > 1023 ) {
  valvolume = 1023;
}

myLcd.setCursor(10, 0);// Préparer l'écran LCD à écrire sur le caractère 10, ligne 0
myLcd.print("VOL:");// Ecrire VOL : au caractère 10, ligne 0
if (Valvolume != valvolume) {// Vérifie si Valvolumen est différent du nouveau lu, Valvolumen est une lecture précédente
  // s'il a été différent, (le potentiomètre a été déplacé)
  myDFPlayer.volume(valvolume); // 1º ous l'envoyons à DFplayer
  Valvolume = valvolume;//2º nous enregistrons la nouvelle valeur dans Valvolume pour des vérifications ultérieures.
  // 3º Nous préparons l'impression du volume qui suivra VOL :, il ira au caractère 15 ligne 0
  // Ce qui suit est faux, nous devons utiliser la lecture déjà effectuée et mappée, pas une nouvelle non mappée
  /*
    if (myDFPlayer.readVolume() < 10) {//2º
    myLcd.print(String ("0") + myDFPlayer.readVolume());
    }
    else {
    myLcd.print(myDFPlayer.readVolume());
    }
  */
 // Cela ressemblerait à ceci : 
  if (valvolume < 10) {// 3º s'il est inférieur à 10 c'est qu'il a un seul caractère. 
    myLcd.print("0");// On ajoute un zéro non significatif pour occuper deux caractères. 
    myLcd.print(valvolume);// On imprime le volume 
  }
  else {// c'est 10 ou plus il a déjà les deux caractères 
    myLcd.print(valvolume); // on l'imprime directement 
  }
 // Et rien de plus.

@gonpezzi je te remercie grandement.
tu as résolu mes problèmes.
la pédale est maintenant pleinement fonctionnelle et sans beug. tout est affiché avec succès.
merci à toi. vraiment.

alors petite perf, il n'affiche pas le volume de lui-même, il faut tourner de nouveau le potentiometre pour afficher la valeur de "VOL".

initialisez Valvolume à une valeur arbitraire différente de ce que vous allez lire la première fois pour pouvoir rentrer dans le test

if (Valvolume != valvolume) {
  ..

merci @J-M-L mais...je suis débutant et je ne sais pas où l'écrire.

postez tout le code (avec les balises)

oui c'est ce que je me disait.
parce qu'en fait, dans ma fonction play(), je fais un my Lcd.clear donc il vire l'afichage du volume...précédemment enregistré....

voici le code...et merci J-M-L

#include <avr/wdt.h>
#include <LiquidCrystal_I2C.h>
// Create the LCD object
LiquidCrystal_I2C myLcd(0x27, 16, 2);

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySerial(10, 11); // RX, TX
# 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]

DFRobotDFPlayerMini myDFPlayer;


int PinButtonPrevious = 3;
int PinButtonPlay = 4;
int PinButtonStop = 5;
int PinButtonNext = 6;
int PinButtonReset = 7;

int potvolume = A0;      //Broche du potentiomètre volume
int Valvolume = 20;

boolean isPlaying = true;
# define ACTIVATED LOW

void setup()
{
  myLcd.init(); 
  myLcd.backlight();
  mySerial.begin(9600);
  Serial.begin(115200);

  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);
  }
  Serial.println(F("DFPlayer Mini online."));
  myLcd.print("Ready");
  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms

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


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

  //----Set device we use SD as default----
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);

//  myDFPlayer.reset();     //Reset the module

pinMode(PinButtonPlay, INPUT_PULLUP);
pinMode(PinButtonStop, INPUT_PULLUP);
pinMode(PinButtonNext, INPUT_PULLUP);
pinMode(PinButtonPrevious, INPUT_PULLUP);
pinMode(PinButtonReset, INPUT_PULLUP);


}

void loop(){

/////Gestion Bouton volume /////////////////////////////////////////////
  int valvolume = analogRead(potvolume);
    
 myLcd.setCursor(10, 0);
  myLcd.print("VOL:"); 
  valvolume = map(valvolume, 0, 1024, 0, 30);
  if(Valvolume != valvolume){
    myDFPlayer.volume(valvolume); 
    Valvolume = valvolume;
    if (valvolume < 10) {
    myLcd.print("0");
    myLcd.print(valvolume);
}
  else {
    myLcd.setCursor(10, 0);
  myLcd.print("VOL:");
    myLcd.print(valvolume);      
  }
 }
int PinButtonPlay = digitalRead(4);    
 if (digitalRead(4) == ACTIVATED)
    {
      play();
    }
int PinButtonStop = digitalRead(5);     
 if (digitalRead(5) == ACTIVATED)
    {
      stop();
    } 
int PinButtonNext = digitalRead(3);        
 if (digitalRead(3) == ACTIVATED)

    {
      playNext();
    }
int PinButtonPrevious = digitalRead(6);     
 if (digitalRead(6) == ACTIVATED)

    {
      playPrevious();
    }   
int PinButtonReset = digitalRead(7); 
 if (digitalRead(7) == ACTIVATED)
    {
      Serial.print("Reset");
      software_Reboot();
      
    }
    
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 DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      myLcd.clear();
      myLcd.setCursor(0,0);
      myLcd.print(F("Piste : "));
      myLcd.setCursor(7,0);
      myLcd.print(value);
      myLcd.setCursor(0,1);
      myLcd.print(F("Impeccable !"));
      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 software_Reboot()
{
  wdt_enable(WDTO_15MS);

  while(1)
  {

  }
   
   }
     
void stop()
{
  execute_CMD(0x16,0,0);
  delay(500);
  Serial.println ("Stoppé:");
  myLcd.clear();
  myLcd.setCursor(0,0);
  myLcd.print("Stop de :");
  myLcd.setCursor(0,1);
  displayFileName();
}

void play()
{
  execute_CMD(0x0D,0,0); 
  delay(500); 
  Serial.println ("Play:");
    myLcd.clear();
  myLcd.setCursor(0,0);
  myLcd.print("Playing...");
  myLcd.setCursor(0,1);
  displayFileName();
}

void playNext()
{
  execute_CMD(0x01,0,0);
  delay(500);
  Serial.println ("Next :");
    myLcd.clear();
  myLcd.setCursor(0,0);
  myLcd.print("Playing...");
  myLcd.setCursor(0,1);
  displayFileName();
 
}

void playPrevious()
{
  execute_CMD(0x02,0,0);
  delay(500);
  Serial.println ("Clic Previous :"); 
  myLcd.clear();
  myLcd.setCursor(0,0);
  myLcd.print("Playing...");
  myLcd.setCursor(0,1);
  displayFileName();
  
}


void displayFileName()
{
      
int fileNumber = myDFPlayer.readCurrentFileNumber();
  switch (fileNumber)
  {
    case 1:
      myLcd.print("Manu All");
      Serial.println ("musique1.mp3");
      break;
    case 2:
      myLcd.print("Manu Saxs");
      Serial.println ("musique2.mp3");
      break;
    case 3:
      myLcd.print("Manu Batterie ");
      Serial.println ("musique3.mp3");
      break;
    case 4:
      myLcd.print("Renaud");
      Serial.println ("musique4.mp3");
      break;
    case 5:
      myLcd.print("Clandestino");
      Serial.println ("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]);
}
}    

ben oui, vous affichez la nouvelle piste lue...

donc il faut que vous décidiez quand / comment le volume doit revenir... ou alors comme ça s'affiche en 10,0 - je suppose que c'est compatible avec les autres affichages ?

dans ce cas on peut "tricher un peu" (c'est bourin) et utiliser un bool qui va dire si on a besoin d'un refresh du volume (que l'on met à vrai à chaque fois que l'on fait un clear).

#include <avr/wdt.h>
#include <LiquidCrystal_I2C.h>
// Create the LCD object
LiquidCrystal_I2C myLcd(0x27, 16, 2);

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySerial(10, 11); // RX, TX
# 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]

DFRobotDFPlayerMini myDFPlayer;


const byte PinButtonPrevious = 3;
const byte PinButtonPlay = 4;
const byte PinButtonStop = 5;
const byte PinButtonNext = 6;
const byte PinButtonReset = 7;

int potvolume = A0;      //Broche du potentiomètre volume
int Valvolume = 20;
bool refreshNeeded = true;

boolean isPlaying = true;
# define ACTIVATED LOW

void setup() {
  myLcd.init();
  myLcd.backlight();
  mySerial.begin(9600);
  Serial.begin(115200);

  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);
  }
  Serial.println(F("DFPlayer Mini online."));
  myLcd.print("Ready");
  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms

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


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

  //----Set device we use SD as default----
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);

  //  myDFPlayer.reset();     //Reset the module

  pinMode(PinButtonPlay, INPUT_PULLUP);
  pinMode(PinButtonStop, INPUT_PULLUP);
  pinMode(PinButtonNext, INPUT_PULLUP);
  pinMode(PinButtonPrevious, INPUT_PULLUP);
  pinMode(PinButtonReset, INPUT_PULLUP);


}

void loop() {

  /////Gestion Bouton volume /////////////////////////////////////////////
  int valvolume = analogRead(potvolume);

  valvolume = map(valvolume, 0, 1024, 0, 30);

  if (refreshNeeded || (Valvolume != valvolume)) {
    Valvolume = valvolume;
    myDFPlayer.volume(valvolume);
    myLcd.setCursor(10, 0);
    myLcd.print("VOL:");
    if (valvolume < 10) myLcd.write('0');
    myLcd.print(valvolume);
    refreshNeeded = false;
  }

  int PinButtonPlay = digitalRead(4);
  if (digitalRead(4) == ACTIVATED)
  {
    play();
  }
  int PinButtonStop = digitalRead(5);
  if (digitalRead(5) == ACTIVATED)
  {
    stop();
  }
  int PinButtonNext = digitalRead(3);
  if (digitalRead(3) == ACTIVATED)

  {
    playNext();
  }
  int PinButtonPrevious = digitalRead(6);
  if (digitalRead(6) == ACTIVATED)

  {
    playPrevious();
  }
  int PinButtonReset = digitalRead(7);
  if (digitalRead(7) == ACTIVATED)
  {
    Serial.print("Reset");
    software_Reboot();

  }

  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 DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      myLcd.clear();
      refreshNeeded = true;
      myLcd.setCursor(0, 0);
      myLcd.print(F("Piste : "));
      myLcd.setCursor(7, 0);
      myLcd.print(value);
      myLcd.setCursor(0, 1);
      myLcd.print(F("Impeccable !"));
      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 software_Reboot() {
  wdt_enable(WDTO_15MS);
  while (true);
}

void stop()
{
  execute_CMD(0x16, 0, 0);
  delay(500);
  Serial.println ("Stoppé:");
  myLcd.clear();
  refreshNeeded = true;
  myLcd.setCursor(0, 0);  myLcd.print(F("Stop de :"));
  myLcd.setCursor(0, 1);  displayFileName();
}

void play()
{
  execute_CMD(0x0D, 0, 0);
  delay(500);
  Serial.println ("Play:");
  myLcd.clear();
  refreshNeeded = true;
  myLcd.setCursor(0, 0);  myLcd.print(F("Playing..."));
  myLcd.setCursor(0, 1);  displayFileName();
}

void playNext()
{
  execute_CMD(0x01, 0, 0);
  delay(500);
  Serial.println ("Next :");
  myLcd.clear();
  refreshNeeded = true;
  myLcd.setCursor(0, 0);  myLcd.print(F("Playing..."));
  myLcd.setCursor(0, 1);  displayFileName();
}

void playPrevious()
{
  execute_CMD(0x02, 0, 0);
  delay(500);
  Serial.println ("Clic Previous :");
  myLcd.clear();
  refreshNeeded = true;
  myLcd.setCursor(0, 0);  myLcd.print(F("Playing..."));
  myLcd.setCursor(0, 1);  displayFileName();
}


void displayFileName() {
  int fileNumber = myDFPlayer.readCurrentFileNumber();
  switch (fileNumber) {
    case 1:
      myLcd.print(F("Manu All"));
      Serial.println(F("Manu All"));
      break;
    case 2:
      myLcd.print(F("Manu Saxs"));
      Serial.println(F("Manu Saxs"));
      break;
    case 3:
      myLcd.print(F("Manu Batterie"));
      Serial.println(F("Manu Batterie"));
      break;
    case 4:
      myLcd.print(F("Renaud"));
      Serial.println(F("Renaud"));
      break;
    case 5:
      myLcd.print(F("Clandestino"));
      Serial.println(F("Clandestino"));
      break;
    default:
      break;
  }
}

// Excecute the command and parameters
void execute_CMD(byte CMD, byte Par1, byte Par2) {
  // 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
  mySerial.write(Command_line, sizeof Command_line);
}

idéalement il ne faudrait pas faire de clear mais juste effacer les zones qui doivent être remplacées.

Sinon pourquoi faire deux fois les digitalRead() ici ??

  int PinButtonPlay = digitalRead(4);
  if (digitalRead(4) == ACTIVATED)
  {
    play();
  }
  int PinButtonStop = digitalRead(5);
  if (digitalRead(5) == ACTIVATED)
  {
    stop();
  }
  int PinButtonNext = digitalRead(3);
  if (digitalRead(3) == ACTIVATED)

  {
    playNext();
  }
  int PinButtonPrevious = digitalRead(6);
  if (digitalRead(6) == ACTIVATED)
  {
    playPrevious();
  }
  int PinButtonReset = digitalRead(7);
  if (digitalRead(7) == ACTIVATED)
  {
    Serial.print("Reset");
    software_Reboot();
  }

(et pourquoi utiliser directement les N° de pins alors que vous leur avez donné un petit nom)

en fait j'avais modifié le code pour pouvoir isoler les "If".
je pensais que entre la fonction potentiometre et les diffrents if cela causait des problèmes...
c'est pour cela que je les avais isolés en "int"

en plus vous faites

  int PinButtonNext = digitalRead(3);
  if (digitalRead(3) == ACTIVATED)  {
    playNext();
  }

mais la pin 3 est définie comme PinButtonPrevious = 3;

➜ est-ce le bon bouton.... en utilisant les noms ça sauterait aux yeux

oui petite erreur d'attribution de bouton... merci

comment justement effacer que la deuxième ligne du LCD ?