Bonjour tous le monde ![]()
Je travail sur un projet avec un DfPlayer commandé par un Arduino pour commander la musique, le volume et la durée de la musique.
Le schéma est assé simple. un bus de dialogue entre l'Arduino et le DfPlayer (TX, RX et Busy pour la fin de la chanson) et deux potentiomètre pour géré le volume et la durée de la musique.
Nota : Par rapport au schéma le Busy est connecté à D8.
J'ai écris le code qui fonctionne à 99%
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(11, 10); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
#define LED_PIN 13
#define BUSY_PIN 8
int busyState = 0;
int prevBusyState = 0;
int ValVolume =0;
unsigned long Duree = 0;
int AncienneDuree = 5;
int NbrDeChanson = 0;
int NumeroChanson = 1;
int Debut = 0;
int ValDuree = 0;
unsigned long timer;
void setup()
{
pinMode( LED_PIN, OUTPUT );
pinMode( BUSY_PIN, INPUT_PULLUP );
mySoftwareSerial.begin(9600);
Serial.begin(9600);
Serial.println("Début");
Serial.println(myDFPlayer.begin(mySoftwareSerial));
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
while(true){
Serial.println("blocage"); // debug value
delay(0); // Code to compatible with ESP8266 watch dog.
}
}
// Nombre de chanson
NbrDeChanson = myDFPlayer.readFileCountsInFolder(1);
Serial.println("NbrDeChanson");
Serial.println(NbrDeChanson);
// initialisation timer
timer = millis();
// reglage du volume
ValVolume = analogRead(A1)*30/1024;// Tension Durée
myDFPlayer.volume (ValVolume);
// Mesure Durée
ValDuree = analogRead(A0)*6/1024;
if (ValDuree == 0) {
Duree = 5*60000;
}
if (ValDuree == 1) {
Duree = 10*60000 ;
}
if (ValDuree == 2) {
Duree = 15*60000 ;
}
if (ValDuree == 3) {
Duree = 20*60000 ;
}
if (ValDuree == 4) {
Duree = 30*60000 ;
}
if (ValDuree == 5) {
Duree = 45*60000 ;
}
AncienneDuree = ValDuree ;
// assume we need a delay to give the player time to start playing the initial track
delay( 1000 );
// initialise the BUSY states
busyState = digitalRead( BUSY_PIN );
//busyState = 1;
prevBusyState = busyState;
Aleatoire();
}
void loop()
{
ValVolume = analogRead(A1)*30/1024;// Tension Volume
myDFPlayer.volume (ValVolume);
ValDuree = analogRead(A0)*6/1024;// Tension Durée
if (ValDuree !=AncienneDuree) {
if (ValDuree == 0) {
myDFPlayer.playMp3Folder(5);
Serial.println("5 minutes");
Duree = 5*60000 ;
}
if (ValDuree == 1) {
myDFPlayer.playMp3Folder(10);
Serial.println("10 minutes");
Duree = 10*60000 ;
}
if (ValDuree == 2) {
myDFPlayer.playMp3Folder(15);
Serial.println("15 minutes");
Duree = 15*60000 ;
}
if (ValDuree == 3) {
myDFPlayer.playMp3Folder(20);
Serial.println("20 minutes");
Duree = 20*60000 ;
}
if (ValDuree == 4) {
myDFPlayer.playMp3Folder(30);
Serial.println("30 minutes");
Duree = 30*60000 ;
}
if (ValDuree == 5) {
myDFPlayer.playMp3Folder(45);
Serial.println("45 minutes");
Duree = 45*60000 ;
}
AncienneDuree = ValDuree ;
// Attendre que le texte se termine
delay (1000);
// Relancer la lecture
Aleatoire();
}
// copy the state of the BUSY pin onto the UNO built-in LED
busyState = digitalRead( BUSY_PIN );
digitalWrite( LED_PIN, busyState );
// has the player BUSY pin changed state?
if ( busyState != prevBusyState ) {
// state change - has the player stopped playing?
if ( busyState == HIGH ) {
Aleatoire();
}
prevBusyState = busyState;
}
Serial.println(millis());
Serial.println(Duree);
if (millis() - timer > Duree) {
myDFPlayer.pause() ;
}
delay( 2000 );
}
void Aleatoire () {
NumeroChanson = random(1,NbrDeChanson+1);
Serial.println("Numéro chanson");
Serial.println(NumeroChanson);
// Serial.println(millis());
if (millis() - timer > Duree) {
myDFPlayer.pause() ;
}
else {
myDFPlayer.playLargeFolder(1, NumeroChanson);
delay(500);
myDFPlayer.next();
delay(500);
}
}
Dans la carte SD j'ai deux répertoires. L'un (01) pour la musique et l'autre (MP3) contiens des fichiers son qui indique la durée (5 minutes, 10 minutes, ...)
Il fonctionne à 99% mais j'ai deux fonctionnement a peux prêt identique et inattendue.
1) Quant je fait un reset il y a une lecture du premier MP3 alors que je ne l'ai pas prévu dans mon code.
2) Quant je laisse tourné 10-20 minutes j'ai bien la musique du répertoire "01" en aléatoire. Mais a un moment j'ai un lecture d'un fichier son du répertoire MP3 sans que je le commande et cela bloque le DfPlayer.
Auriez-vous une idée ?


