Esp32 WebRadio interruption non maîtrisée!

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.