Go Down

Topic: Lecture mp3 aléatoire (Read 1 time) previous topic - next topic

marco74

#15
Feb 12, 2019, 09:12 pm Last Edit: Feb 12, 2019, 09:24 pm by marco74
Bonjour,

folder01 et folder02 sont définis dans le setup et ne sont donc accessibles que dans le setup
Il faut que tu les définisse en global (avant le setup)
Alors oui en effet j'ai omis de préciser une chose :

quand je met les variables en global, aucun des println ne fonctionnent, dans le setup ou dans le loop.

Mais merci de me rappeler que les déclarations doivent se faire avant :)

Du coup je pense que il doit y avoir un ou plusieurs paramètres qu'il va falloir rajouter (dans le setup ?) pour que la lecture des folders se face correctement car je pense que en global myDFPlayer.readFileCountsInFolder(1)  n'est pas clairement reconnu.

D'où le fait que rien ne se passe derrière...

---
en fait ce que j'essaye de faire, c'est de stocker dans une variable la valeur du nombre de fichier mp3 qui se trouve dans chaque dossier (01 et 02), car si dans le loop j'appel directement myDFPlayer.readFileCountsInFolder(1), le loop rame à chaque lecture.

pour le moment, le code ci-dessous ne fonctionne pas. Enfin si, il fonctionne, c'est juste que je n'arrive pas à afficher les valeurs stockés.
Code: [Select]

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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

const int folder01 = myDFPlayer.readFileCountsInFolder(1);
const int folder02 = myDFPlayer.readFileCountsInFolder(2);

void setup () {
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
  !myDFPlayer.begin(mySoftwareSerial);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
}

void loop () {

  Serial.println(folder01);
  Serial.println(folder02);

}
This is only a test, not a question without answer.

marco74

#16
Feb 12, 2019, 09:33 pm Last Edit: Feb 12, 2019, 09:59 pm by marco74
maj 1 :
si je déclare
const int folder01 = myDFPlayer.readFileCountsInFolder(1);
const int folder02 = myDFPlayer.readFileCountsInFolder(2);

avant le setup, cela me bloque tout le loop.

et la commande

Serial.println(myDFPlayer.readFileCountsInFolder(1));

ne fonctionne pas.
si je les enlève tout fonctionne correctement.

du coup je me retrouve bloqué car je ne sais pas d'où vient le souci.



maj 2 :

J'ai trouvé (?), en tout cas cela fonctionne désormais.

mais est ce que j'ai le droit d'écrire les affectations de valeur dans le setup comme ça  ? :
Code: [Select]


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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

byte folder01;
byte folder02;

void setup () {
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
  !myDFPlayer.begin(mySoftwareSerial);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
 
  folder01 = myDFPlayer.readFileCountsInFolder(1);
  folder02 = myDFPlayer.readFileCountsInFolder(2);
}

void loop () {

  Serial.println(folder01);
  Serial.println(folder02);
  delay(2000);

}


Merci en tout cas !
This is only a test, not a question without answer.

lesept

Je ne comprends pas ça ;
Code: [Select]
  !myDFPlayer.begin(mySoftwareSerial);

Si myDFPlayer.begin renvoie un booléen, alors mettre ! devant va le "négativer" (passer de true à false et inversement), mais ça ne sert que si tu veux utiliser sa valeur ensuite. Si tu appelles juste le begin sans te servir de ce qu'il renvoie alors inutile de mettre ce !

C'est peut-être une source d'erreur...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

kamill

maj 2 :

J'ai trouvé (?), en tout cas cela fonctionne désormais.

mais est ce que j'ai le droit d'écrire les affectations de valeur dans le setup comme ça  ? :
Oui bien sur c'est ce qu'il faut faire.
Définition des variables avant le setup pour qu'elles soient accessibles par toutes les fonctions.
Initialisation des variables dans le setup (après le myDFPlayer.begin)

marco74

#19
Feb 13, 2019, 09:30 pm Last Edit: Feb 13, 2019, 09:41 pm by marco74
Bon je pense que j'arrive maintenant au bout grace à vos conseils.
J'ai effectivement enlever le ! car cela ne changeai rien (c'est juste qu'il était présent dans le fichier getstarted et funllfunction de la librairie DfPlayer et je l'avais laissé comme tel pensant que c'était important de le mettre.

Pour le reste j'ai retravaillé le setup.

J'en ai profité pour rajouter un petit truc en plus pour ne pas répéter le morceau, d'avant le morceau précédent, histoire d'optimiser un peu plus la lecture aléatoire pour ne pas avoir trop de répétition rapproché.

Merci pour vos conseils, je met le code final ici, qui sans doute, j'en suis sur, pourrai être encore mieux optimisé :)

Thx ! ;)

Code: [Select]

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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

#define ACTIVATED LOW

const int btnP1 = 3;
const int btnP2 = 2;
int start;
int doublon1 = 0;
int doublon1b = 0;
int doublon2 = 0;
int doublon2b = 0;
byte playNumFlux;
byte playNumRare;
byte folder01;
byte folder02;

//
const byte rareMP3 = 5; // % de chance pour trouver les MP3 RARE
const byte varRareMP3 = ((100 / rareMP3) + 1);
//

void setup () {
  pinMode(btnP1, INPUT_PULLUP);
  pinMode(btnP2, INPUT_PULLUP);

  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
  myDFPlayer.begin(mySoftwareSerial);
  myDFPlayer.setTimeOut(500);
  myDFPlayer.volume(12);
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
  folder01 = myDFPlayer.readFileCountsInFolder(1);
  folder02 = myDFPlayer.readFileCountsInFolder(2);
  randomSeed(analogRead(0));
  delay(50);
}

////////////////////////////////////////////////////////

void loop () {

  if ((digitalRead(btnP1) == ACTIVATED) || (digitalRead(btnP2) == ACTIVATED)) {
   
    start = random(1, varRareMP3);
   
    if (start == 1) // PLAY RARE MP3
    {
      while ((playNumRare == doublon2) || (playNumRare == doublon2b))
      {
        playNumRare = random(1, folder02);
        delay(50);
      }
      doublon2b = doublon2;
      doublon2 = playNumRare;
      myDFPlayer.playLargeFolder(2, playNumRare);
      delay(10000);
    }
    else // PLAY FLUX MP3
    {
      while ((playNumFlux == doublon1) || (playNumFlux == doublon1b))
      {
        playNumFlux = random(1, folder01);
        delay(50);
      }
      doublon1b = doublon1;
      doublon1 = playNumFlux;
      myDFPlayer.playLargeFolder(1, playNumFlux);
      delay(10000);
    }

  }
}
This is only a test, not a question without answer.

lesept

Pour ne pas répéter le morceau d'avant, le plus simple c'est de créer un tableau dont les éléments vont de 0 à N-1 (N étant le nombre de morceaux) et de mélanger ce tableau. Pour ça tu fais une boucle pendant 3 ou 4 fois N et tu échanges 2 cases du tableau choisies au hasard.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

marco74

ah oui interessant, je vais essayé cette méthode voir ce que ca donne. merci :)
This is only a test, not a question without answer.

superdala

Salut Marco, je suis très content de tomber sur ton topic car je suis en train de faire la même chose que toi, cad une borne avec des poussoirs qui produiront un son mp3 de répliques connues ou enregistrées par mes soins, le tout au hasard... Et c'est vraiment la galère le dfplayer et arduino quand on n'y connait pas grand chose.
As-tu réussi de ton côté à faire ce que tu voulais?

superdala

Re,
J'essaie de reproduire ce que tu as fait mais je plante à l'étape du:
 void playRandom()
{
  execute_CMD(0x18,0,1);
  delay(500);
}
ça ne fonctionne pas chez moi.
J'ai une petite question, sur ta carte sd, tu as créé des dossiers spéciaux  avec les noms "rares"...?
Merci pour les réponses...
A+
superdala

laurent18

J'ai ce même blocage Superdala

Mais Marco semble absent

Go Up