Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery

Update: The reader Andreas Schröder has changed the project a little and supplemented some functions. You can find the text and sketch at the end of the post.

Many radio stations can be heard as a MP3 stream over the Internet. Since the microcontroller ESP32 has WLAN skills on the one hand and, on the other hand, can convert the digital data stream into an analog signal with two built-in digital/analog converters, it offers itself as an ideal solution. In addition, a battery power supply, an audio amplifier, two speakers, a display for the transmitter display and an input device for the transmitter setting is required. The whole thing is rounded off with a housing from the 3D printer.

Required hardware

Number Component annotation

1

ESP32 Development Board

 

1

Audio amplifier 3W

 

1

speaker

 

2

Resistance 4.7 KOHM

 

2

Resistance 22 KOHM

 

1

Resistance 10 kohm

 

1

Elko 1000UF / 10V

 

1

3.7V battery 2000mAh

 

1

Loader

 

1

DC-DC Step Up Converter

 

1

LCD display with I2C interface

 

1

Distributor Encoder

 

1

Lochraster plate 50x70

 

2

Spring strips 19-pin

 

1

Park bar 3-pin

 

1

 Park bar 4-pin

 

1

Pin bar 5-pin

 

2

Turntons for 6mm axis

 

Several

Jumper cable female too female

 

1

Housing front part from the 3D printer

 

1

Housing back from the 3D printer

 

1

Lid for battery protection from the 3D printer

 

various

Fastening screws 2.2mm

 

 

circuit

 

Important!
If the Rotary Encoder is not used, the PIN 34 of the ESP32 must still be connected to the 10 co-cock resistance with 3.3V.

The ESP32 is built up on a 50x70 mm hole grid plate with the resistances and pen strips for the periphery.


The figure shows the assembly and wiring on the underside

wiring

First of all, the loader's battery connection is connected to the input of the DC-DC Step Up converter. Note the polarity! The battery is also soldered via a suitable connector with the battery input of the loader. Now the output voltage of the converter with the blue potentiometer should be set to approx. 5.2 V. To do this, either a battery must be connected or the loader's USB input must be connected to a USB network.

If the voltage is set, the output of the converter can be connected to the supply receipt of the audio amplifier. There are two soldering points on the back of the amplifier, the plus connection is switched over the switch of the volume potentiometer.

 amplifier underside

This connection is used to supply the ESP32 and the display so that the device can be switched off completely via the potentiometer.
Now the connections to the control board can be made on the hole grid plate. It is best to use jumper wires with two female plugs. You need a 3-pin connection from the audio output to the amplifier, a 4-pin to the display and a 5-pin to the Rotary Encoder.

Important NOTE!
The loudspeakers should not be attached or staked out when switched on, since inductive tension peaks could destroy the amplifier outputs.

If the housing presented in the blog post is used, battery, loader, DC/DC converter and the control board come to the baking tarpaulin. The speakers, the amplifier, the Rotary Encoder and the display come to the front tarpaulin. The lid is used to secure the battery.

 baking tarpaulinassembly

software

In order for the sketch to be compiled, the Arduino IDE must be prepared accordingly. By default, Arduino IDE supports a large number of boards with different microcontrollers, but not the ESP32. So that you can create and upload programs for these controllers, a software package for the support must therefore be installed.

First you have to communicate the Arduino IDE where you can find the additional data required. To do this, open the Preferences in the File menu. In the preset window there is the input field called "Additional board administrator URLS". If you click on the icon to the right of the input field, a window in which you can open the URL https://dl.espressif.com/dl/package_esp32_index.json for the ESP32 can enter. Version 2.0.0 or higher of the ESP32 package should not be used for this project, since these versions have problems related to the ESP8266audio library!

Now choose the board management in the Arduino IDE under tool → board.

A window opens in which all available packages are listed. In order to narrow down the list, you enter "ESP32" in the search field. Then you only get an entry in the list. Install the "ESP32" package.

ESP32 Lib
For the display you need a library that can be installed via the Arduino library management. This is the library "Liquidcrystal I2C".

Liquid Crystal Lib

Another library is required for the Rotary Encoder. Her name is "Aiesp32rotary Coder".

Rotary Encoder Lib 

The core of this project is the library "ESP8266audio".

 audio lib

This library enables various digital input currents to be read, decoding and reproducing them using various output channels. As an entrance, the program memory, the internal RAM can be used by an SD card, an HTTP stream or an ICY stream. The icy stream is typically used by internet radios.
WAV, MOD, MIDI, Flac, AAC and MP3 files can be decoded. MP3 is required for the web radio. The output can finally be made in memory, files or I2S. There is a special feature for the ESP32. The I2S Output can be output on the internal digital analog converter. An analog stereo signal is then available at the output pins of the DAW (PIN 25 and PIN 26). This feature is used in the present project.

If all libraries are installed, the sketch can be compiled and uploaded to the hardware.

The sketch

#include <Wifi.H> 
// Includes from ESP8266audio
#include "AudioFileesourceiSstream.h" // input stream
#include "AudioFileesourcebuffer.h"    // input buffer
#include "Audiogeneratormp3.h"        //decoder
#include "AudioOutPuti2s.h"           // output stream
// Library for LCD display
#include <Liquidcrystal_i2c.H>
// Library for Rotary Encoder
#include "AiesP32rotaryScoder.h"
// ESP32 Library to Save Preferences in Flash
#include <Preferences.H>

// WLAN Access Fill with your credentials
#define SSID "************"
#define PSK "*************"

// Used pins for Rotary Encoder
#define Rotary_encoder_a_pin 33
#define Rotary_encoder_b_pin 32
#define Rotary_encoder_Button_pin 34
#define Rotary_encoder_vcc_pin -1 /* 27 PUT -1 of Rotary Encoder VCC IS Connected Directly to 3.3V; Else you can use declared output pin for powering rotary encoder */

// Depending on Your Encoder - Try 1.2 OR 4 TO GET Expected Behavior
//#define rotary_encoder_steps 1
//#define rotary_encoder_steps 2
#define Rotary_encoder_steps 4

// Structure for Station List
type struct {
  char * url;  // stream url
  char * Surname; // station name
} station;

#define Ward 24 // Number of Stations in Tzhe List

// Station List Can Easily Be Modified to Support Other Stations
station wardlist[Ward] Progmem = {
{"http://icecast.ndr.de/ndr/ndr2/niedersachsen/mp3/128/stream.mp3","NDR2 Lower Saxony"},
{"http://icecast.ndr.de/ndr/ndr1niedersachsen/hannover/mp3/128/stream.mp3","NDR1 Hannover"},
{"http://wdr-1live-live.iceCast.wdr.de/wdr/1live/live/mp3/128/stream.mp3","WDR1"},
{"http://wdr-cosmo-live.iceCast.wdr.de/wdr/cosmo/live/mp3/128/stream.mp3","WDR Cosmo"},
{"http://radiohagen.cast.addradio.de/radiohagen/simulcast/high/stream.mp3","Radio Hagen"},
{"http://st01.sslstream.dlf.de/dlf/01/128/mp3/stream.mp3","Deutschlandfunk"},
{"http://dispatcher.rndfnk.com/br/br1/franken/mp3/low","Bayern1"},
{"http://dispatcher.rndfnk.com/br3/live/mp3/low","Bayern 3"},
{"http://dispatcher.rndfnk.com/hr/hr3/live/mp3/48/stream.mp3","Hessen3"},
{"http://stream.antentne.de/antne","Antenne Bayern"},
{"http://stream.1a-webradio.de/saw-deutsch/","Radio 1a German hits"},
{"http://stream.1a-weibradio.de/saw-rock/","Radio 1a Rock"},
{"http://streams.80s80s.de/ndw/mp3-192/streams.80S80S.de/","Neue Deutsche Welle"},
{"http://dispatcher.rndfnk.com/br/brklassik/live/mp3/low","Bavaria Classic"},
{"http://mdr-284280-1.Cast.mdr.de/MDR/284280/1/mp3/low/Stream.mp3","MDR"},
{"http://icecast.ndr.de/ndr/njoy/live/mp3/128/stream.mp3","N-Joy"},
{"http://dispatcher.rndfnk.com/rbb/rbb888/live/mp3/mid","RBB"},
{"http://dispatcher.rndfnk.com/rbb/antnebrandenburg/live/mp3/mid","Antenne Brandenburg"},
{"http://wdr3-live.iceCasttssl.wdr.de/wdr/wdr3/live/mp3/128/stream.mp3","WDR3"},
{"http://wdr2-aachenundregion.iceCasttssl.wdr.de/wdr2/aachenundregion/mp3/128/stream.mp3","WDR 2"},
{"http://rnrw.cast.addradio.de/rnrw-0182/deinschlager/low/Stream.mp3","NRW Schlagerradio"},
{"http://rnrw.cast.addradio.de/rnrw-0182/deinrock/low/stream.mp3","NRW Rockradio"},
{"http://rnrw.cast.addradio.de/rnrw-0182/dein90er/low/stream.mp3","NRW 90s"},
{"http://mp3.hitradiort1.c.nmdn.net/rt1rockwl/livestream.mp3","RT1 Rock"}};

// Buffer size for stream buffering
const intimately Preallocatebuffersize = 80*1024;
const intimately PreallocateCodecsize = 29192;         // MP3 Codec Max Mem Needed
// pointer to preallocated memory
void *Preallocatebuffer = ZERO;
void *PreallocateCodec = ZERO;

// Instance of Preferences
Preferences Pref;
// Instance for Rotary Encoder
AISP32Rotary code rotary = AISP32Rotary code(Rotary_encoder_a_pin, Rotary_encoder_b_pin, Rotary_encoder_Button_pin, Rotary_encoder_vcc_pin, Rotary_encoder_steps);
// Instance for LCD display
Liquidcrystal_i2c LCD(0x27,16,2);  // Set the lcd address to 0x27 for a 16 chars and 2 line display
// Instance for Audio Components
Audio *decoder = ZERO;
Audio filesourceistream *file = ZERO;
Audio filesource buffer *buff = ZERO;
Audiooutputi2s *out;

// Special character to Show a Speaker Icon for Current Station
uint8_t speaker[8]  = {0x3,0x5,0x19,0x11,0x19,0x5,0x3};
// global variables
uint8_t curing = 0;   // Index for current selected station in station list
uint8_t act = 0;   // Index for current station in station list used for streaming 
uint32_t liability = 0;  // Time of Last Selection Change

// Callback function wants to be called If Meta Data Were Found in Input Stream
void MDCallback(void *cbdata, const char *type, Bool isunicode, const char *string)
{
  const char *PTR = Reinterpret_Cast<const char *>(cbdata);
  (void) isunicode; // Punt this ball for Now
  // note that the type and string may be in progmem, so copy them to ram for printf
  char S1[32], s2[64];
  strncpy_p(S1, type, Sizeof(S1));
  S1[Sizeof(S1)-1]=0;
  strncpy_p(s2, string, Sizeof(s2));
  s2[Sizeof(s2)-1]=0;
  Serial.printf("Metadata (%s) '%s' = '%s' \ n", PTR, S1, s2);
  Serial.flush();
}

// stop playing the input stream release memory, delete instantences
void stop playing() {
  IF (decoder)  {
    decoder->Stop();
    delete decoder;
    decoder = ZERO;
  }
  IF (buff)  {
    buff->close();
    delete buff;
    buff = ZERO;
  }
  IF (file)  {
    file->close();
    delete file;
    file = ZERO;
  }
}

//start playing a stream from current active station
void startUrl() {
  stopPlaying();  //first close existing streams
  //open input file for selected url
  Serial.printf("Active station %s\n",stationlist[actStation].url);
  file = new AudioFileSourceICYStream(stationlist[actStation].url);
  //register callback for meta data
  file->RegisterMetadataCB(MDCallback, NULL); 
  //create a new buffer which uses the preallocated memory
  buff = new AudioFileSourceBuffer(file, preallocateBuffer, preallocateBufferSize);
  Serial.printf_P(PSTR("sourcebuffer created - Free mem=%d\n"), ESP.getFreeHeap());
  //create and start a new decoder
  decoder = (AudioGenerator*) new AudioGeneratorMP3(preallocateCodec, preallocateCodecSize);
  Serial.printf_P(PSTR("created decoder\n"));
  Serial.printf_P("Decoder start...\n");
  decoder->begin(buff, out);
}

//show name of current station on LCD display
//show the speaker symbol in front if current station = active station
void showStation() {
  lcd.clear();
  if (curStation == actStation) {
    lcd.home();
    lcd.print(char(1));
  }
  lcd.setCursor(2,0);
  String name = String(stationlist[curStation].name);
  if (name.length() < 15)
    lcd.print(name);
  else {
    uint8_t p = name.lastIndexOf(" ",15); //if name does not fit, split line on space
    lcd.print(name.substring(0,p));
    lcd.setCursor(0,1);
    lcd.print(name.substring(p+1,p+17));
  }
}

//handle events from rotary encoder
void rotary_loop()
{
  //dont do anything unless value changed
  if (rotaryEncoder.encoderChanged())
  {
    uint16_t v = rotaryEncoder.readEncoder();
    Serial.printf("Station: %i\n",v);
    //set new currtent station and show its name
    if (v < STATIONS) {
      curStation = v;
      showStation();
      lastchange = millis();
    }
  }
  //if no change happened within 10s set active station as current station
  if ((lastchange > 0) && ((millis()-lastchange) > 10000)){
    curStation = actStation;
    lastchange = 0;
    showStation();
  }
  //react on rotary encoder switch
  if (rotaryEncoder.isEncoderButtonClicked())
  {
    //set current station as active station and start streaming
    actStation = curStation;
    Serial.printf("Active station %s\n",stationlist[actStation].name);
    pref.putUShort("station",curStation);
    startUrl();
    //call show station to display the speaker symbol
    showStation();
  }
}

//interrupt handling for rotary encoder
void IRAM_ATTR readEncoderISR()
{
  rotaryEncoder.readEncoder_ISR();
}

//setup
void setup() {
  Serial.begin(115200);
  delay(1000);
  //reserve buffer für for decoder and stream
  preallocateBuffer = malloc(preallocateBufferSize);          // Stream-file-buffer
  preallocateCodec = malloc(preallocateCodecSize);            // Decoder- buffer
  if (!preallocateBuffer || !preallocateCodec)
  {
    Serial.printf_P(PSTR("FATAL ERROR:  Unable to preallocate %d bytes for app\n"), preallocateBufferSize+preallocateCodecSize);
    while(1){
      yield(); // Infinite halt
    }
  } 
  //start rotary encoder instance
  rotaryEncoder.begin();
  rotaryEncoder.setup(readEncoderISR);
  rotaryEncoder.setBoundaries(0, STATIONS, true); //minValue, maxValue, circleValues true|false (when max go to min and vice versa)
  rotaryEncoder.disableAcceleration();
  //init WiFi
  Serial.println("Connecting to WiFi");
  WiFi.disconnect();
  WiFi.softAPdisconnect(true);
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PSK);
  // Try forever
  while (WiFi.status() != WL_CONNECTED) {
    Serial.println("...Connecting to WiFi");
    delay(1000);
  }
  Serial.println("Connected");
  //create I2S output do use with decoder
  //the second parameter 1 means use the internal DAC
  out = new AudioOutputI2S(0,1);
  //init the LCD display
  lcd.init();
  lcd.backlight();
  lcd.createChar(1, speaker);
  //set current station to 0
  curStation = 0;
  //start preferences instance
  pref.begin("radio", false);
  // Set Current Station to Saved Value IF Available
  IF (Pref.Iskey("station")) curing = Pref.gut("station");
  IF (curing >= Ward) curing = 0;
  // Set Active Station to Current Station 
  // Show on display and start streaming
  act = curing;
  show station();
  starturl();
}

void loop() {
  // check if stream has ended Normally not on icy streams
  IF (decoder->Isrunning()) {
    IF (!decoder->loop()) {
      decoder->Stop();
    }
  } Else {
    Serial.printf("MP3 Done \ n");

    // Restart ESP when streaming is done or errored
    delay(10000);

    ESP.remaining start();
  }
  // Read events from Rotary Encoder
  rotary_loop();

} 

Sketch to download

Before compiling, the SSID and the password must be set for the WLAN. At the beginning of the sketch is a list of 24 German radio stations. You can edit or expand them as you like to hear your desired program. A maximum of 100 stations can be defined.

After uploading, the program can be started. The channel list can be scrolled with the Rotary Encoder. If you press the button of the Rotary Encoder, the station that has just been displayed is set as active. This selection is saved in the flash, so that after a power break, the program is started again with the selected transmitter. The station that has just been reproduced is displayed on the display by a preceding loudspeaker symbol.

Finished device

Have fun with the internet radio

Post as a PDF

Update from our reader Andreas Schröder

(thanks at this point)

With a cut black film on white housing, it looks really good.

Because this is not tingling and screwing up, I expanded the code to include the following:

1. An automatic AP mode with a lack of WLAN connection, which then queries the access data via web server.

2. In normal operation, the transmitter list can be maintained via a web front end. Would like to have provided the code, screenshots and the plotter file for the film here.

WIRELESS INTERNET ACCESS

The WLAN configuration is held in the internal flash memory. This can be configured using the web interface. The configuration process is as follows:

  • Charge the saved login data

  • Attempt to make connections (display shows "WLAN")

  • If that is not possible

    • Change to AP mode and create the WLAN "WebRadio"

    • Expect the data entry under http://192.168.4.1

    • Restart with new data

==> The whole thing is repeated until a connection is possible

 

 

Transmitter list

The list of stored transmitters can above http: // be adjusted.

 

Sketches download

 

Plotter file (silhouette format)

DisplaysEsp-32Projekte für anfängerStromversorgung

239 comments

Christian Zirlewagen

Christian Zirlewagen

Bei mir funktioniert es mit esp32 Espressif Systems Version 2.0.11
Zunächst war es ein Hardwareproblem mit dem 10kOhm Widerstand zwischen 3,3V und Pin 34 des Rotary – einfach eine Lötbrücke vergessen. 3D Druck hat gut funktioniert dank der stl Dateien.
Vielen Dank für das schöne Projekt – wird nun in der Jugendgruppe nachgebaut!

Michael

Michael

Hallo zsuammen.
habe auch ein paar Stunden gekämpft, bis es auf einem ESP32 Lyrat4.3 einigermaßen lief. Ich denke, der RAM-Bereich für den Codec ist zu klein. Seit ich den vergrößert habe läuft es viel besser (auch, insbesondere AAC).

Habe
“const int preallocateCodecSize = 29192;”
geändert in
“const int preallocateCodecSize = 85332; // AAC+SBR codec max mem needed”
Siehe https://github.com/earlephilhower/ESP8266Audio/issues/622
Viele Grüße

Martin van Doorn

Martin van Doorn

Danke für dieses Projekt, sieht sehr schön aus und ich würde es gerne nachbauen.
Aber zuerst habe ich versucht, den Code zu kompilieren.
Dabei bin ich auf mehrere Probleme gestoßen.

Type benennt keinen Typ
Station benennt keinen Typ

WEBradio_ESP32_AZ_Dilevry:29:3: Fehler: ‘type’ benennt keinen Typ
type struct {char * url;
^
WEBradio_ESP32_AZ_Dilevry:31:17: error: ‘station’ benennt keinen Typ
} station;
^
WEBradio_ESP32_AZ_Dilevry:36:1: Fehler: ‘station’ benennt keinen Typ
station wardlist[Ward] Progmem = {
^

Exit-Status 1
‘type’ benennt keinen Typ

Kann mir jemand weiterhelfen?
Vielen Dank im Voraus

Übersetzt mit DeepL.com (kostenlose Version)

Martin van Doorn

Martin van Doorn

Hello, Very nice project and love to build, but first I tried the code:
Run in multiple problem.
Somebody to help?

WEBradio_ESP32_AZ_Dilevry:29:3: error: ‘type’ does not name a type
type struct {char * url;
^
WEBradio_ESP32_AZ_Dilevry:31:17: error: ‘station’ does not name a type
} station;
^
WEBradio_ESP32_AZ_Dilevry:36:1: error: ‘station’ does not name a type
station wardlist[Ward] Progmem = {
^
Multiple libraries were found for “AudioFileSource.h”
Used: C:\Users\cme\Documents\Arduino\libraries\ESP8266Audio-master
Not used: C:\Program Files (x86)\Arduino\libraries\ESP8266Audio
Multiple libraries were found for “WiFi.h”
Used: C:\Users\cme\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\WiFi
Not used: C:\Program Files (x86)\Arduino\libraries\WiFi
Multiple libraries were found for “SD.h”
Used: C:\Users\cme\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\SD
Not used: C:\Program Files (x86)\Arduino\libraries\SD
exit status 1
‘type’ does not name a type

Reimund

Reimund

Kann man auch statt des 2 zeiligen Display ein 4 stelliges einbinden ? Da hat man ja mehr Informationen. Es gibt zwar ein Projekt welches mit einem 4 stelligen arbeitet, aber dort werden zwei Mono Verstärker gebraucht.

Bart Crimson

Bart Crimson

Problems booting, what’s happening?

Rebooting…
ets Jul 29 2019 12:21:46

rst:0xc (SW_CPU_RESET),boot:0×13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0×00,q_drv:0×00,d_drv:0×00,cs0_drv:0×00,hd_drv:0×00,wp_drv:0×00
mode:DIO, clock div:1
load:0×3fff0030,len:1184
load:0×40078000,len:13260
load:0×40080400,len:3028
entry 0×400805e4
Connecting to WiFi
…Connecting to WiFi
…Connecting to WiFi
Connected
Gespeicherte Station 0 von 25
Active station http://icecast.vrtcdn.be/stubru-high.mp3
sourcebuffer created – Free mem=97520
created decoder
Decoder start…
Guru Meditation Error: Core 1 panic’ed (LoadProhibited). Exception was unhandled.

Reimund

Reimund

Bekomme am Schluss immer die Fehlermeldung
Compilation error: ‘class LiquidCrystal_I2C’ has no member named ‘init’

Und das bei der Version von Update von unserem Leser Andreas Schröder

Kann mir da bitte jemand helfen ?

Reimund

Reimund

Hallo die normale Version bekomme ich compal.

aber die
Update von unserem Leser Andreas Schröder
bewkomme ich am Schluss immer eine Fehlermeldung

Mark

Mark

Das Radio finde ich super! Allerdings kämpfe ich mit der Einrichtung verschiedener Radiosender. Mir ist beispielsweise bei SWR3 aufgefallen, dass die Anfrage mit einem Returncode 401 (Not authorized) abgewiesen wird. Wenn man die URL im Browser öffnet sieht man erst einen 302 (Redirect) und es werden dann diverse Tokens an die URL angehängt. Damit kommt die Funktion startUrl() bzw. die Methode AudioFileSourceICYStream wohl nicht klar. Das Radio startet dann nach einigen Sekunden neu.
Nehme ich nun aber beispielsweise die URL von Radio BOB! dann wird diese im Browser unverändert aufgerufen und abgespielt. Hier der Consolen Output. Ich verstehe nicht, warum hier ein Code -9 zurückkommt und das Radio anschließend neu startet.
Active station http://regiocast.streamabc.net/regc-radioboblive-mp3-192-3829599
[D][HTTPClient.cpp:293] beginInternal(): protocol: http, host: regiocast.streamabc.net port: 80 url: /regc-radioboblive-mp3-192-3829599
[D][HTTPClient.cpp:579] sendRequest(): request type: ‘GET’ redirCount: 0

] connect(): connected to regiocast.streamabc.net:80
[D][HTTPClient.cpp:1257] handleHeaderResponse(): code: 200
[D][HTTPClient.cpp:1264] handleHeaderResponse(): Transfer-Encoding: identity
[D][HTTPClient.cpp:603] sendRequest(): sendRequest code=-9

] returnError(): error(-9): Transfer-Encoding not supported
[D][HTTPClient.cpp:1419] returnError(): tcp stop
[D][HTTPClient.cpp:400] disconnect(): tcp is closed

Sebastian Eichner

Sebastian Eichner

Hatte auch Probleme.
sobald MDCallback auskommentiert ist läuft das ganze auch mit den aktuellen Libs.

Reinhard

Reinhard

@Eckmar Schmitz
Das Gehäuse ist problemlos druckbar. Habe es mit dem Ultimaker Cura bearbeitet, natürlich muss man den Deckel “auf den Kopf” drehen.

Michael-S

Michael-S

@Rene
also ich hab auch erst Probleme mit den diversen Bibliotheksversionen gehabt. Am Ende habe ich exakt die Versionen wie in den Screenshots oben verwendet;
meine Arduino IDE: 1.8.16
Voreinstellungen → zusätzliche Boardverwalter URL’s:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Audio-Bibliothek: ESP8266Audio Version 1.9.5
ESP 32 Board: esp32 Version 1.0.6
Damit läuft es im Prinzip, zumindest mit den Streams aus dem Beispiel, allerdings nicht mit den Streams der SWR Sender.

Bernd

Bernd

Hallo,
ich habe mir auch diesen Radiowecker nachgebaut. Tolles Projekt.
Leider funktioniert bei mir, wie bei Michaels Post, die Titelanzeige des Senders nicht.
Hat jemand eine Tipp an was das liegen könnte????
Dankeee

Didi

Didi

Ich kann mich dem Kommentar von Rene vollumfänglich anschließen. Ich habe Unmengen von Bibliotheksversionen, IDEs und Borddefinitionen ausprobiert, bei einigen Versionen wird nicht einmal kompiliert. Übrigens sowohl bei der alten als auch der neuen Variante der Webradio Firmware. Immer wenn der Stream beginnt, startet der MC neu.
So ist der komplette Aufbau nur Elektronikschrott…

Eckmar Schmitz

Eckmar Schmitz

Für alle die das Problem mit dem laufenden Restart des Microcontrollers haben – bitte alle 3 GND Anschlüsse miteinander verbinden. Wird dies nicht gemacht, ist die Spannung am +5V Pin zu klein wenn über den USB Anschluß eingespeist wird. Durch das Display bricht die Spannung zusammen und er Controller macht einen Reset.
Ich hoffe ich konnte helfen – hatte das gleiche Problem. Jetzt nicht mehr und alles funktioniert.

Rene

Rene

Leider funktioniert der Code nicht mehr. Vor ca. 2 Jahren konnte ich alles erfolgreich aufbauen. Mit der aktuellen IDE und den aktuellen Lib’s muss es aber ein Problem geben. WLAN lädt, der Sender wird gefunden und im Moment des Abspielens startet der ESP neu.
Kann jemand mal bitte die Releases der Lib’s und IDE nennen, mit denen es funktioniert?

Reinhard

Reinhard

@Alberto Borsetta:
Just take a look at the parts list….near the bottom

Gerhard Kündig

Gerhard Kündig

Hallo Gerald
Auch ich habe Probleme mit dem Code. Beide Arduino.ide Versionen (1.8.12 und 2.2.1)kompilieren mir den Sketch, er wird auch hochgeladen, dann aber rebootet das Modul dauernd nach der Zeile «Decoder Start». Nun habe ich die Zeile * (file→RegisterMetadataCB(MDCallback, NULL); )* auskommentiert, was bei mir nicht viel brachte. Mit etwas Glück hört man für ein bis zwei Sekunden den Ton korrekt, dann kratzt es nur noch. Nach all den Kommentaren bin ich auch der Überzeugung, dass die Bibliothek «ESP8266Audio» sich mit dem Board nicht verträgt. Übrigens in der Boardverwaltung findet man die Version esp32-2.0.9 nicht mehr. Also habe ich die beiden höheren Versionen ausprobiert.
Vielleicht stellt jemand im Forum eine funktionierende .bin Datei zur Verfügung, das wäre auch sehr nett. Das Problem zeigt sich bei mehreren ESP32 Node MCU-Modulen identisch.
Gerhard Kündig

Eckmar Schmitz

Eckmar Schmitz

Leider ist die STL Datei für den Deckel nicht zu gebrauchen. Sie ist nicht druckbar. Beim Schaltbild fehlen einige Verbindungen. Auch das ist so unbrauchbar. Wenn möglich korrigieren.

Rene

Rene

Geht leider nicht :(

20:23:37.335 → Connecting to WiFi
20:23:37.433 → …Connecting to WiFi
20:23:38.456 → Connected
20:23:39.542 → Gespeicherte Station 8 von 25
20:23:39.542 → Active station http://dispatcher.rndfnk.com/br/br3/live/mp3/low
20:23:39.805 → sourcebuffer created – Free mem=126696
20:23:39.805 → created decoder
20:23:39.805 → Decoder start…
20:23:40.331 → Guru Meditation Error: Core 1 panic’ed (LoadProhibited). Exception was unhandled.

Jörg Braun

Jörg Braun

Sehr schön, vielen Dank.
Einziges Problem, die Plotter-Datei im Silhouette-Format. Silhouette gibt es auch nur für Windows. www.online-convert.com mochte die Datei bei mir nicht, dafür http://www.ideas-r-us-software.uk/FileConverters/SilhouetteStudioConverter.aspx.
Mit SVG kommt man dann weiter.

Alberto Borsetta

Alberto Borsetta

Is it also possible to share 3D models (.stl or other) for printing of the enclosure? Thanks, Alberto

Michael-S

Michael-S

tolles Projekt, kommt für mich gerade zur rechten Zeit. Wohne in schlechter Empfangslage und hatte bisher analoge Radiosender über Kabel. Jetzt hat Vodafone die analogen Kanäle abgeschaltet und da wäre das ESP32 Webradio – ohne alle externen Komponenten – genau das Richtige (Audio direkt über den Aux Eingang in den AV Receiver).
Leider funktioniert das Decodieren meiner lokalen Sender SWR1 und SWR3 nicht.

Beispiel: liveradio.swr.de/sw282p3/swr1bw/play.mp3 bzw. liveradio.swr.de/sw282p3/swr3/play.mp3
Wenn ich die Adresse im Browser eingebe, wird dieser weitergeleitet:
http://d121.rndfnk.com/ard/swr/swr3/live/mp3/128/stream.mp3?aggregator=web&cid=01FC1X5J7PN2N3YQPZYT8YDM9M&sid=2bRYvGg48qLoJX6kXZ8h821Ooqu&token=b9TBNhKWbE9D53Q7zcaQUtrBvp3_FyBQbG0GHq0BD5Q&tvf=Vv0VhPCkrRdkMTIxLnJuZGZuay5jb20

Mit dem Browser, vlc oder mpv funktioniert das problemlos, aber nicht mit dem ESP32.
Ich hab mal versucht, das mittels ffmpeg “umzuleiten”:
ffmpeg -re -i https://liveradio.swr.de/sw282p3/swr1bw/play.mp3 -vcodec none -acodec copy -ac 2 -b:a 128k -content_type audio/mpeg -f mp3 -listen 1 http://192.168.1.24:8888/stream.mp3
damit entfällt die Umleitung mit den aggregator und cid Paramter, funktioniert mit dem ESP32 aber trotzdem nicht.
Hat jemand eine Idee, wie ich das zum laufen bekomme?
Vielen Dank und Grüße
Michael

Siegfried

Siegfried

@Jörg: Bei SSID dort kommt der WLan Name und PSK ist Dein WLan Passwort und beides in die Anführungszeichen setzen …

Jörg

Jörg

Habe mich soweit durchgekämpft, die ARDUINO Oberfläche meldet Übertragung zu 100% abgeschlossen. Es ist jedoch nur Rauschen zu hören. Im Display erscheint nur die untere Zeile jedoch ist auch diese leer. Bei define PSK weiß ich nicht was ich da eintragen soll, ist das Phase Shift Keying? Was wäre da passend? Für die Bibliothek „LiquidCrystal I2C“ finde ich einige Einträge, ich habe scheinbar nicht die Passende gewählt. Gibt es da eine Empfehlung? Überhaupt stehen manche Versionsnummern gar nicht mehr zur Auswahl.
Wäre sehr froh über Hilfe.

Holger

Holger

Hallo zusammen,
ich finde das Projekt echt gelungen. Noch besser wäre es, wenn eine Sprachsteuerung integriert wäre (ohne irgend eine Cloud-Anwendung zu nutzen). Also keine Alexa o. ä.
Kennt jemand so ein Projekt ?
Gruß Holger

Aust, Jan

Aust, Jan

Ich würde es begrüßen, wenn die passiven Bauteile beim Bausatz dabei wären, zu mindestens die Widerstände und der Kondensator, die man direkt für die Funktion des Ganzen benötigt.

W.Müller

W.Müller

Hallo ihr ESP Radio Programmierer,
ich habe das Projekt auch bei mir umgesetzt und bin total begeistert. Vilen Dank allen, die daran beteiligt waren und sind. Ich habe allerdings ein Problem. Ich möchte neben den reinen Internetradiosender gern auch von meiner Synology (NAS) MP3 streamen. Leider bekomme ich das so nicht hin. Wenn ich z.B statt eines Internetsenders folgenden Eintrag einstelle: “http://192.168.×.x:80/Gruppe – Titel.mp3” funktioniert es einwandfrei. Gebe aich allerdings eine M3U Playlist an, stützt das Programm ab und der ESP startet neu.
Frage:
Wie kann ich auf meinem NAS eine Playlist abspielen?
Herzlichen Dank für Tipps
Wigbert

Alf W.

Alf W.

Gibt es zu diesem Problem noch eine weitere Lösung? —> Ich hatte auch das Problem, dass der Prozessor offenbar immer neu startete. Ich habe den Aufruf (file→RegisterMetadataCB(MDCallback, NULL); ) auch auskommentiert. Damit started der Prozessor nicht immer wieder. Der aktuelle Sender wird abgespielt, ich kann andere Sender wählen – diese werden aber nicht abgespielt – nach ein paar Sekunden wird wieder der erste Sender abgespielt.

Werner Boellmann

Werner Boellmann

P.S. warum den Quelltext auf dem “Schrott” Google-Drive veröffentlichen. Ich lehne es ab mich dort zu registrieren – und ohne Registrierung komt man die Dateien nicht ran.
Ich weiß – die wollen nur unser Bestes. Aber das bekommen die nicht!

Werner Boellmann

Werner Boellmann

|Klaus P.
: MDCallback()
Ich vermute, daß
1. es im MDCallback() zu einem Stack-Overflow kommt,
2. oder/und der Callback im Kontext einer ISR aufgerufen wird.
Zum Testen:
1. Im Callback " char s132, s264;" als static deklarieren. Dann wird der Speicher fest reserviert und nicht auf dem Stack.
2. den Callback als “void IRAM_ATTR” deklarieren.

Klaus P.

Klaus P.

@Gerald Lechner
Ich hatte auch das Problem, dass der Prozessor offenbar immer neu startete. Bei mir hat es geholfen die MDCallback-Funktion und den Aufruf (file→RegisterMetadataCB(MDCallback, NULL); ) zu löschen bzw. auszukommentieren. Vielleicht findet ja jemand die Ursache?

Gerald Lechner

Gerald Lechner

Hallo Manfred
das programm stürzt ab, wenn der MP3 dekoder gestartet wird. Es könnte sein, dass die Versionen von ESP8266Audio und dem ESP32 Package nicht zusammenpassen. Definitiv funktioniert ESP8266Audio Version 1.9.7 zusammen mit dem ESP32 Package Version 2.0.9
Eine weitere Ursache könnte sein, dass der ESP32 zu viel Strom zieht und die Stromversorgung zu schwach ist. Diese Ursache halte ich aber für sehr unwahrscheinlich.

Lampl Manfred

Lampl Manfred

Hallo Gerald
Hier die Ausgabe von seriellen Monitor:

Verbinde mit WiFi ….IP-Adresse per DHCP ist 192.168.0.32
Connected
Webserver ist gestartet
Active station http://icecast.ndr.de/ndr/ndr2/niedersachsen/mp3/128/stream.mp3
sourcebuffer created – Free mem=67928
created decoder
Decoder start…
Guru Meditation Error: Core 1 panic’ed (LoadProhibited). Exception was unhandled.

Core 1 register dump:
PC : 0×4008ae4d PS : 0×00060d30 A0 : 0×80157dfc A1 : 0×3ffcbb50
A2 : 0×00000000 A3 : 0xfffffffc A4 : 0×000000ff A5 : 0×0000ff00
A6 : 0×00ff0000 A7 : 0xff000000 A8 : 0×00000000 A9 : 0×3ffcbf50
A10 : 0×3ffc55e4 A11 : 0×00000588 A12 : 0×0000001c A13 : 0×00000002
A14 : 0×00000000 A15 : 0×00000000 SAR : 0×00000018 EXCCAUSE: 0×0000001c
EXCVADDR: 0×00000000 LBEG : 0×4008ae4d LEND : 0×4008ae5d LCOUNT : 0xffffffff

Gerald Lechner

Gerald Lechner

@Pit: Sie haben im Prinzip recht. Da beide Signalleitungen vom ESP32 als Ausgang betrieben werden ist es aber nicht ganz so kritisch. Ich hatte noch keine Probleme damit.
Die Pullup Widerstände sind 4,7kOhm. wenn man beide Leitungen über 10kOhm mit Masse
verbindet ändert sich die Leerlaufspannung von 5V auf 3.4 V. Spannungsteiler 5 / (4.7 + 10) * 4.7 = 3.4
@Manfred Lampl: Um helfen zu können benötige ich mehr Informationen. Zumindest die Ausgabe vom seriellen Monitor.

Manfred Lampl

Manfred Lampl

Hallo
Habe mit Erfolg den ESP32 geflasht, leider wechselt die Anzeige ständig zwischen WLAN und den 1. Sender in Sekunden Takt hin und her. dh. der ESP bootet ständig …
was kann das sein.
Bitte um Hilfe.
bedanke mich im vorraus für die Unterstützung.
Manfred

Pit

Pit

Hi,
ich finde die Anschaltung des Display es etwas “gefaehrlich” fuer den ESP32,
denn so wie dargestellt wird der I2C ueber die PullUps auf der Display-Interfaceplatine
auf 5V gezogen, der ESP32 mag aber , soweit mir bekannt , keine 5V am GPIO.
Deswegen wuerde ich vorschlagen entweder das Display auf 3V3 oder die PullUps
von der Interfaceplatine entfernen und 2 neue gegen 3V3 in die Schaltung zu integrieren.

Thomas

Thomas

Hallo,
habe das Radio gebaut – läuft mit den meisten der vorbereiteten Sender.
Suche nach einem funktionierenden URL für “Radio SwissClassic”.
Hat den jemand in seiner Liste?
Herzlichen Dank für das tolle Projekt und einen hoffentlich bald spielenden Lieblingssender!
Thomas

Siegfried

Siegfried

@ Waldi65: bei mir gibt es solch Reaktion, wenn der 10 k Widerstand am GPIO 35 zum 3,3 V Anschluss fehlt (Encoder Sender SW muss ja nicht unbedingt angeschlossen sein)

Waldi65

Waldi65

ich bekomme das ding nicht zum laufen. Audio 1.9.5 esp 1.0.6. es wird in einer Schleife rebootet mit folgendem output:
17:52:42.392 → load:0×40080400,len:3600
17:52:42.392 → entry 0×400805f0
17:52:43.770 → Connecting to WiFi
17:52:43.890 → …Connecting to WiFi
17:52:44.880 → Connected
17:52:46.035 → End Serup!
17:52:46.035 → Guru Meditation Error: Core 1 panic’ed (LoadProhibited). Exception was unhandled.
17:52:46.035 →
17:52:46.035 → Core 1 register dump:
17:52:46.035 → PC : 0×400d2fe4 PS : 0×00060b30 A0 : 0×800e22b4 A1 : 0×3ffb2270
17:52:46.035 → A2 : 0×3ffc451c A3 : 0×3ffc4788 A4 : 0×00000000 A5 : 0×00000017
17:52:46.035 → A6 : 0×3ffb8188 A7 : 0×80000001 A8 : 0×800d2fc8 A9 : 0×3ffb2240
17:52:46.068 → A10 : 0×00000000 A11 : 0×0000000a A12 : 0×3ffc4bd4 A13 : 0×00000000
17:52:46.068 → A14 : 0×00000000 A15 : 0×00000001 SAR : 0×0000001f EXCCAUSE: 0×0000001c
17:52:46.068 → EXCVADDR: 0×00000000 LBEG : 0×4008ad31 LEND : 0×4008ad41 LCOUNT : 0xfffffffd
17:52:46.068 →
17:52:46.068 →
17:52:46.068 → Backtrace: 0×400d2fe1:0×3ffb2270 0×400e22b1:0×3ffb2290
17:52:46.068 →
17:52:46.068 →
17:52:46.068 →
17:52:46.068 →
17:52:46.068 → ELF file SHA256: ecf99bcd61080b16
17:52:46.103 →
17:52:46.135 → Rebooting…
17:52:46.135 → ets Jul 29 2019 12:21:46

Oliver Mittelstedt

Oliver Mittelstedt

wann gibt es das set wieder zum kaufen

Günter R.

Günter R.

Nachtrag: Zur nur einkanaligen und verzerrten Ausgabe finde ich nun folgende Fehlermeldung im seriellen Monitor:

Station: 5
Active station Deutschlandfunk

Active station http://st01.sslstream.dlf.de/dlf/01/128/mp3/stream.mp3
sourcebuffer created – Free mem=87248
created decoder
Decoder start…
E (228122) I2S: register I2S object to platform failed
Nachrichten, Deutschlandfunk-Nachrichtenredaktion

Nun verwende ich den ESP-32 Wroom… könnte es Konflikte im Soundmodul der Plattformen geben? Alle anderen Features funktionieren einwandfrei, keine Compiler-Warnungen etc. Die ESP32Audio-Lib funktioniert dabei nur in der Version 1.9.7, alle anderen Versionen versagen.
Vielen Dank für alle Hilfe-Ideen im Voraus
Günter

GuidoJ

GuidoJ

Hallo Geradl und Andreas,
ich habe das Radio seit heute am funktionieren. Ich verwende den update von Andreas. Vielen Dank auf diesem weg für dieses Projekt.

Wo ich am meisten kämpfen musste war, die richtigen Versionen der Boards und LIBs zu finden, das war echt ne Challenge

In der Arduino Umgebung ist es auch schwer nachzuvollziehen, welche LIB am Ende verwendet wird.

Nochmals Danke :-)

Geyer Mario

Geyer Mario

Hallo Gerald,
erstmal vielen Dank für das tolle Projekt.
Habe es nachgebaut, nach ein paar anfänglichen Schwierigkeiten (Fehlermeldungen der Arduino IDE, Kontrast des Display) funktioniert es sehr gut.
Ein Problem habe ich noch. Mit nicht funktionierenden Sendern hängt sich das Radio auf. Ich bekomme es nur mit erneuten Hochladen des Sketches
wieder zum “Laufen”. Ich verwende den Sketch https://drive.google.com/file/d/1p4yQgZXTW-PPM-eKDq0UaH6RVy-SruYn/view?usp=sharing, welcher in der Beschreibung nach dem Sketch zum Download enthalten ist. Kann man das Hochladen umgehen.
Ich bin absoluter Neuling in der “Materie” muss ich noch dazu sagen.

Viele Grüße Mario

Thomas Anton

Thomas Anton

Ich habe den Sketch hochgeladen und habe auch die SSID und Passwort über das Webinterface eingegeben. Nun wechselt die LCD-Anzeige von “WLAN” dann geht die LCD aus dann zeigt sie den “Sendernamen” und wieder aus und wieder “WLAN”. Das geht so im Sekundentakt.
Auch bin ich nur kurzzeitig auf das Webinterface mit meinem Smartphone gekommen, alles eingegeben und gespeichert. Jetzt komme ich nicht mehr in das Webinterface. Das die SSID und Passwort übernommen worden ist zeigt mir so denke ich das die Sender angezeigt werden.??
Oder wo kann ich im Sketch die SSID und Passwort eingeben?

Marvin

Marvin

Hallo zusammen,

erstmal vielen Dank für das coole Projekt. Ich habe das Radio bei mir mittlerweile zum Laufen bekommen und bin auch recht zufrieden. Der einzige Makel den ich noch habe, ist ein leichtes mehr oder weniger “typisches Radiokratzen”, das ja aber eig. bei einem Internetradio eher nicht vorkommen sollte. Nun die Frage, ob das bei anderen auch so ist, woher das kommt und im besten Fall ob es einen Fix dafür gibt.
Vielen Dank im Voraus!

Andreas Wolter

Andreas Wolter

@Richard Mayer: soweit ich weiß, ist das ein bekanntes Problem und wurde bisher auch nicht behoben. Den Workaround, das Leerzeichen durch %20 zu ersetzen, habe ich auch gesehen. Es funktioniert leider meistens nicht. Generell sollten Leerzeichen in der SSID also vermieden werden.

Grüße,
Andreas Wolter
AZ-Delivery Blog

Richard Mayer

Richard Mayer

Hallo,

vielen Dank für die vielen Tipps und den Quellcode.
Leider habe ich in meiner WLAN-SSID ein Leerzeichen und habe damit keiner Verbindung hinbekommen.
Weder die Eingabe im Webinterface noch direkt in der INO-Datei.
Hat jemand noch einen Tipp, wie und an welcher Stelle ich das mit einem Leerzeichen in der SSID hinbekommen könnte oder wie man das irgendwie escapen könnte? Weder mit "\ " noch mit %20 war ich erfolgreich…

Schöne Grüße
Richard

Michael

Michael

Hallo H.Lechner

Ich habe das Radio mit der"alten" Hardware – allerdings mit 4×20 LCD-Display -, und der Software des “neuen” Radios in Betrieb.

Die Änderungen
Zitat:"
#define ROTARY_ENCODER_BUTTON_PIN 34
statt
#define ROTARY_ENCODER_BUTTON_PIN 35

Weiters muss im File audio.ino die Zeile 40 von
out = new AudioOutputI2S();
auf
out = new AudioOutputI2S(0, 1);
geändert werden.
"
habe ich implementiert.

Das “Radiohören” funktioniert eiwandfrei.
Jedoch werden keinerlei Daten (Titel o.ä.) in der 3. Zeile angezeigt. Egal bei welchem Sendestream. Auch werden über den Serial-Monitor keine
“Daten " angezeigt. – Wenn etwas “empfangen” wurde, würde es ja wie in Zeile
76 Serial.printf(" %s\n", title);
im “Sketchteil” audio steht, ausgegeben werden.
Den Tip aus den Kommentaren des “Neuen” Radios
„char title64; //character array to hold meta data message“ im Hauptprogramm ist zu vergrößern, z.B. zu verdoppeln"
habe ich schon befolgt – keine Änderung.
Haben Sie – oder ein anderer “Mitleser” einen Tip oder Idee ? Oder hat “jemand” einen Sender, bei dem Daten empfangen werden ?
@Alex-P: Welche Sender haben bei Dir Funktioniert ?

Gruß Michael

Alex-P

Alex-P

Hallo Herr Lechner. Zunächst herzlichen Dank für dieses schöne Bastelprojekt. Ich habe die Urversion nachgebaut und für eine bessere Klangqualität mit einem externen DAC (UDA1334) nachgerüstet. Das hässliche Brummgeräusch beim Senderwechsel lässt sich dann unterdrücken, indem man den Schalter am Rotary Encoder mit einem Interrupt ausliest und eine Pin für Muting auf HIGH setzt. Erst wenn der neue Stream gestartet ist, wird das Muting wieder freigegeben. Das Auslesen des Titels aus den Metadaten funktioniert bei einigen Stationen einwandfrei. Bei den ARD Sendern gelingt es mir leider nicht. Daher wundert es mich, wie @Andreas Kühn die Titelanzeige in dem Foto (im 2. Advent-Blog) bei dem Sender NDR2 NIEDERSACHSEN geschafft hat. Haben Sie oder andere Mitleser dazu eine Idee?

Leave a comment

All comments are moderated before being published

Recommended blog posts

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery