ESP32 Web Radio
This is a simple web radio streamer. It connects to a web radio station via wifi, decodes the stream and plays the sound via I2S codec or to a speaker directly connected to the DAC pins.
- Decodes MP3 and AAC (Beta)
- Bluetooth Speaker mode
This project is based on Sprite_TM's awesome MP3 web radio project for the ESP8266: https://github.com/espressif/ESP8266_MP3_DECODER
Get the SDK:
git clone https://github.com/espressif/esp-idf.git cd esp-idf git submodule update --init
Set the IDF_PATH environment variable, and point it to this directory.
Download the toolchain from: https://github.com/espressif/esp-idf#setting-up-esp-idf You will need version 5.2.0. Add /path/to/xtensa-esp32-elf/bin to your PATH:
Clone this repository:
git clone https://github.com/MrBuddyCasino/ESP32_MP3_Decoder.git cd ESP32_MP3_Decoder/ git submodule init && git submodule update
The serial port and wifi credentials are configured using make.
make menuconfig and
- configure your serial port in
Serial flasher configsubmenu
Web Radio / Bluetooth Speakersubmenu
- configure wifi credentials
- select audio output mode
- activate / disable bt speaker mode
- 'save', then exit
You can edit the list of radio stations in the
/main/playlist.pls playlist file.
If this is the first time, initialize the submodules:
git submodule init && git submodule update.
Then, just type
Connect your serial cable and run 'make flash'. To see serial console output run 'make monitor'.
You can advance to the next track in the playlist using the "Boot" button that is present on most development boards (GPIO0).
You can connect a NeoPixel LED to pin 32. Its currently not doing much except blinking while wifi is connecting.
Bluetooth Speaker Mode
Classic Bluetooth in
Component config > Bluetooth > Bluedroid Bluetooth stack enabled > Classic Bluetooth, enable
A2DP, then enable
Bluetooth Speaker Mode via
make menuconfig. After flashing, you should see a Bluetooth device called "ESP_SPEAKER". If you don't like that name, you can change it via menuconfig.
Connecting the I2S codec
If you don't know about the I2S standard, it is a special protocol for transferring digital audio data between chips, similar to I2C. There are many I2S chips you can choose from, the most important differences are:
Amplification: some chips only decode the audio to a low analog level, so you need a separate amp, but some also have a built-in amplifier. Most of these 2-in-1 chips are made for smartphones so their energy output is in the range of 2-4W, but some other ones made for domestic audio appliances can go a lot higher.
MCLK (sometimes SCK): this is a separate clock signal that sometimes needs to be a precise number in the MHz range that depends on the current sample rate, sometimes can be a single constant value ("asynchronous") independent of the current sample rate, and sometimes is not required at all. The ESP32 does not output a MCLK signal, so a chip that does not require MCLK is most convenient. If you already have an asynchronous one lying around (e.g. ES9023), you will need a quartz oscillator, usually in the range of 20-50MHz.
Some I2S chips like the PM5102 will only generate the MCLK signal by themselves if the MCLK/CK pin is pulled low (See section 18.104.22.168 of the PM5102A datasheet). If you notice very hard distortion, try doing that.
I tested several I2S codecs, and was happiest with the MAX98357A, because it does not require MCLCK and also amplifies the audio to speaker levels. It also seemed to be more immune to signal integrity issues, which do occur on breadboards. There is a convenient breakout board from Adafruit: https://www.adafruit.com/product/3006. Be aware that it is mono only, for stereo you'll want this one: https://www.adafruit.com/product/3346. However, any I2S codec should work.
ESP pin - I2S signal ---------------------- GPIO25/DAC1 - LRCK GPIO26/DAC2 - BCLK GPIO22 - DATA
If you're using the MAX98357A, connect GND to ground and Vin to +5V (or +3.3V if +5V is unavailable). SD can remain unconnected, and GAIN too unless you want to make it louder or lower. I also recommend using a potentiometer for volume regulation.
If you are using PCM5102, you need to pull the XMT pin high for it output audio (0v = mute, 3.3v = unmute) .
Running without the I2S DAC
If you don't have an I2S codec on hand, there are two options:
- Built-In DAC (low quality)
- PDM (high quality)
make menuconfig and choose one of them in the
Audio Output Mode menu, then re-flash.
You can now connect a speaker to ground and the pins 25 and 26 for the left and right channels.
- Some AAC streams may not be playable
There is a thread over at the ESP32 forum: https://esp32.com/viewtopic.php?f=17&t=1026
If you're looking for a purpose-built board, check out the "ESP32 Audio Developing Board" from Microwavemont: https://www.tindie.com/products/microwavemont/esp32-audio-developing-board-esp32-adb/
I used the Watterott ESP-WROOM-32-Breakout, which is pin-compatible to the Espressif Core Board (DevKitC). Please note that in this picture, the JTAG header is connected too, but you can safely ignore that.