Boite musical nature (DfPlayer)

Bonjour tous le monde :wave:,

Ma fille a l'habitude de dormir la fenêtre ouverte mais son conjoint a froid la nuit. Donc les fenêtres sont closes.

J'ai eu l'idée de faire cette boite à musique avec des sons de la nature.

J'ai fait sérigraphié la boite.
379BE2C0-C957-4C5F-B6AE-7ABD6F8EC1BB_4_5005_c

Elle est alimenté via un connecteur USB-C

Pour le montage électronique il y a une carte électronique avec un Arduino Nano Evry, un DfPlayer et un NE555.


62FF38BB-38E7-467E-8C9F-62D0EBD19818_4_5005_c

Il y a une liaison série entre l'Arduino et le DfPlayer. Sur le Rx du DfPlayer il faut mettre une résistance de 1K ohm car l'entrée du DfPlayer est en +3V3.

Le DfPlayer renvoie un Busy quand la chanson est finit.

Le NE555 me permet d'avoir un signal aléatoire pour avoir un vrais Random pour choisir la chanson suivante.

Un potentiomètre change le volume du son.

L'autre change la durée. L'idée est que l'on ouvre la boite cela alimente la carte électronique et lance les sons de nature. Au bout d'un temps définis par le second potentiomètre les sons de nature ce coupe.
Il y a 6 paliers (5 min, 10 min, 15 min, 20 min, 30 min et 45 minutes)
Quand on bouge le potentiomètre pour la durée le montage indique le temps via le haut parleur.

Sur la carte SD il y a deux répertoires. Un pour les sons de la nature et un pour les durées.

Voici le code ::

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

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

DFRobotDFPlayerMini myDFPlayer;

#define LED_PIN  13
#define BUSY_PIN 8
int busyState = 0;
int prevBusyState = 0;
int ValVolume =0;
unsigned long Duree = 0;
int AncienneDuree = 5;
int NbrDeChanson = 0;
int NumeroChanson = 1;
int  Debut = 0;
int ValDuree = 5;
int Stop = 0;

void setup()
{
  pinMode( LED_PIN, OUTPUT );
  pinMode( BUSY_PIN, INPUT_PULLUP );
  
  mySoftwareSerial.begin(9600);
  Serial.begin(9600); 

  Serial.println("Début");
  
    // assume we need a delay to give the player time to start playing the initial track
  do {
       Serial.println("Essai de liaison");          // debug value
       delay(0); // Code to compatible with ESP8266 watch dog.       
      } while (!myDFPlayer.begin(mySoftwareSerial ));  //Use softwareSerial to communicate with mp3. 

  // Nombre de chanson
  do {
    NbrDeChanson = myDFPlayer.readFileCountsInFolder(1);
    Serial.println("NbrDeChanson");
    Serial.println(NbrDeChanson);
     }while ( NbrDeChanson == -1);
  
  // reglage du volume
  ValVolume = int(analogRead(A1)*30/1024);// Tension Durée
  myDFPlayer.volume (ValVolume);

  // Mesure Durée
  ValDuree = int(analogRead(A0)*6/1024);
  if (ValDuree == 0) {
      Duree = 5UL*60000UL;
      Serial.println("Init 5 minutes");
    }
  if (ValDuree == 1) {
      Duree = 10UL*60000UL ;
      Serial.println("Init 10 minutes");
     }
  if (ValDuree == 2) {
      Duree = 15UL*60000UL ;
      Serial.println("Init 15 minutes");
    }
  if (ValDuree == 3) {
      Duree = 20UL*60000UL ;
      Serial.println("Init 20 minutes");
    }
  if (ValDuree == 4) {
      Duree = 30UL*60000UL ;
      Serial.println("Init 30 minutes");
    }
  if (ValDuree == 5) {
      Duree = 45UL*60000UL ;
      Serial.println("Init 45 minutes");
    }
   AncienneDuree = ValDuree ;
  
  // intialisation numéro de chanson aléatoire
  randomSeed(analogRead(A2));
}

void loop()
{
  
  ValVolume = analogRead(A1)*30/1024;// Tension Volume
  myDFPlayer.volume (ValVolume);

  ValDuree = analogRead(A0)*6/1024;// Tension Durée

 if (ValDuree !=AncienneDuree) {
    if (ValDuree == 0) {
      myDFPlayer.playLargeFolder(2, 5);
      Serial.println("5 minutes");
      Duree = 5UL*60000UL ;
    }
    if (ValDuree == 1) {
      myDFPlayer.playLargeFolder(2, 10);
      Serial.println("10 minutes");
      Duree = 10UL*60000UL ;
     }
    if (ValDuree == 2) {
      myDFPlayer.playLargeFolder(2, 15);
      Serial.println("15 minutes");
      Duree = 15UL*60000UL ;
    }
    if (ValDuree == 3) {
      myDFPlayer.playLargeFolder(2, 20);
      Serial.println("20 minutes");
      Duree = 20UL*60000UL ;
    }
    if (ValDuree == 4) {
      myDFPlayer.playLargeFolder(2, 30);
      Serial.println("30 minutes");
      Duree = 30UL*60000UL ;
    }
    if (ValDuree == 5) {
      myDFPlayer.playLargeFolder(2, 45);
      Serial.println("45 minutes");
      Duree = 45UL*60000UL ;
    }
    AncienneDuree = ValDuree ;
    // Attendre que le texte se termine
    delay (2000);
  }

  // copy the state of the BUSY pin onto the UNO built-in LED
  busyState = digitalRead( BUSY_PIN );
  //digitalWrite( LED_PIN, busyState );
  
  if (millis() > Duree) {
     myDFPlayer.pause() ;
     if (Stop == 0) {
      Serial.println("Stop");
      Stop = 1 ;
     }
  }
  else if ( busyState == HIGH ) {
      NumeroChanson = random(1,NbrDeChanson+1);
      Serial.println("Numéro chanson");
      Serial.println(NumeroChanson);
      delay(1000);
      myDFPlayer.playLargeFolder(1, NumeroChanson);
      delay(1000);
      myDFPlayer.start();
      //delay(3000);
    }
    delay(1000);
}

Dans les trucs ou cela a été un peux compliquer

  • Mettre UL pour les calcule de variable pour les Unsigne Long
Duree = 5UL*60000UL;
  • Vérifié le nombre de chanson qui est sur la carte SD (fonctionnement différent entre un Reset et une mise sous-tension). Je pense que cela vient de l'initialisation du DfPlayer.
  // Nombre de chanson
  do {
    NbrDeChanson = myDFPlayer.readFileCountsInFolder(1);
    Serial.println("NbrDeChanson");
    Serial.println(NbrDeChanson);
     }while ( NbrDeChanson == -1);
  • Quand on change de répertoire dur DfPlayer il faut faire un Start après le changement de répertoire.
      myDFPlayer.playLargeFolder(1, NumeroChanson);
      delay(1000);
      myDFPlayer.start();

Je passe les bug d'écriture :wink:

Merci les gens qui m'ont aidés.

3 Likes

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