Auteur Sujet: Un mini module sonore  (Lu 12468 fois)

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil
Un mini module sonore
« le: mars 14, 2016, 11:46:50 am »
/*
 * Module sonore - Passage Niveau
 * Base : un Nano + lecteur microSD + ampli BD241 + haut parleur
 * Version du 13/3/2016 Dominique Bultez
 */
 
#include <SD.h>                   // need to include the SD library
#define SD_ChipSelectPin 10       // using digital pin 10 on arduino nano 328, can use other pins
#include <TMRpcm.h>               //  also need to include this library...
#include <SPI.h>
/*
 * SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK).
 */
TMRpcm tmrpcm;                    // create an object for use in this sketch
File root;
int val;
int bouton, oldbouton = 0;
bool debouncing = false;
#define _Bouton 2
#define _LedSon 4
#define _niveau 4

/////////////////////// SETUP /////////////////

void setup(){

  tmrpcm.speakerPin = 9;              //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc
  pinMode(_LedSon,OUTPUT);            //LED Connected to pin 4
  digitalWrite(_LedSon, LOW);
  pinMode(_Bouton, INPUT_PULLUP);     // pour bouton ou commande extrieure sur pin 2
 
  Serial.begin(115200);
  if (!SD.begin(SD_ChipSelectPin)) {  // see if the card is present and can be initialized:
    Serial.println("SD fail"); 
    while(1) {
      // led clignote
      digitalWrite(_LedSon, HIGH);    // allume Led
      delay(250);
      digitalWrite(_LedSon, LOW);     // eteint led
      delay(250);
    }
  }
  root = SD.open("/");
  //printDirectory(root, 0);
  //delay(500);
  Serial.println("SD OK");
  val = _niveau;
  //Joue(val);
}

//////////////////// LOOP //////////////////

void loop(){ 

while (Serial.available() > 0)
  {
    val = Serial.parseInt();  // lecture entier
    if (Serial.read() == '\n')
    {
      Serial.print("valeur : ");
      Serial.println(val);
      if (val == 0) {
        printDirectory(root, 0);
      } else {
        Joue(val);
      }
    }
  }

  bouton = digitalRead(_Bouton);
  if (bouton == LOW) {
    if (tmrpcm.isPlaying()) {
    } else {
      Joue(_niveau);
      //digitalWrite(_LedSon, HIGH);      // allume Led
    }
  } else {                              // bouton HIGH
      tmrpcm.stopPlayback();            // Stop all playback
      //digitalWrite(_LedSon, LOW);       // eteint Led
  }
 
  if(tmrpcm.isPlaying())  {
    digitalWrite(_LedSon, HIGH);
   } else {
    digitalWrite(_LedSon, LOW);
    }
}

//////////////// fin de loop ///////////////

void Joue(int a_val) {
      Serial.print("je joue ");Serial.println(a_val);
      switch (a_val) {
        case 1:
        tmrpcm.play((char*)("1.wav"));       
        break;
        case 2:
        tmrpcm.play((char*)("2.wav"));
        break;
        case 3:
        tmrpcm.play((char*)("3.wav"));
        break;
        case 4:
        tmrpcm.play((char*)("4.wav"));
        break;
        case 5:
        tmrpcm.play((char*)("5.wav"));
        break;
        case 6:
        tmrpcm.play((char*)("6.wav"));
        break;
        case 7:
        tmrpcm.play((char*)("7.wav"));
        break;
        case 8:
        tmrpcm.play((char*)("8.wav"));
        break;
        case 9:
        tmrpcm.play((char*)("9.wav"));
        break;
      }
}

void printDirectory(File dir, int numTabs) {
   while(true) {
     
     File entry =  dir.openNextFile();
     if (! entry) {
       // no more files
       Serial.println("fin");
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numTabs+1);
     } else {
       // files have sizes, directories do not
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
     }
     entry.close();
   }
}

Et il reste 14 pins libres ...
« Modifié: mars 14, 2016, 09:24:11 pm par Dominique »

DDEFF

  • Sr. Member
  • ****
  • Messages: 460
    • Voir le profil
Re: Un mini module sonore
« Réponse #1 le: mars 14, 2016, 04:33:40 pm »
Tout simplement !  :D
Et tu as 9 sons sur ta SD.

Thierry

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 465
    • Voir le profil
Re: Un mini module sonore
« Réponse #2 le: mars 14, 2016, 05:37:26 pm »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil

Papachef

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re: Un mini module sonore
« Réponse #4 le: octobre 23, 2016, 07:00:21 pm »
Bonsoir,
Le son est en boucle, comment faire pour qu'il ne passe qu'une fois. La fonction Delay ne fonctionne pas
Merci
 :)

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil
Re: Un mini module sonore
« Réponse #5 le: octobre 23, 2016, 08:19:53 pm »
Bonsoir,
Le son est en boucle, comment faire pour qu'il ne passe qu'une fois. La fonction Delay ne fonctionne pas
Merci
 :)

Papachef

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re: Un mini module sonore
« Réponse #6 le: octobre 23, 2016, 09:27:28 pm »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil
Re: Un mini module sonore
« Réponse #7 le: octobre 23, 2016, 11:08:14 pm »
tmrpcm.play((char*)("annonce1.wav")); 
        delay(1000);
Serial.print("quelque chose"); par Serial.print(F("quelque chose"));
Je vous conseille de modifier cette fonction printDirectory() comme suit :

void printDirectory(File dir, int numTabs) {
   while(true) {
     
     File entry =  dir.openNextFile();
     if (! entry) {
       // no more files
       Serial.println("fin");
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       // printDirectory(entry, numTabs+1); // supprimer les appels re-entrants
     } else {
       // files have sizes, directories do not
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
     }
     entry.close();
   }
}
« Modifié: octobre 23, 2016, 11:11:55 pm par Dominique »

Papachef

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re: Un mini module sonore
« Réponse #8 le: octobre 24, 2016, 10:44:04 am »

Papachef

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re: Un mini module sonore
« Réponse #9 le: octobre 24, 2016, 10:45:31 am »
Oups, erreur de doigt je n'ai pas fini mes explications
 :o

Papachef

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re: Un mini module sonore
« Réponse #10 le: octobre 24, 2016, 10:52:15 am »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil
Re: Un mini module sonore
« Réponse #11 le: octobre 24, 2016, 10:56:58 am »
« Modifié: octobre 24, 2016, 11:24:25 am par Thierry »

Papachef

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re: Un mini module sonore
« Réponse #12 le: octobre 24, 2016, 11:54:13 am »
Voici mon fichier
Merci

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil
Re: Un mini module sonore
« Réponse #13 le: octobre 24, 2016, 02:39:25 pm »
Il y a plusieurs choses :

#define _Bouton 2
#define _LedSon 4
#define _niveau 1

#define _Bouton 3
#define _LedSon 4
#define _niveau 2

#define _Bouton 4
#define _LedSon 4
#define _niveau 3
printDirectory(entry, numTabs+1); dans void printDirectory(File dir, int numTabs)

Papachef

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re: Un mini module sonore
« Réponse #14 le: octobre 24, 2016, 06:18:39 pm »