Bonjour à tous,
Je rencontre un problème avec mon montage, pourriez-vous m'aider SVP. Voici la description :
Montage à base d’un Arduino nano avec un DFPLAYER. Le DFPLAYER est géré par les bibliothèques <SoftwareSerial.h> sur les broches 10 pour TX et 11 pour RX et <DFRobotDFPlayerMini.h>. Il y a 5 leds branchées led3Pin = 6; led5Pin = 5; led7Pin = 4 ; led9Pin = 3; led11Pin = 2. Un bouton poussoir BoutonPause = 12; Un interrupteur BoutonNuit = 13; un capteur de lumière LdrPin= 9; un relais RelaisPin= 7.
Voici le fonctionnement :
Le montage doit lire un fichier son à partir du DFPLAYER pendant 30 secondes. Il y a 15 fichiers sons et ils sont joués aléatoirement mais jamais deux fois le même de suite. Entre deux morceaux il y a une pause qui est variable elle a les valeurs de 3,5,7,9,11 minutes et aléatoires de 3 à 10 minutes. Cette valeur de pause est choisie par le bouton poussoir. Pour visualiser le choix ça allumera une led. Led3 pour 3 minutes, Led5 pour 5 minutes, Led7 pour 7 minutes, Led9 pour 9 minutes, Led11 pour 11 minutes et toutes les leds pour aléatoires.
Pour avoir lecture la LDR doit être au niveau haut et le bouton nuit au niveau bas. Et si le bouton nuit est au niveau il y aura toujours lecture même si le ldr est au niveau bas.
Tout doit être gérer pour le temps avec la fonction millis.
Le relais sera au niveau bas 2 secondes avant le début de la lecture du morceau. Et passera au niveau haut 2 secondes après la fin de lecture du morceau.
Je vous remercie d'avance pour votre aide
test_carte_PCB.ino (4.9 KB)
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
SoftwareSerial mySoftwareSerial(10, 11); // TX, RX
DFRobotDFPlayerMini myDFPlayer ;
const int BoutonPause = 12; // Broche du bouton pour changer pause
const int BoutonNuit = 13; // Broche du bouton Nuit
const int LdrPin= 9; // Broche du capteur de lumiére
const int RelaisPin= 7; // Broche du Relais pour Alim Ampli
const int led3Pin = 6; // Broche de la LED 3
const int led5Pin = 5; // Broche de la LED 5
const int led7Pin = 4; // Broche de la LED 7
const int led9Pin = 3; // Broche de la LED 9
const int led11Pin = 2; // Broche de la LED 11
// Variables pour la gestion des boutons et du LDR
int EtatBoutonPause = 0;
int DernierEtatBoutonPause = 0;
int ValBoutonPause = 0;
int ValBoutonNuit;
int Data_Ldr;
// Variables pour la gestion du temps
unsigned long dernierTempsLecture;
unsigned long dernierTempsPause;
unsigned long tempsDebutLecture;
unsigned long temps_pause; // Durée de la pause
unsigned long temps_lecture = 30000; // Durée de Lecture du son 30 seconds
unsigned long DureePause; // Durée de pause entre deux lectures
unsigned long dernierDebounceTime = 0;
const unsigned long debounceDelay = 70; // délai d'antirebond en ms
int num_piste = 1; // Initialisation de la piste
int num_piste_random = 1; // Valeur d'initialisation de la Piste par Random
void printDetail(uint8_t type, int value); //Renvois le message correspondant au code Erreur
void setup() {
mySoftwareSerial.begin(9600) ;
myDFPlayer.begin(mySoftwareSerial) ;
Serial.begin(115200);
randomSeed(analogRead(A1)); // Necessaire pour générer un nombre aléatoire
// Initialisation des broches
pinMode(BoutonPause, INPUT_PULLUP);
pinMode(BoutonNuit, INPUT_PULLUP);
pinMode(LdrPin, INPUT);
pinMode(led3Pin, OUTPUT);
pinMode(led5Pin, OUTPUT);
pinMode(led7Pin, OUTPUT);
pinMode(led9Pin, OUTPUT);
pinMode(led11Pin, OUTPUT);
pinMode(RelaisPin, OUTPUT);
// Éteindre toutes les LEDs au départ
digitalWrite(led3Pin, LOW);
digitalWrite(led5Pin, LOW);
digitalWrite(led7Pin, LOW);
digitalWrite(led9Pin, LOW);
digitalWrite(led11Pin, LOW);
// /*
Serial.println("Test ARDUINO");
Serial.println(F("Initialisation du DFPlayer ... (environ 3~5 seconds)"));
if (!myDFPlayer.begin(mySoftwareSerial)) { // Utilisation de softwareSerial pour communiquer avec le mp3.
Serial.println(F("Problème pour commencer :"));
Serial.println(F("1.SVP vérifier votre connexion !"));
Serial.println(F("2.SVP inserer une SD card!"));
while (true);
}
Serial.println(F("DFPlayer Mini en ligne."));
myDFPlayer.volume(20); //Met le volume à 20 (possible en 0 et 30)
// myDFPlayer.play(1); // Lit la piste numéro 1
// */
}
void loop() {
unsigned long temps_actuel = millis();
// Lecture et gestion antirebond du bouton Pause
int lectureBouton = digitalRead(BoutonPause);
if (lectureBouton != DernierEtatBoutonPause) {
dernierDebounceTime = temps_actuel;
}
if ((temps_actuel - dernierDebounceTime) > debounceDelay) {
if (lectureBouton != EtatBoutonPause) {
EtatBoutonPause = lectureBouton;
if (EtatBoutonPause == HIGH) {
ValBoutonPause = (ValBoutonPause % 6) + 1;
updateLEDs();
}
}
}
DernierEtatBoutonPause = lectureBouton;
// Gestion LDR et bouton Nuit
Data_Ldr = (digitalRead(LdrPin) == HIGH) ? 0 : 1;
ValBoutonNuit = (digitalRead(BoutonNuit) == HIGH) ? 1 : 0;
// Affichage d'informations série (optionnel)
info_serial();
// Gestion de la lecture audio et des pauses
if (Data_Ldr == 1 && ValBoutonNuit == 0) {
// Si pas de lecture ou pause en cours, lancer une nouvelle lecture après la pause
if (dernierTempsPause == 0 && (temps_actuel - dernierTempsLecture >= DureePause)) {
dernierTempsLecture = temps_actuel;
piste();
digitalWrite(RelaisPin, HIGH);
myDFPlayer.play(num_piste);
tempsDebutLecture = temps_actuel;
dernierTempsPause = 1; // Marqueur pour indiquer qu'une lecture est en cours
}
// Arrêter la lecture après temps_lecture ms
if (tempsDebutLecture != 0 && (temps_actuel - tempsDebutLecture >= temps_lecture)) {
myDFPlayer.pause();
digitalWrite(RelaisPin, LOW);
tempsDebutLecture = 0;
dernierTempsPause = temps_actuel; // Démarre la pause
}
// Fin de la pause, prêt à relancer une lecture
if (dernierTempsPause > 1 && (temps_actuel - dernierTempsPause >= DureePause)) {
dernierTempsPause = 0; // Réinitialise pour permettre une nouvelle lecture
tempsPause(); // Génère une nouvelle durée de pause si mode aléatoire
}
// Si pause non initialisée, générer la durée de pause (mode aléatoire)
if (dernierTempsPause == 0 && ValBoutonPause == 6) {
tempsPause();
}
}
}
void updateLEDs() {
// Éteindre toutes les LEDs
digitalWrite(led3Pin, LOW);
digitalWrite(led5Pin, LOW);
digitalWrite(led7Pin, LOW);
digitalWrite(led9Pin, LOW);
digitalWrite(led11Pin, LOW);
// Allumer la LED correspondante à la valeur de pause
switch (ValBoutonPause) {
case 1:
digitalWrite(led3Pin, HIGH);
DureePause = 3 * 60000UL;
break;
case 2:
digitalWrite(led5Pin, HIGH);
DureePause = 5 * 60000UL;
break;
case 3:
digitalWrite(led7Pin, HIGH);
DureePause = 7 * 60000UL;
break;
case 4:
digitalWrite(led9Pin, HIGH);
DureePause = 9 * 60000UL;
break;
case 5:
digitalWrite(led11Pin, HIGH);
DureePause = 11 * 60000UL;
break;
case 6: // Toutes les LEDs allumées, pause aléatoire
digitalWrite(led3Pin, HIGH);
digitalWrite(led5Pin, HIGH);
digitalWrite(led7Pin, HIGH);
digitalWrite(led9Pin, HIGH);
digitalWrite(led11Pin, HIGH);
tempsPause();
break;
}
}
void piste() {
num_piste_random = random(1, 18);
while (num_piste_random == num_piste) {
num_piste_random = random(1, 18);
}
num_piste = num_piste_random;
}
void tempsPause() {
DureePause = random(3, 12) * 60000UL; // Random entre 3 et 11 minutes
}
void info_serial () {
Serial.print("temps_pause : ");
Serial.println(DureePause / 60000);
Serial.print("numéro de piste au hasard entre 1 et 18 :");
Serial.println(num_piste_random);
Serial.print("compteur ValBoutonPause : ");
Serial.println(ValBoutonPause);
Serial.print("Valeur du capteur NUIT: ");
Serial.println(ValBoutonNuit);
Serial.print("Valeur du capteur LDR: ");
Serial.println(Data_Ldr);
}
void printDetail(uint8_t type, int value) {
switch (type) {
case TimeOut:
Serial.println(F("Time Out!"));
break;
case WrongStack:
Serial.println(F("Stack Wrong!"));
break;
case DFPlayerCardInserted:
Serial.println(F("SD Card Insérée!"));
break;
case DFPlayerCardRemoved:
Serial.println(F("SD Card Enlevée!"));
break;
case DFPlayerCardOnline:
Serial.println(F("SD Card en ligne!"));
break;
case DFPlayerPlayFinished:
Serial.print(F("Nombre:"));
Serial.print(value);
Serial.println(F("Lecture Finie !"));
break;
case DFPlayerError:
Serial.print(F("Erreur DFPlayer:"));
switch (value) {
case Busy:
Serial.println(F("SD Card non trouvée"));
break;
case Sleeping:
Serial.println(F("En Sommeil"));
break;
case SerialWrongStack:
Serial.println(F("Get Wrong Stack"));
break;
case CheckSumNotMatch:
Serial.println(F("Check Sum Not Match"));
break;
case FileIndexOut:
Serial.println(F("File Index Out of Bound"));
break;
case FileMismatch:
Serial.println(F("Fichier Introuvable "));
break;
case Advertise:
Serial.println(F("In Advertise"));
break;
default:
break;
}
break;
default:
break;
}
}