Bonjour à tous,
J'utilise mon ARDINO UNO pour piloter une carte DFPlayer Mini pour réaliser un thermomètre vocale, indiquant les températures de 0 à 50 degrés et commandé par un bouton poussoir. La "sonde" est un LM35. Les fichiers audios sont enregistrés sur une carte de 16Go et sous la forme 0001,0002, etc.
Mon problème se situe dans les informations restituées car, à chaque demande de la température, celle-ci diffusée deux ou trois fois avec des indications différentes (16°puis 26° puis encore 0°). 'ai remplacé la sonde par un potentiomètre de 10k relié entre VSS et VDD pour avoir différentes valeur de tension devant correspondre à des températures différentes également mais rien n'est cohérent dans les résultats. J'utilise dans la librairie Ardino: SoftwareSerial et DFRobotDFPlayerMini.h. Je vous ai joint le code que j'ai utilisé. Merci à vous de bien vouloir m'aider dans mon projet.
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
const int lm35Pin = A0; // Broche analogique pour le LM35
const int buttonPin = 2; // Broche pour le bouton poussoir
void setup() {
mySoftwareSerial.begin(9600);
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
if (!myDFPlayer.begin(mySoftwareSerial)) {
Serial.println(F("DFPlayer non détecté !"));
while (true);
}
myDFPlayer.volume(20); // Réglage du volume (0 à 30)
}
void loop() {
if (digitalRead(buttonPin) == LOW) { // Si le bouton est pressé
delay(200); // Anti-rebond
announceTemperature();
while (digitalRead(buttonPin) == LOW); // Attendre que le bouton soit relâché
}
}
void announceTemperature() {
int sensorValue = analogRead(lm35Pin);
float temperature = (sensorValue * 5.0 / 1023.0) * 100.0; // Conversion en degrés Celsius
int integerPart = (int)temperature; // Partie entière de la température
int decimalPart = (int)((temperature - integerPart) * 10); // Partie décimale (dixième de degré)
// Annonce de la partie entière
if (integerPart >= 0 && integerPart <= 50) {
myDFPlayer.play(integerPart + 1); // Les fichiers sont numérotés à partir de 0001.mp3
delay(1000);
}
// Annonce du point décimal
myDFPlayer.play(16); // "point"
delay(500);
// Annonce de la partie décimale (dixième de degré)
myDFPlayer.play(decimalPart + 1); // Les fichiers pour les dixièmes sont numérotés de 0001.mp3 (0) à 0010.mp3 (9)
delay(500);
// Annonce de l'unité
myDFPlayer.play(17); // "degré Celsius"
delay(1000);
}
C'est surprenant que le point soit le 16 alors que la température peut aller de 0 à 50 et que c'est cette valeur qui sert d'index pour adresser le fichier.
Pour le pré formatage de mon code, il m'a bien semblé que j'avais cliqué sur "code" pour le coller dans les bonnes balises, mais je peux le supprimer s'il gêne?
Pour faire un test avec un autre programme, j'ai chargé le code de "RUIDO CON dfplayer Mini, tout en laissant mon fichier de degrés (61 fichiers en tout) et au démarrage, il s'acharne à répéter 27° en permanence puis, au bout de 7 à 8 secondes il repart à 23° pour ensuite éditer les fichiers un à un dans le bon ordre de progression, puis au dernier fichier repart au début et ainsi de suite sans erreur. Mais moi dans mon programme, je lance l'annonce de la température avec un bouton poussoir, peut être que le défaut se produit à ce moment là!
Pour compléter ma remarque du #4.
Si on en croit cette partie du code
Les fichiers de 0001 à 0051 contiennent les nombres de 0 à 50.
Donc, en toute logique, le "point" et "degré Celsius" devraient se trouver après or dans ton code tu utilises 16 et 17 pour ces 2 sons.
Il y a aussi, il me semble, un problème qui a été soulevé quelques fois par des utilisateurs. Il faudrait copier les fichiers dans l'ordre. Je ne fais que répéter car je n'ai jamais utilisé cette carte.
EDIT: ce n'est d'ailleurs pas une légende urbaine car j'ai trouvé ça sur le wiki de DFRobot
NOTE: The order you copy the mp3 into micro SD card will affect the order mp3 played , which means play(1) function will play the first mp3 copied into micro SD card.
De là à se demander si les noms servent à quelque chose ????? (à part justement se rappeler de l'ordre dans lequel il faut les copier)
Personnellement, je n'ai pas fait de dossier, mais j'ai directement mis mes 63 fichiers appelés de 0001.mp3 à 0062.mp3 sur ma carte SD16Go. Mais même si les températures ne correspondent pas au message vocale, il ne devrait pas y avoir au départ du message, plusieurs fois le même chiffre annoncé ou alors, ce module n'est pas fait pour l'application que je souhaite faire! Pourtant l'Ardino doit bien dialoguer avec la carte DFPlayer via RX/TX? Dommage que je ne peux pas vous envoyer un fichier audio pour avoir une idée plus précise du problème.
C'est effectivement l'ordre de copie des fichiers lors du transfert sur la carte SD qui compte.
Le nom ne sert pas mais c'est un hack car la majorité des OS effectue la copie des fichiers dans l'ordre alphabétique (ils sont classés comme cela souvent dans la présentation et la sélection pour la copie va les ranger dans cet ordre dans le paste buffer).
Donc si vous les appelez A.mp3 B.mp3 C.mp3 ça devrait marcher aussi
Je peux toujours essayer de numéroter différemment, cependant, cela n'explique pas le mauvais fonctionnement au démarrage! Mais si j'ai bien lu dans le lien, il est dit qu'il faut toujours avoir 4 chiffres dans le nom du fichier ex: 0012.mp3
comme vous le déclarez en INPUT_PULLUP ce devrait être simplement
PIN ----- BOUTON ---- GND
Pas de résistance et assurez vous de connecter les pôles croisés du bouton pour être sûr de ne pas prendre le même pôle (si votre bouton a 4 broches, elles sont câblées en interne 2 à 2)
en connectant en diagonal au Travers du bouton on est sûr de ne pas prendre la même broche et de traverser l'interrupteur.
sinon Notez que
n'est pas terrible car si vous avez tenu le bouton appuyé pendant la lecture des fichier et que vous lâchez ensuite, le bouton va rebondir et au bouclage de la loop ça va déclencher une nouvelle lecture.
il y a une pin sur le DFPlayer qui permet de savoir s'il a fini de lire le fichier audio sélectionné, vous devriez utiliser cela plutôt qu'un delay() approximatif pour la durée du fichier
Après modification, le résultat reste inchangé toujours un bégaiement au départ et j'ai remplacer la sonde LM35 par un potentiomètre pour faire varier artificiellement la température, il me répète sans cesse 26° degré!! Pour le bouton poussoir, j'ai mis un 1.0MF entre Vss et le point chaud.
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
#include <Toggle.h>
SoftwareSerial DFSerial(10, 11); // RX, TX
DFRobotDFPlayerMini lecteurMP3;
const byte lm35Pin = A0; // Broche analogique pour le LM35
const byte buttonPin = 2; // Broche pour le bouton poussoir
Toggle bouton;
void setup() {
bouton.begin(buttonPin);
DFSerial.begin(9600);
Serial.begin(115200);
if (!lecteurMP3.begin(DFSerial)) {
Serial.println(F("DFPlayer non détecté !"));
while (true);
}
lecteurMP3.volume(20); // Réglage du volume (0 à 30)
}
void loop() {
bouton.poll();
if (bouton.onPress()) announceTemperature();
}
void announceTemperature() {
int sensorValue = analogRead(lm35Pin);
float temperature = (sensorValue * 5.0 / 1023.0) * 100.0; // Conversion en degrés Celsius
int integerPart = (int)temperature; // Partie entière de la température
int decimalPart = (int)((temperature - integerPart) * 10); // Partie décimale (dixième de degré)
// Annonce de la partie entière
if (integerPart >= 0 && integerPart <= 50) {
lecteurMP3.play(integerPart + 1); // Les fichiers sont numérotés à partir de 0001.mp3
delay(1000);
}
// Annonce du point décimal
lecteurMP3.play(16); // "point"
delay(500);
// Annonce de la partie décimale (dixième de degré)
lecteurMP3.play(decimalPart + 1); // Les fichiers pour les dixièmes sont numérotés de 0001.mp3 (0) à 0010.mp3 (9)
delay(500);
// Annonce de l'unité
lecteurMP3.play(17); // "degré Celsius"
delay(1000);
}
(faudrait voir la numérotation des fichiers comme dit précédemment parce que si lecteurMP3.play(16); dit "POINT" alors que va dire lecteurMP3.play(integerPart + 1); s'il fait 15°...
Le montage avec le potentiomètre est exactement celui que j'ai fait. Le bouton que j'ai utilisé, je m'en suis déjà servi pour un autre montage et il a donné satisfaction.
J'ai un message d'erreur lorsque je télécharge le fichier que tu m'as mis:
C:\Users\Denis\Documents\Arduino\Thermometre_vocal\Thermometre_vocal.ino:3:10: fatal error: Toggle.h: No such file or directory #include <Toggle.h>
^~~~~~~~~~
compilation terminated.
exit status 1
Compilation error: Toggle.h: No such file or directory
Après avoir installé Toggle et chargé ton code, j'ai maintenant lorsque j'appuie sur mon bouton poussoir toujours la même chose, quel que soit la valeur sur A0: "40,30,43 degré" !!
J'utilise pas mal les DFPlayer et effectivement, il est très important de soit, copier 1 par les fichiers dans l'ordre 0000 à nnnn, soit d'utiliser Drivesort qui manipule la table de registre de la carte sd et remet les fichiers dans le bon ordre.