Problème de variable qui remonte ou non

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

}

pourquoi ne pas lire le dernier ?

Bonjour,

En fait, mon I2C ouvre la transmission, envoi les informations les unes derrière les autres, puis ferme la connection.

Je pensais que je devais lire l'intégralité du buffer.

Je vais tenter de regarder par là... Merci.

Tchao,

Mike

Je suis tombé sur un de tes articles de Septembre 2017 sur les ports Series. Je vais regarder cela de près...

Merci.

Tchao,

Mike

Bonjour

L'explication du port Série est très interessante, mais malheureusement, je n'ai pas trouvé mon bonheur dans le sujet (j'en ai tout de même trouvé plein de choses intéressantes avec des concepts expliqués simplement : c'est très cool comme article).

Alors j'ai un peu avancé sur mon problème.

C'est bien lorsque je lance le "beguin" que le problème a lieu. Même sans l'interruption cela plante tout de même. J'ai le même supprimé pour vérifier.

Résultat :
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 .

Dans mon port série, j'ai :
----------------- Sans la Wire Begin -------------------
Son = 12,255
12_Sad/Track_14.mp3

Son = 10,255
10_Alarm/Track_11.mp3

Son = 11,255
11_Happy/Track_9.mp3

----------------- Avec la Wire Begin -------------------
Son = 12,255
12_Sad/Track_9.mp3

Son = 11,255
6.mp3

Son = 12,255
11.mp3

Autre étrangeté : Parfois le son marche (par exemple pour le 12/ Track_9) mais pas pour le 12/Track_11, sur l'extrait du dessus...

Mon code simplifié (toujours avec le problème et le "non problème" si j'enlève le "Wire.begin(ADR_SOUND);"

#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)                                              //
// --- 90_SW (13)                                                 //
// --- 91_Film1 (18)                                              //
// --- 92_Film2 (0)                                              //
// --- 93_Serie1 (14)                                             //
// --- 94_Serie2 (12)                                             //
// --- 95_Repliques (0)                                          //
// --- 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","90_SW", "91_Film1","92_Film2","93_Serie1","94_Serie2","95_Repliques","97_Blagues"};
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;


// --- 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 ---
  
  //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();
 
  randomSeed(analogRead(0));    // génére un début de nombre aléatoire

  MP3player.available();   // démarre le lecteur MP3
  
  verif ('S',1,0,1,0,0);
  delay(4000);
  Serial.print("OK !");
}
//--------------------------------------------------------------------------------------
//////////
// LOOP //
//////////

void loop() {


Var1 = random(10,14);
verif ('S',1,Var1,255,0,0);
delay(2000);
//verif ('K',1,0,0,0,0);
//delay(2000);



}
  
//--------------------------------------------------------------------------------------
///////////
// VERIF //
///////////

void verif(char Fonction, int Etat, int Var1, int Var2, int Var3, int Ack){

Serial.print("Son = ");
Serial.print(Var1);
Serial.print(",");
Serial.println(Var2);

switch (Fonction) {

      case 'K':                                                           // Mode Kill si MP3 en cours
          if (MP3player.isPlaying()) {MP3player.stopTrack();}
          Serial.println("Kill le son");
          break; 
                   
      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==90) {dir = Repertoire[14]; NbreMP3 = 13;}
            if (Var1==91) {dir = Repertoire[15]; NbreMP3 = 18;}
            if (Var1==92) {dir = Repertoire[16]; NbreMP3 = 0;}
            if (Var1==93) {dir = Repertoire[17]; NbreMP3 = 14;}
            if (Var1==94) {dir = Repertoire[18]; NbreMP3 = 12;}
            if (Var1==95) {dir = Repertoire[19]; NbreMP3 = 0;}
            if (Var1==97) {dir = Repertoire[20]; NbreMP3 = 4;}



            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";
              Serial.println(NomMP3);
              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;   
 
  }


}

Un petit coup de main ,svp ? Je bloque et j'ai vraiment besoin d'avoir mon I2C actif...

quel est votre montage, comment envoyez vous la trame I2C?

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