Example Code for Arduino - Play Online Music
This example demonstrates playing audio files from the network via ESP32-S3. After burning the code, enter the WiFi SSID and Password as prompted by the serial monitor to connect to WiFi. Then enter the network audio address to play the audio.
Hardware Preparation
Software Preparation
- Please install the ESP32-audioI2S library before using the example code. Library link: https://github.com/schreibfaul1/ESP32-audioI2S/
Sample Code
//**********************************************************************************************************
//* audioI2S-- I2S audiodecoder for ESP32, *
//**********************************************************************************************************
//
// first release on 11/2018
// Version 3 , Jul.02/2020
//
//
// THE SOFTWARE IS PROVIDED "AS IS" FOR PRIVATE USE ONLY, IT IS NOT FOR COMMERCIAL USE IN WHOLE OR PART OR CONCEPT.
// FOR PERSONAL USE IT IS SUPPLIED WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR
// OR COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
//
#include "Arduino.h"
#include "WiFiMulti.h"
#include "Audio.h"
#include "SPI.h"
#include "SD.h"
#include "FS.h"
#include <WiFi.h>
#include <Preferences.h>
// Digital I/O used
#define SD_CS 10
#define SPI_MOSI 11
#define SPI_MISO 13
#define SPI_SCK 12
#define I2S_DOUT 42
#define I2S_BCLK 45
#define I2S_LRC 46
Audio audio;
Preferences preferences;
const char* ssid;
const char* password;
void connectToWiFi(const char* ssid, const char* password) {
WiFi.begin(ssid, password);
Serial.printf("Connecting to WiFi: %s\n", ssid);
int retries = 0;
while (WiFi.status() != WL_CONNECTED && retries < 20) {
delay(500);
Serial.print(".");
retries++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("\nFailed to connect to WiFi.");
}
}
void initWiFi() {
preferences.begin("wifi", false);
String savedSSID = preferences.getString("ssid", "");
String savedPASS = preferences.getString("password", "");
if (savedSSID.length() > 0 && savedPASS.length() > 0) {
Serial.println("Found saved WiFi credentials.");
connectToWiFi(savedSSID.c_str(), savedPASS.c_str());
if (WiFi.status() == WL_CONNECTED) {
return;
} else {
Serial.println("Stored credentials failed. Please enter new credentials.");
}
} else {
Serial.println("No WiFi credentials found. Please enter:");
}
while (Serial.available()) Serial.read();
Serial.print("Enter SSID: ");
while (Serial.available() == 0) delay(10);
String inputSSID = Serial.readStringUntil('\n');
inputSSID.trim();
Serial.print("Enter Password: ");
while (Serial.available() == 0) delay(10);
String inputPASS = Serial.readStringUntil('\n');
inputPASS.trim();
connectToWiFi(inputSSID.c_str(), inputPASS.c_str());
if (WiFi.status() == WL_CONNECTED) {
preferences.putString("ssid", inputSSID);
preferences.putString("password", inputPASS);
Serial.println("WiFi credentials saved.");
} else {
Serial.println("Failed to connect. Credentials not saved.");
}
preferences.end();
}
void setup() {
pinMode(SD_CS, OUTPUT);
digitalWrite(SD_CS, HIGH);
SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
SPI.setFrequency(1000000);
Serial.begin(115200);
SD.begin(SD_CS);
initWiFi();
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
audio.setVolume(15); // 0...21
// audio.connecttoFS(SD, "test.wav");
// audio.connecttohost("http://www.wdr.de/wdrlive/media/einslive.m3u");
// audio.connecttohost("http://somafm.com/wma128/missioncontrol.asx"); // asx
// audio.connecttohost("http://mp3.ffh.de/radioffh/hqlivestream.aac"); // 128k aac
audio.connecttohost("https://ra-sycdn.kuwo.cn/e3f17b5516e9e42b69d4ffd039336e7d/681e0434/resource/n3/128/40/70/356596524.mp3"); // 128k mp3
}
void loop(){
vTaskDelay(1);
audio.loop();
if(Serial.available()){ // put streamURL in serial monitor
audio.stopSong();
String r=Serial.readString(); r.trim();
if(r.length()>5) audio.connecttohost(r.c_str());
log_i("free heap=%i", ESP.getFreeHeap());
}
}
// optional
void audio_info(const char *info){
Serial.print("info "); Serial.println(info);
}
void audio_id3data(const char *info){ //id3 metadata
Serial.print("id3data ");Serial.println(info);
}
void audio_eof_mp3(const char *info){ //end of file
Serial.print("eof_mp3 ");Serial.println(info);
}
void audio_showstation(const char *info){
Serial.print("station ");Serial.println(info);
}
void audio_showstreamtitle(const char *info){
Serial.print("streamtitle ");Serial.println(info);
}
void audio_bitrate(const char *info){
Serial.print("bitrate ");Serial.println(info);
}
void audio_commercial(const char *info){ //duration in sec
Serial.print("commercial ");Serial.println(info);
}
void audio_icyurl(const char *info){ //homepage
Serial.print("icyurl ");Serial.println(info);
}
void audio_lasthost(const char *info){ //stream URL played
Serial.print("lasthost ");Serial.println(info);
}
Additional Information
Was this article helpful?
