Bonjour,
Je n’étais pas pleinement satisfait de mon système de carillon/notification qui était composé d’une Squeezebox. En effet, je n’ai pas de sonnette chez moi et pour être averti de l’arrivée de quelqu’un, j’ai une barrière infrarouge dans le passage qui enclenche via Jeedom un fichier son lu par la Squeezebox de la cuisine.
Le fichier son était lu 3 fois sur 4 et le temps de réaction de 3/4 secondes ne me convenait pas.
Donc j’ai retroussé mes manches et j’ai regardé ce que l’on pouvait faire en DIY et Je suis tombé sur un lecteur MP3 à moins de 2 €, le DFPlayer mini avec lecteur microSD. Naturellement le micro contrôleur serait un Arduino et le protocole de communication MySensors qui est bien implanté dans ma maison. Pour faire ce montage, j’ai récupéré un de mes premiers capteurs que j’avais réalisé et que je me servais plus, à l’époque, je soudais l’Arduino directement sur le PCB sans mettre de support.
Bon, un carillon, c’est bien sympa, mais je pourrais rajouter autre chose sur mon Arduino!
Du coup, j’ai intégré un HTU21D pour connaître la température et l’humidité de la cuisine, pour le haut-parleur j’ai pris une voix avant de mon ancien Home cinéma.
Voici le schéma
Un peu d’explications même si ce n’est pas bien compliqué.
R1 et R2 abaissent la tension du TX et RX à 3.3 v pour le DFPlayer, car l’Arduino communique en 5v et le DFPlayer en 3.3 v. D1 est là juste pour baisser le VCC 5 v de 0.8/1 v pour le DFPlayer, car sa tension type est de 4.2 v. C2 pour éviter les baisses de tension lors de l’émission du NRF24l01 et C1 pour palier à l’instabilité de l’alimentation.
Donc pour le côté 100% WAF, j’ai intégré ce montage dans un HP compact de Home Cinéma. Entre l’aimant du haut-parleur et l’évent de l’enceinte il n’y a pas beaucoup de place et je voulais garder l’intégrité de celle-ci. J’ai fait un support en bâtonnet de glace coller à la colle chaude (merci le loisir créatif) pour recevoir le circuit tenu par des colliers. Les fils d’alimentation et du HP sont en 1 mm², l’ampli intégré du DFPlayer fait 3W ça devrais être suffisant. J’ai gardé le bornier à l’arrière de l’enceinte pour y brancher une alim type chargeur de téléphone 2A.
Les essais.
J’ai été agréablement surprit par les performances du DFPlayer autant du niveau puissance de restitution sonore que la maniabilité/rapidité du lecteur. J’avais lu beaucoup d’articles à son sujet qui faisait référence à des parasites numériques. A moins de mettre un casque audio sur le DFPlayer, à 1 mètre, on entend aucune perturbation sonore.
J’avais prévu de mettre un ampli TDA8932 par peur de manque de puissance et bien ce n’est pas la peine. Le volume à 50% est suffisant pour être notifier dans une pièce, l’enceinte fait 30W sous 8 ohms et le DFPlayer fournit 3W.
Pour ce qui est de la consommation électrique, au repos le montage consomme 40mA et sur un morceau de musique à un volume de 90% (limite de saturation) il y a des pics à 240mA, donc une alim de 500mA est suffisante.
Le sketch à téléverser
/*
The MySensors Arduino library handles the wireless radio link and protocol
between your home built sensors/actuators and HA controller of choice.
The sensors forms a self healing radio network with optional repeaters. Each
repeater and gateway builds a routing tables in EEPROM which keeps track of the
network topology allowing messages to be routed to nodes.
Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
Copyright (C) 2013-2019 Sensnology AB
Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors
Documentation: http://www.mysensors.org
Support Forum: http://forum.mysensors.org
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
version 2 as published by the Free Software Foundation.
*******************************
REVISION HISTORY
Version 1.0 - MmX
DESCRIPTION
This sketch aims to operate an Arduino, DFplayer and an HTU21D
for a doorbell or for any other notification on Jeedom.
On the home automation server we can modify the volume, the
equalizer and play the sound tracks from the SD card.
https://community.jeedom.com/t/realisation-carillon-connecte/68916
*/
#define MY_DEBUG
#define MY_NODE_ID 19
#define NODE_NAME "Door Bell"
#define NODE_VERSION "1.0"
#define MY_RADIO_RF24
#include <MySensors.h>
#include <Wire.h>
#include "SparkFunHTU21D.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
//For DFPlayer
#define RX_PIN 8
#define TX_PIN 7
// Id of the sensor child
#define TEMP_ID 1
#define HUM_ID 2
#define BELL_ID 3
#define SOUND_ID 4
#define VOLUME_ID 5
#define EQ_ID 6
unsigned long delay_wait = 300000;
float lastTemp = 0.0;
byte lastHum = 0;
bool boot = 1;
String eq = "Normal";
byte volume = 5; //Set volume value. From 0 to 30
//Create an instance of the object
HTU21D myHumidity;
SoftwareSerial mySoftwareSerial(RX_PIN, TX_PIN); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
// Initialize general message
MyMessage msgT(TEMP_ID, V_TEMP);
MyMessage msgH(HUM_ID, V_HUM);
MyMessage msgB(BELL_ID, V_ARMED);
MyMessage msgS(SOUND_ID, V_VAR1);
MyMessage msgV(VOLUME_ID, V_VAR2);
MyMessage msgEQ(EQ_ID, V_VAR3);
void setup()
{
myHumidity.begin();
mySoftwareSerial.begin(9600);
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while (true) {
delay(0); // Code to compatible with ESP8266 watch dog.
}
}
Serial.println(F("DFPlayer Mini online."));
//read and send current volume
myDFPlayer.volume(volume);
byte vol = round(volume / 0.3);
send(msgV.set(vol));
wait(250);
//read and send EQ setting
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
send(msgEQ.set(eq.c_str())); //read and send EQ setting
myDFPlayer.playMp3Folder(1); //play specific mp3 in SD:/MP3/0001.mp3; File Name(0~65535)
}
void presentation()
{
// Send the sketch version information to the gateway and controller
sendSketchInfo(NODE_NAME, NODE_VERSION);
// Register all sensors to gw (they will be created as child devices)
present(TEMP_ID, S_TEMP);
present(HUM_ID, S_HUM);
present(BELL_ID, S_CUSTOM);
present(SOUND_ID, S_CUSTOM);
present(VOLUME_ID, S_CUSTOM);
present(EQ_ID, S_CUSTOM);
}
void loop()
{
static unsigned long timer = millis();
if (millis() - timer > delay_wait || boot == 1) {
float humd = myHumidity.readHumidity();
float temp = myHumidity.readTemperature();
Serial.print(" Temperature:");
Serial.print(temp, 1);
Serial.print("C");
Serial.print(" Humidity:");
Serial.print(humd, 1);
Serial.println("%");
if (lastTemp != temp) {
send(msgT.set(temp, 1));
lastTemp = temp;
}
byte H = round(humd);
if (lastHum != H) {
send(msgH.set(H));
lastHum = H;
}
timer = millis();
boot = 0;
}
if (myDFPlayer.available()) {
printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
}
}
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("Card Inserted!"));
break;
case DFPlayerCardRemoved:
Serial.println(F("Card Removed!"));
break;
case DFPlayerCardOnline:
Serial.println(F("Card Online!"));
break;
case DFPlayerUSBInserted:
Serial.println("USB Inserted!");
break;
case DFPlayerUSBRemoved:
Serial.println("USB Removed!");
break;
case DFPlayerPlayFinished:
Serial.print(F("Number:"));
Serial.print(value);
Serial.println(F(" Play Finished!"));
send(msgB.set(false));
break;
case DFPlayerError:
Serial.print(F("DFPlayerError:"));
switch (value) {
case Busy:
Serial.println(F("Card not found"));
break;
case Sleeping:
Serial.println(F("Sleeping"));
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("Cannot Find File"));
break;
case Advertise:
Serial.println(F("In Advertise"));
break;
default:
break;
}
break;
default:
break;
}
}
void receive(const MyMessage &message)
{
// We only expect one type of message from controller. But we better check anyway.
if (message.type == V_VAR1) {
int num = message.getInt();
myDFPlayer.playMp3Folder(num); //play specific mp3 in SD:/MP3/0001.mp3; File Name(0~65535)
send(msgB.set(true));
}
if (message.type == V_VAR2) {
byte vol = round(message.getByte() * 0.3); // 0~100% to 0~30
myDFPlayer.volume(vol); //Set volume value (0~30)
Serial.print("Set volume : ");
Serial.println(vol);
}
if (message.type == V_VAR3) {
byte req = message.getByte();
Serial.print("Equalizer : ");
switch (req) {
case 1:
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
Serial.println("Normal");
eq = "Normal";
break;
case 2:
myDFPlayer.EQ(DFPLAYER_EQ_POP);
Serial.println("Pop");
eq = "Pop";
break;
case 3:
myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
Serial.println("Rock");
eq = "Rock";
break;
case 4:
myDFPlayer.EQ(DFPLAYER_EQ_JAZZ);
Serial.println("Jazz");
eq = "Jazz";
break;
case 5:
myDFPlayer.EQ(DFPLAYER_EQ_CLASSIC);
Serial.println("Classic");
eq = "Classic";
break;
case 6:
myDFPlayer.EQ(DFPLAYER_EQ_BASS);
Serial.println("Bass");
eq = "Bass";
break;
default:
break;
}
send(msgEQ.set(eq.c_str()));
}
}
Pour le carillon, j’ai trouvé bon de pouvoir régler par Jeedom: la piste audio, le volume et l’équalizer. Pour ce dernier, je trouve sympas de régler les notifs sur « Pop » ou « Rock » et les alarmes sur « Classic » ou « Normal », ça joue beaucoup sur le rendu.
Sur Jeedom
Je pense que le sketch est bien commenté, s’il y en a qui veulent se lancer, n’hésitez pas !
Quelques une de mes sources
http://riton-duino.blogspot.com/2019/09/un-carillon-mp3.html
http://markus-wobisch.blogspot.com/2016/09/arduino-sounds-dfplayer.html?m=1
EDIT 26/10/2021 correction du schéma de câblage




