Bonsoir fitness04,
Vous avez une autre alternative pour votre WebRadio :
ESP32 + VS1053 + télécommande et recepteur IR + Ecran LCD 2004...
1/ connexions :
- Broche 5V du VS1053 : Broche VIN (5V) de l'ESP32
- Broche DGND du VS1053 : Broche GND de l'ESP32
- Broche MISO du VS1053 : Broche D19 de l'ESP32
- Broche MOSI du VS1053 : Broche D23 de l'ESP32
- Broche SCK du VS1053 : Broche D18 de l'ESP32
- Broche DREQ du VS1053 : Broche D4 de l'ESP32
- Broche XRST du VS1053 : Broche EN de l'ESP32
- Broche XCS du VS1053 : Broche D5 de l'ESP32
- Broche XDCS du VS1053 : Broche RX2 - D16 de l'ESP32
Librairie :
https://github.com/schreibfaul1/ESP32-vs1053_ext
Code avec date et heure sur serveur NTP:
#include <LiquidCrystal_I2C.h>
#include "Arduino.h"
#include "WiFi.h"
#include "SPI.h"
#include "vs1053_ext.h"
#include "IRremote.h"
#include "time.h" //horloge
LiquidCrystal_I2C lcd(0x27,20,4);
//Telecommande - Recepteur IR
int receiverPin = 14;
IRrecv irrecv(receiverPin);
decode_results results;
// Definition des pins du module VS1053 vers l'ESP32
#define SPI_MOSI 23
#define SPI_MISO 19
#define SPI_SCK 18
#define VS1053_CS 5
#define VS1053_DCS 16
#define VS1053_DREQ 4
// Listes des liens WebRadios
const char *radio[18] = {"scdn.nrjaudio.fm/adwz2/fr/30001/mp3_128.mp3?origine=fluxradios","icecast.radiofrance.fr/franceinfo-midfi.mp3","direct.francemusique.fr/live/francemusique-midfi.mp3","icecast.radiofrance.fr/franceinter-midfi.mp3",\
"streaming.radio.rtl.fr/rtl-1-44-128?listen=webCwsBCggNCQgLDQUGBAcGBg","icecast.radiofrance.fr/franceculture-midfi.mp3","stream.europe1.fr/europe1.mp3","icecast.radiofrance.fr/fip-midfi.mp3","jazzradio.ice.infomaniak.ch/jazzradio-high.mp3",\
"direct.francebleu.fr/live/fbpoitou-midfi.mp3","streamingp.shoutcast.com/NostalgiePremium-mp3","icecast.skyrock.net/s/natio_mp3_128k","edge.radiomontecarlo.net/RMC.mp3","radioclassique.ice.infomaniak.ch/radioclassique-high.mp3",\
"icecast.funradio.fr/fun-1-44-128?listen=webCwsBCggNCQgLDQUGBAcGBg","stream.virginradio.fr/virgin.mp3","icecast.rtl2.fr/rtl2-1-44-128?listen=webCwsBCggNCQgLDQUGBAcGBg","streamingp.shoutcast.com/Cherie-mp3"};
// Nom des WebRadios
const char *NomRadio[18] = {"NRJ","FRANCE INFO","FRANCE MUSIQUE","FRANCE INTER","RTL","FRANCE CULTURE","EUROPE 1","FIP","JAZZ RADIO","FRANCE BLEU POITOU","NOSTALGIE BELGIQUE","SKYROCK","RMC","RADIO CLASSIQUE",\
"FUN RADIO","VIRGIN RADIO","RTL 2","CHERIE"};
byte i=4; // gére les liens et le nom des WebRadios au travers des deux tableaux radio et NomRadio
String ssid = "fff";
String password = "zzz";
//Volume
int volume=9; // volume a l initialisation
int DernierVolume=0;
boolean Mute = false;
VS1053 mp3(VS1053_CS, VS1053_DCS, VS1053_DREQ); // parametrage - initialisation VS1053
// paremetres horloge
const int decalage = 2; // la valeur dépend du fuseau horaire - 2 pour la France.
const int delaiDemande = 60; // nombre de secondes entre deux demandes consécutives au serveur NTP
unsigned long derniereDemande = millis(); // moment de la plus récente demande au serveur NTP
unsigned long derniereMaJ = millis(); // moment de la plus récente mise à jour de l'affichage de l'heure
time_t maintenant;
struct tm * timeinfo;
void setup() {
esp_sleep_enable_ext0_wakeup(GPIO_NUM_33,HIGH); // parametre GPIO 33 pour sortir du sommeil ESP32
lcd.begin();
lcd.backlight();
affiche(); // affiche nom et volume de la Web Radio
irrecv.enableIRIn(); // initialise recepteur IR
Serial.begin(115200);
SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI); //initialise le protocole SPI
WiFi.disconnect();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid.c_str(), password.c_str());
while (WiFi.status() != WL_CONNECTED) delay(1500);
//horloge
configTime(decalage * 3600, 0, "fr.pool.ntp.org");
while (time(nullptr) <= 100000) {
Serial.print(".");
delay(1000);}
time(&maintenant); //horloge
// initialise au demarrage la lecture du flux mp3 de RTL au volume 15
mp3.begin();
mp3.setVolume(volume); // Fixe le volume à 9
mp3.connecttohost("streaming.radio.rtl.fr/rtl-1-44-128?listen=webCwsBCggNCQgLDQUGBAcGBg"); // connexion au flux RTL
}
void loop()
{
//HORLOGE
// est-ce le moment de demander l'heure NTP ?
if ((millis() - derniereDemande) >= delaiDemande * 1000 ) {
time(&maintenant);
derniereDemande = millis();
Serial.println("Interrogation du serveur NTP");
}
// est-ce que millis() a débordé?
if (millis() < derniereDemande ) {
time(&maintenant);
derniereDemande = millis();
}
// est-ce le moment de raffraichir la date indiquée?
if ((millis() - derniereMaJ) >= 1000 ) {
maintenant = maintenant + 1;
afficheHeureDate();
derniereMaJ = millis();
}
//WEBRADIO
mp3.loop();
// Telecommande
if (irrecv.decode(&results)){ // Si on reçoit un signal IR
convertIR(); // on utilise cette procedure pour utiliser le signal
irrecv.resume(); // Reception d'une nouvelle valeur IR
}
}
void convertIR() // convert IR code
{
Serial.print(results.value);
Serial.print(F(" -> "));
switch(results.value)
{
// moins
case 0xFFA25D: if (i !=0) i--; mp3.connecttohost(radio[i]); affiche(); break;
// Mise en SOMMEIL ESP32
case 0xFFE21D: lcd.clear(); lcd.setCursor(0,1); lcd.print("MISE EN VEILLE"); lcd.setCursor(0,2); lcd.print("VEUILLEZ PATIENTER"); esp_deep_sleep_start(); break;
case 0xFF629D: //plus
if (i==17) break;
if (i <=17) i++; mp3.connecttohost(radio[i]); affiche(); break;
case 0xFF22DD: if (Mute!=1) volume= 15; mp3.setVolume(volume); affiche(); break; //fixe le volume a 15
case 0xFF02FD: if (Mute!=1) volume= 10; mp3.setVolume(volume); affiche(); break; //fixe le volume a 10
//Gestion du volume
case 0xFFC23D: if (Mute!=1) volume= 6; mp3.setVolume(volume); affiche(); break; //fixe le volume a 7
case 0xFFE01F: // diminue le volume
if (Mute!=1) {
volume--;
if (volume<0) volume=0 ; mp3.setVolume(volume); affiche(); }
break;
case 0xFFA857: // augmente le volume
if (Mute!=1) {
volume++;
if (volume>21) volume=21; mp3.setVolume(volume); affiche();}
break;
case 0xFF906F: // MUTE
if (Mute == false) {
DernierVolume = volume;
volume=0; mp3.setVolume(volume); affiche();
Mute = true; break;
}
else
{
volume = DernierVolume;
mp3.setVolume(volume); affiche();
Mute = false; break;
}
case 0xFF9867: Serial.println("Non utilise 1"); break; // Non utilise
case 0xFFB04F: Serial.println("Non utilise 2"); break; // Non utilise
// Gestion des touches 0 a 9 de la telecommande
case 0xFF6897: i=0; mp3.connecttohost(radio[0]); affiche(); break; //0
case 0xFF30CF: i=1; mp3.connecttohost(radio[1]); affiche(); break; //1
case 0xFF18E7: i=2; mp3.connecttohost(radio[2]); affiche(); break; //2
case 0xFF7A85: i=3; mp3.connecttohost(radio[3]); affiche(); break; //3
case 0xFF10EF: i=4; mp3.connecttohost(radio[4]); affiche(); break; //4
case 0xFF38C7: i=5; mp3.connecttohost(radio[5]); affiche(); break; //5
case 0xFF5AA5: i=6; mp3.connecttohost(radio[6]); affiche(); break; //6
case 0xFF42BD: i=7; mp3.connecttohost(radio[7]); affiche(); break; //7
case 0xFF4AB5: i=8; mp3.connecttohost(radio[8]); affiche(); break; //8
case 0xFF52AD: i=9; mp3.connecttohost(radio[9]); affiche(); break; //9
case 0xFFFFFFFF: Serial.println("Non utilise 3"); break; // Non utilise
default: // Hors portee par exemple
Serial.println(F(" inconnu "));
}
delay(500);
}
void affiche(){ // Gere l'affichage des parametres de la radio sur les deux premieres lignes de l ecran LCD
lcd.clear();
lcd.setCursor(0,0);
lcd.print(NomRadio[i]);
lcd.setCursor(0,1);
lcd.print("VOLUME : ");
lcd.print(volume);
}
void afficheHeureDate() { // ligne 3 et 4 du LCD
timeinfo = localtime(&maintenant);
lcd.setCursor(0,2);
lcd.print("Date: ");
if (timeinfo->tm_mday < 10) {
lcd.print("0");
}
lcd.print(timeinfo->tm_mday); // timeinfo->tm_mday: jour du mois (1 - 31)
lcd.print("-");
if ((timeinfo->tm_mon + 1) < 10) {
lcd.print("0");
}
lcd.print(timeinfo->tm_mon + 1); // timeinfo->tm_mon: mois (0 - 11, 0 correspond à janvier)
lcd.print("-");
lcd.print(timeinfo->tm_year + 1900); // timeinfo->tm_year: tm_year nombre d'années écoulées depuis 1900
lcd.setCursor(0,3);
lcd.print("Heure: ");
if ((timeinfo->tm_hour ) < 10) {
lcd.print("0");
}
lcd.print(timeinfo->tm_hour ); // heure entre 0 et 23
lcd.print(":");
if (timeinfo->tm_min < 10) {
lcd.print("0");
}
lcd.print(timeinfo->tm_min); // timeinfo->tm_min: minutes (0 - 59)
lcd.print(":");
if (timeinfo->tm_sec < 10) {
lcd.print("0");
}
lcd.print(timeinfo->tm_sec); // timeinfo->tm_sec: secondes (0 - 60)
}
ça fonctionne parfaitement...
Bonne soirée.