Aller au contenu


La Fabrik

Inscrit(e) (le) 02 mars 2023
Déconnecté Dernière activité mars 10 2023 03:26
-----

Messages que j'ai postés

Dans le sujet : lecture fichiers sur carte SD

10 mars 2023 - 03:31

 

Ok pour tout arrêter c'est assez simple voilà le code modifié :)

 

void playLastRecordings(uint8_t n) {
  wait(500);                 // On attend un peu histoire de laisser le temps à l'utilisateur de mettre le combiné à l'oreille
  File dir = SD.open("/");    // Recording files are saved in the root directory
  uint16_t idx = 100;         // Id qu'on va tester ... Je préfère commencer à 100, je pense pas qu'on va aller jusqu'à 99999 si ? à changer si tu veux mettre plus de 100 messages mais ça va augmenter le délais d'attente
  Serial.println("La boucle for commence");
  bool onstop = false;
  for (uint8_t i = 0; i < n; i++ ) {         // on va jouer n morceaux

    snprintf(filename, 11, " %05d.wav", idx);  //  Format the counter as a five-digit number with leading zeroes, followed by file extension

    Serial.print("boucle ");                   // ligne à effacer du code final, uniquement utile pour le debug
    Serial.println(i);                         // ligne à effacer du code final, uniquement utile pour le debug
    Serial.print("Idx = ");                    // ligne à effacer du code final, uniquement utile pour le debug
    Serial.println(idx);                       // ligne à effacer du code final, uniquement utile pour le debug
    while (!SD.exists(filename)) {             // Tant que le fichier existe pas on décrémente l'ID
      if (idx == 0)                            // Si ID est à 0 on ne peut pas décrémenter plus ...
        break;                                 // => Donc on break pour sortir du while
      idx --;                                  // Sinon on décrémente id ( jusqu'à trouver un fichier ou que id = 0 )
      snprintf(filename, 11, " %05d.wav", idx);// on met à jour filename avec la nouveur valeurs d'id
    }
    if ( idx == 0 ) {                          // cas particulier ou id = 0 et on a break le while alors que le fichier existe pas
      if (!SD.exists(filename))                // on vérifie si le fichier existe
        break;                                 // Si il existe pas on break le for ( fin des fichiers )
    }

    // code copié de la fonction "play last "
    Serial.println(filename);   // Display the the file name we found  // ligne à effacer du code final, uniquement utile pour le debug
    playWav1.play(filename);    // Play the file
    mode = Mode::Playing; print_mode();

    while (!playWav1.isStopped()) { // this works for playWav
      buttonPlay.update();
      buttonRecord.update();
      // Button is pressed again
      if(buttonPlay.risingEdge()) {
         Serial.println(" Boutton play rising");  // ligne à effacer du code final, uniquement utile pour le debug
      }
      if( buttonRecord.fallingEdge()) {
         Serial.println(" Boutton record falling"); // ligne à effacer du code final, uniquement utile pour le debug
      }
      if (buttonPlay.fallingEdge()) {
         onstop = true;
         Serial.println(" Boutton play falling"); // ligne à effacer du code final, uniquement utile pour le debug
      } 
      if( buttonRecord.risingEdge()) {
        onstop = true;
        Serial.println(" Boutton record rising"); // ligne à effacer du code final, uniquement utile pour le debug
      }
      if(onstop) {
        Serial.println(" on stop "); // ligne à effacer du code final, uniquement utile pour le debug
        playWav1.stop();
        mode = Mode::Ready; print_mode();
      }
    }
    // file has been played
    Serial.println("Fin du son"); // ligne à effacer du code final, uniquement utile pour le debug
    mode = Mode::Ready; print_mode();
    end_Beep();
    Serial.println(" bip");      // ligne à effacer du code final, uniquement utile pour le debug
    // code copié de play all
    // Play a short beep before each message
    waveform1.amplitude(beep_volume);
    wait(750);
    waveform1.amplitude(0);
    Serial.println("fin du bip"); // ligne à effacer du code final, uniquement utile pour le debug
    if (idx == 0 || onstop)  // Si 0 ou demande de stop alors il y a plus de son à jouer c'est fini on break le for
      break;
    idx --;        // sinon décrémenter pour jouer le fichier précédent grâce au for
    Serial.print("idx =");  // ligne à effacer du code final, uniquement utile pour le debug
    Serial.println(idx);    // ligne à effacer du code final, uniquement utile pour le debug
  }
  // All files have been played
  Serial.println("Fin de la boucle for");  // ligne à effacer du code final, uniquement utile pour le debug
  mode = Mode::Ready; print_mode();
}

C'est génial ça marche, un grand merci pour ton aide et pour tes annotations qui me permettent de comprendre un peu comment ça marche. J'ai passé une deuxième commande hier, je vais pouvoir garder celui là et m'exercer sur un nouveau, j'aimerai par exemple remplacer le bouton lecture par le chiffre 9 ou 0 du cadran et faire plein d'autre essais.
Encore merci c'est top !


Dans le sujet : lecture fichiers sur carte SD

10 mars 2023 - 03:28

Plus il va y avoir de fichier sur la carte plus le delais de " test d'existence de fichier " sera court. 

Le code test le 100 puis le 99 puis le 98 etc jusqu'à atteindre le 31 ... il y a un temps ( petit mais non nul ) pour chaque test avant d'atteindre un fichier qui existe. ça mettra forcément plus de temps de tester de 100 à 31 que de 100 à 98 si jamais tu as 98 fichiers ...

C'est bien ce que j'avais compris mais je n'etais pas sur, merci. Et dans l'hypothèse où il y aurait plus de fichier comment ça se passe? Avec ton exemple si il teste à partir de 100, je suppose que les fichiers à partir de 100 ne seront jamais lu? Mais l'enregistrement continuera normalement, c'est ça?


Dans le sujet : lecture fichiers sur carte SD

10 mars 2023 - 12:03

void playLastRecordings(uint8_t n) {
  wait(500);                 // On attend un peu histoire de laisser le temps à l'utilisateur de mettre le combiné à l'oreille
  File dir = SD.open("/");    // Recording files are saved in the root directory
  uint16_t idx = 100;         // Id qu'on va tester ... Je préfère commencer à 100, je pense pas qu'on va aller jusqu'à 99999 si ? à changer si tu veux mettre plus de 100 messages mais ça va augmenter le délais d'attente
  Serial.println("La boucle for commence");
  for (uint8_t i = 0; i < n; i++ ) {         // on va jouer n morceaux

    snprintf(filename, 11, " %05d.wav", idx);  //  Format the counter as a five-digit number with leading zeroes, followed by file extension

    Serial.print("boucle ");                   // ligne à effacer du code final, uniquement utile pour le debug
    Serial.println(i);                         // ligne à effacer du code final, uniquement utile pour le debug
    Serial.print("Idx = ");                    // ligne à effacer du code final, uniquement utile pour le debug
    Serial.println(idx);                       // ligne à effacer du code final, uniquement utile pour le debug
    while (!SD.exists(filename)) {             // Tant que le fichier existe pas on décrémente l'ID
      if (idx == 0)                            // Si ID est à 0 on ne peut pas décrémenter plus ...
        break;                                 // => Donc on break pour sortir du while
      idx --;                                  // Sinon on décrémente id ( jusqu'à trouver un fichier ou que id = 0 )
      snprintf(filename, 11, " %05d.wav", idx);// on met à jour filename avec la nouveur valeurs d'id
    }
    if ( idx == 0 ) {                          // cas particulier ou id = 0 et on a break le while alors que le fichier existe pas
      if (!SD.exists(filename))                // on vérifie si le fichier existe
        break;                                 // Si il existe pas on break le for ( fin des fichiers )
    }

    // code copié de la fonction "play last "
    Serial.println(filename);   // Display the the file name we found  // ligne à effacer du code final, uniquement utile pour le debug
    playWav1.play(filename);    // Play the file
    mode = Mode::Playing; print_mode();

    while (!playWav1.isStopped()) { // this works for playWav
      bool onstop = false;
      buttonPlay.update();
      buttonRecord.update();
      // Button is pressed again
      if(buttonPlay.risingEdge()) {
         Serial.println(" Boutton play rising");  // ligne à effacer du code final, uniquement utile pour le debug
      }
      if( buttonRecord.fallingEdge()) {
         Serial.println(" Boutton record falling"); // ligne à effacer du code final, uniquement utile pour le debug
      }
      if (buttonPlay.fallingEdge()) {
         onstop = true;
         Serial.println(" Boutton play falling"); // ligne à effacer du code final, uniquement utile pour le debug
      } 
      if( buttonRecord.risingEdge()) {
        onstop = true;
        Serial.println(" Boutton record rising"); // ligne à effacer du code final, uniquement utile pour le debug
      }
      if(onstop) {
        Serial.println(" on stop "); // ligne à effacer du code final, uniquement utile pour le debug
        playWav1.stop();
        mode = Mode::Ready; print_mode();
      }
    }
    // file has been played
    Serial.println("Fin du son"); // ligne à effacer du code final, uniquement utile pour le debug
    mode = Mode::Ready; print_mode();
    end_Beep();
    Serial.println(" bip");      // ligne à effacer du code final, uniquement utile pour le debug
    // code copié de play all
    // Play a short beep before each message
    waveform1.amplitude(beep_volume);
    wait(750);
    waveform1.amplitude(0);
    Serial.println("fin du bip"); // ligne à effacer du code final, uniquement utile pour le debug
    if (idx == 0)  // Si 0 alors il y a plus de son à jouer c'est fini on break le for
      break;
    idx --;        // sinon décrémenter pour jouer le fichier précédent grâce au for
    Serial.print("idx =");  // ligne à effacer du code final, uniquement utile pour le debug
    Serial.println(idx);    // ligne à effacer du code final, uniquement utile pour le debug
  }
  // All files have been played
  Serial.println("Fin de la boucle for");  // ligne à effacer du code final, uniquement utile pour le debug
  mode = Mode::Ready; print_mode();
}

Du coup grâce à ton retour j'ai trouvé la coquille ;) j'ai déplacé la ligne snprintf(filename, 11, " %05d.wav", idx); 

 

 

Et l'ai mise dans la boucle for. 
Maintenant ça devrait bien jouer les n dernier et pas n fois le dernier ;) 

Pour ce qui est du délais, il y a bien le wait qui a un impact mais aussi le chiffre à partir duquel tu commences ta vérification, afin de raccourcir le délais je t'ai modifié la chose pour commencer à 100 au lieu de 999 ...  Mais du coup ça veut dire que ça ne va marche correctement que si tu as 100 messages ou moins ... Et le temps d'attente et dépendant du nombre de messages que tu as ... 

Vu que j'ai mis un wait de 500,  ça attendra 500ms si tu as 100 messages, et ça attendra plus longtemps si tu en as que 5 car ça va passer du temps à tester tous les fichier de 100 à 5 jusqu'à trouver que le fichier existe.

 

C'est super merci beaucoup ça fonctionne parfaitement.
J'avais déjà ajouté un wait plus haut à l'appel de la fonction et c'est suffisant avec les test que j'ai fait pour avoir le temps de prendre le combiné.
Aussi, j'ai changé le nombre de messages pour mettre 300. Le délai ne me parait pas très long (31 fichiers sur la carte SD). Plus il va y avoir de fichiers sur la carte et plus le délai sera court? ou l'inverse?

Dernière chose pour chipoter mais bien pratique, lorsque je met en lecture par exemple les 10 derniers messages, j'aimerai pouvoir arrêter la lecture au moment ou le combiné est replacé car actuellement ni le bouton ni le combiné n'arrêtent la lecture, il faut du coup attendre que tous les fichiers soient lus.

edit:
j'ai essayé avec mes déductions de rajouter ça mais çe ne stoppe que l'enregistrement en cours, et ça passe au suivant:

case Mode::Playing: 
     if (buttonRecord.fallingEdge()) {
          playWav1.stop();
          mode = Mode::Ready; print_mode();
      break;  
    }

 


 


Dans le sujet : lecture fichiers sur carte SD

09 mars 2023 - 08:55

Alors la je viens de décrocher, j'ai entendu le "greeting", puis j'ai raccroché avant la fin. J'ai ensuite appuyé sur le bouton lecture, et le dernier enregistrement s'est mis à tourner en boucle comme indiqué dans ma réponse précédente.
Je remarque aussi que le délai entre l'appui sur le bouton et le début de la lecture est plus long que d'habitude. J'ai vu dans les commentaire que tu disais que c'etait peut-être inutile d'attendre, mais dans la pratique c'est parce que ça laisse le temps de mettre le combiné à l'oreille avant de commencer à lire les pistes. Bon maintenant c'est trop long, je ne sais pas pourquoi mais ça je pense pouvoir le corriger en enlevant le wait(2000)?

Edit: je viens de tester d'enlever le wait(2000) et le délai de lecture est toujours long, environ 5/6 secondes.
Le décrocher/raccrocher sont dans le bon sens cette fois :)

Voici ce que me donne le serial monitor
 

Handset lifted
Mode switched to:  Prompting
Mode switched to:  Ready
Button (pin 1) Release
La boucle for commence
boucle 0
Idx = 999
 00014.wav
Mode switched to:  Playing
Fin du son
Mode switched to:  Ready
 bip
fin du bip
idx =13
boucle 1
Idx = 13
 00014.wav
Mode switched to:  Playing
Fin du son
Mode switched to:  Ready
 bip
fin du bip
idx =12
boucle 2
Idx = 12
 00014.wav
Mode switched to:  Playing
Fin du son
Mode switched to:  Ready
 bip
fin du bip
idx =11
boucle 3
Idx = 11
 00014.wav
Mode switched to:  Playing
Fin du son
Mode switched to:  Ready
 bip
fin du bip
idx =10
boucle 4
Idx = 10
 00014.wav
Mode switched to:  Playing
Fin du son
Mode switched to:  Ready
 bip
fin du bip
idx =9
boucle 5
Idx = 9
 00014.wav
Mode switched to:  Playing
Fin du son
Mode switched to:  Ready
 bip
fin du bip
idx =8
Fin de la boucle for
Mode switched to:  Ready


Dans le sujet : lecture fichiers sur carte SD

08 mars 2023 - 04:35

Merci mais il y a encore quelque chose qui ne va pas.
Je n'ai plus de message d'erreur dans arduino mais j'ai 2 erreurs sur le téléphone:
Losque j'appuie sur le bouton lecture puis je décroche le combiné ça ne fonctionne pas, mais que je raccroche la lecture se met en marche mais j'entend en boucle le dernier message uniquement. Il faut que je décroche le combiné pour que la lecture s'arrête. (en fait je suppose que le risingEdge et fallingEdge sont inversés, pourtant je ne les ai pas touché).
Alors j'ai testé d'appeler l'ancienne fonction PlayAllRecordings sans rien changer d'autre et je vois que le décrocher/raccrocher fonctionnent dans le bon sens avec cette fonction.

De plus j'ai fait plusieurs essais et je remarque que le n ne lit pas les n derniers messages mais plutôt le dernier message n-1 fois.

Alors j'ai deux questions:
Fallait-il bien copier tout le code que tu as fait dans la première réponse? je l'ai copié et ajouté au code que j'avais déjà.
Fallait-il bien ajouter le nombre d’enregistrements à lire dans la partie ci-dessous?

switch(mode){
    case Mode::Ready:
      // Falling edge occurs when the handset is lifted --> 611 telephone
      if (buttonRecord.fallingEdge()) {
        Serial.println("Handset lifted");
        mode = Mode::Prompting; print_mode();
      }
      else if(buttonPlay.fallingEdge()) {
        //playAllRecordings();
        playLastRecordings(6);
      }
      break;

    case Mode::Prompting:
      // Wait a second for users to put the handset to their ear
      wait(1000);
      // Play the greeting inviting them to record their message
      playWav1.play("greeting.wav");    
      // Wait until the  message has finished playing
//      while (playWav1.isPlaying()) {
      while (!playWav1.isStopped()) {
        // Check whether the handset is replaced
        buttonRecord.update();
        buttonPlay.update();
        // Handset is replaced
        if(buttonRecord.risingEdge()) {
          playWav1.stop();
          mode = Mode::Ready; print_mode();
          return;
        }
        if(buttonPlay.fallingEdge()) {
          playWav1.stop();
          //playAllRecordings();
         playLastRecordings(6);
          return;
        }