Bonjour à tous,
J'ai un petit programme qui me permet de jouer des sons avec une carte Sparkfun MP3 Shield.
Le principe est simple :
Je construis une trame (qui peut être envoyé par I2C) sous la forme Fonction Char, Etat Boolen, Var1 à Var 3 Integer, et Ack Boolen.
Var1 me permet de préciser le repertoire ou se trouve le son
Var2 me permet de jouer un son précis ou si = à 255, il joue un son aléatoire dans le rerpetoire Var1.
Cela marche très bien.
J'ai rajouté la fonction qui me permet de lui envoyer la trame en I2C et là cela commence à merder. J'ai identifié que le problème se situe sur les répertoires
"10_Alarm", "11_Happy", "14_Oh", "18_Scream", "97_ Blagues"...
Le problème se situe dans cette partie de code :
if (Var2==255) { // Si le son n'est pas precisé (= à 255), alors joue un son aléatoire dans le répertoire Var1
NumeroMP3 = random(NbreMP3)+1;
NomMP3 = dir + "/Track_" + NumeroMP3 +".mp3";
char NomMP3Complet [50];
NomMP3.toCharArray(NomMP3Complet , 50);
Serial.println("");
if (MP3player.isPlaying()) {MP3player.stopTrack();} // Stoppe le son en cours
MP3player.playMP3(NomMP3Complet);
Le "NomMP3 = dir + "/Track_" + NumeroMP3 +".mp3"" marche pour les repertoires 12, 13, 15, 16, 19 mais pour sur les repertoires 10, 11, 14, 18, 97, 98 et 99 si l'event I2C en bas du code est actif. Pourtant c'est uniquement un si Var1 == 10 alors dir =Repertoire[x]...
Si je met en commentaire ma ligne :
verif(Fonction_I2C , Etat_I2C , Var1_I2C , Var2_I2C , Var3_I2C , Ack_I2C);
Tout refonctionne. Pour information, cela merde même si l'I2C est débranché et que je n'ai aucune interruption.
J'avoue que cela dépasse mes compétences et si vous pouviez me donner une petit coup de main se serait sympa.
Merci par avance.
Mike
Le code complet :
#include <SPI.h>
#include <SdFat.h>
#include <SFEMP3Shield.h>
#include <Wire.h>
// Créer un objet SD du nom "SD"
SdFat sd;
// Créer un objet SFMP3Shield du nom "MP3player"
SFEMP3Shield MP3player;
////////////////////////////////////////////////////////////////////
// Composition de la carte SD et nombre de titre par répertoire : //
////////////////////////////////////////////////////////////////////
// //
// --- 00_Demarrage (1) //
// --- 01_Sequences (12) //
// --- 10_Alarm (11) //
// --- 11_Happy (20) //
// --- 12_Sad (20) //
// --- 13_Misc (36) //
// --- 14_Oh (7) //
// --- 15_Proc (15) //
// --- 16_Hum (25) //
// --- 17_Razz (23) //
// --- 18_Scream (4) //
// --- 19_Sent (20) //
// --- 20_Whist (25) //
// --- 97_Blagues (1) //
// --- 98_Series (34) //
// --- 99_Film (34) //
// //
////////////////////////////////////////////////////////////////////
//////////////////////////////
// Définition des variables //
//////////////////////////////
// --- Déclaration Adresses I2C ---
const int ADR_SOUND = 7;
// --- Déclaration des variables MP3 ---
String dir; //Répertoire du MP3
int NbreMP3; //Nombre de MP3 dans le répertoire
int NumeroMP3; // Numéro du MP3 à jouer
String NomMP3; // Nom complet du MP3 à jouer en String
char NomMP3Complet; // Nomcomplet de MP3 en Char
String Repertoire[] = {"","00_Demarrage","01_Sequences","10_Alarm","11_Happy","12_Sad","13_Misc","14_Oh","15_Proc","16_Hum","17_Razz","18_Scream","19_Sent","20_Whist","97_Blagues","98_Series","99_Film"};
int Duree;
int Rep;
bool ModeDemo = 0 ; // Force le mode Demo au démarrage
union twobyte mp3_vol; // create key_command existing variable that can be both word and double byte of left and right.
int Volume;
int Var1;
int Var2;
// --- Définition variable Type millis
unsigned long ValeurTempsActuel;
unsigned long ProchaineValeurSon;
unsigned long DernierBitDeVie;
// --- Message ---
int message;
//--------------------------------------------------------------------------------------
///////////
// SETUP //
///////////
void setup(){
uint8_t result; //result code from some function as to be tested at later time.
// --- Initialise Bus I2C
Wire.begin(ADR_SOUND); // Rejoint bus I2C avec l'adresse ADR_SOUND #7
Wire.onReceive(receiveEvent); // register event
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Carte SOUND Démarrée !");
// --- Intialise le millis ---
ValeurTempsActuel = millis();
//Initialize the SdCard.
if(!sd.begin(SD_SEL, SPI_FULL_SPEED)) sd.initErrorHalt();
// depending upon your SdCard environment, SPI_HAVE_SPEED may work better.
if(!sd.chdir("/")) sd.errorHalt("sd.chdir");
//Initialize the MP3 Player Shield
result = MP3player.begin();
//check result, see readme for error codes.
if(result != 0) {
Serial.print(F("Error code: "));
Serial.print(result);
Serial.println(F(" when trying to start MP3 player"));
if( result == 6 ) {
Serial.println(F("Warning: patch file not found, skipping.")); // can be removed for space, if needed.
Serial.println(F("Use the \"d\" command to verify SdCard can be read")); // can be removed for space, if needed.
}
}
randomSeed(analogRead(0)); // génére un début de nombre aléatoire
MP3player.available(); // démarre le lecteur MP3
// Regle le volume à valeur de départ
MP3player.setVolume(8,8);
// Joue un son de démarrage (Netflix)
verif ('S',1,0,1,0,0);
}
//--------------------------------------------------------------------------------------
//////////
// LOOP //
//////////
void loop() {
Rep = random(10,20); // Joue un son sur les répertoire 10 à 20
verif ('S',1,Rep,255,0,0);
delay(2000);
fin:
//Petite tempo pour éviter de perdre des informations / a OPTIMISER en fin de programme
delay(100);
}
//--------------------------------------------------------------------------------------
///////////
// VERIF //
///////////
void verif(char Fonction, int Etat, int Var1, int Var2, int Var3, int Ack){
switch (Fonction) {
case 'S': // SON joué en fonction du répertoire et du nombre de MP3 dans chacque répertoire
if (Var1==0) {dir = Repertoire[1]; NbreMP3 = 1;}
if (Var1==1) {dir = Repertoire[2]; NbreMP3 = 33;}
if (Var1==10) {dir = Repertoire[3]; NbreMP3 = 11;}
if (Var1==11) {dir = Repertoire[4]; NbreMP3 = 20;}
if (Var1==12) {dir = Repertoire[5]; NbreMP3 = 20;}
if (Var1==13) {dir = Repertoire[6]; NbreMP3 = 36;}
if (Var1==14) {dir = Repertoire[7]; NbreMP3 = 7;}
if (Var1==15) {dir = Repertoire[8]; NbreMP3 = 15;}
if (Var1==16) {dir = Repertoire[9]; NbreMP3 = 25;}
if (Var1==17) {dir = Repertoire[10]; NbreMP3 = 23;}
if (Var1==18) {dir = Repertoire[11]; NbreMP3 = 4;}
if (Var1==19) {dir = Repertoire[12]; NbreMP3 = 20;}
if (Var1==20) {dir = Repertoire[13]; NbreMP3 = 25;}
if (Var1==97) {dir = Repertoire[14]; NbreMP3 = 34;}
if (Var1==98) {dir = Repertoire[15]; NbreMP3 = 34;}
if (Var1==99) {dir = Repertoire[16]; NbreMP3 = 34;}
if (Var2==255) { // Si le son n'est pas precisé (= à 255), alors joue un son aléatoire dans le répertoire Var1
NumeroMP3 = random(NbreMP3)+1;
NomMP3 = dir + "/Track_" + NumeroMP3 +".mp3";
char NomMP3Complet [50];
NomMP3.toCharArray(NomMP3Complet , 50);
Serial.println("");
if (MP3player.isPlaying()) {MP3player.stopTrack();} // Stoppe le son en cours
MP3player.playMP3(NomMP3Complet);
}
if (Var2!=255) { // Si le son est précisé, vérifie que le numéro de track à jouer est inférieur au nombre de titre du répertoire et joue le son
if (Var2<=NbreMP3) {
NomMP3 = dir + "/Track_" + Var2+".mp3";
char NomMP3Complet[50];
NomMP3.toCharArray(NomMP3Complet , 50);
Serial.println(NomMP3);
Serial.println("");
if (MP3player.isPlaying()) {MP3player.stopTrack();} // Stoppe le son en cours
MP3player.playMP3(NomMP3Complet);
}
}
break;
}
}
//--------------------------------------------------------------------------------------
/////////////////////////////
// EVENEMENT RECEPTION I2C //
/////////////////////////////
void receiveEvent(int howMany) {
while (1 < Wire.available()) { // loop through all but the last
char Fonction_I2C = Wire.read(); // receive byte as a character
int Etat_I2C =Wire.read();
int Var1_I2C = Wire.read();
int Var2_I2C = Wire.read();
int Var3_I2C = Wire.read();
bool Ack_I2C = Wire.read();
Serial.print("Fonction = ");
Serial.print(Fonction_I2C);
Serial.print(Etat_I2C);
Serial.print(", ");
Serial.print(Var1_I2C);
Serial.print(", ");
Serial.print(Var2_I2C);
Serial.print(", ");
Serial.print(Var3_I2C);
Serial.print(", ");
Serial.println(Ack_I2C);
verif(Fonction_I2C , Etat_I2C , Var1_I2C , Var2_I2C , Var3_I2C , Ack_I2C);
}
}