环境
vscode+platformio+arduion && 串口,wifi-CSDN博客
代码
cpp
// Welcome to www.LingShunLAB.com
#include "Arduino.h"
#include "WiFiMulti.h"
#include "Audio.h"
// Digital I/O used
#define I2S_DOUT 7
#define I2S_BCLK 15
#define I2S_LRC 16
Audio audio;
WiFiMulti wifiMulti;
// config your wifi
String ssid = "0000";
String password = "000";
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\n\nESP32-S3 Audio Streamer Starting...");
// 初始化 WiFi
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
// 添加 WiFi 网络
wifiMulti.addAP(ssid.c_str(), password.c_str());
Serial.println("Connecting to WiFi...");
Serial.print("SSID: ");
Serial.println(ssid);
// 尝试连接 WiFi,最多重试10次
int retryCount = 0;
while (wifiMulti.run() != WL_CONNECTED && retryCount < 20) {
delay(500);
Serial.print(".");
retryCount++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi Connected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
Serial.print("Signal Strength: ");
Serial.print(WiFi.RSSI());
Serial.println(" dBm");
} else {
Serial.println("\nWiFi Connection Failed!");
Serial.println("Possible causes:");
Serial.println("1. Wrong SSID or password");
Serial.println("2. WiFi network not in range");
Serial.println("3. Network requires special authentication");
Serial.println("4. Hardware issue");
// 继续执行,音频库可能会重试
}
// 初始化音频
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
audio.setVolume(12); // 0...21
// 只有在WiFi连接成功后才尝试连接音频流
if (WiFi.status() == WL_CONNECTED) {
Serial.println("Connecting to audio stream...");
audio.connecttohost("http://ngcdn001.cnr.cn/live/zgzs/index.m3u8"); // 128k mp3
}
}
void loop()
{
audio.loop();
// 定期检查WiFi状态
static unsigned long lastCheck = 0;
if (millis() - lastCheck > 10000) { // 每10秒检查一次
lastCheck = millis();
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi disconnected! Attempting to reconnect...");
wifiMulti.run();
}
}
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 callback functions (same as before)
void audio_info(const char *info){
Serial.print("info "); Serial.println(info);
}
void audio_id3data(const char *info){
Serial.print("id3data ");Serial.println(info);
}
void audio_eof_mp3(const char *info){
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){
Serial.print("commercial ");Serial.println(info);
}
void audio_icyurl(const char *info){
Serial.print("icyurl ");Serial.println(info);
}
void audio_lasthost(const char *info){
Serial.print("lasthost ");Serial.println(info);
}
// 添加WiFi事件处理回调
void WiFiEvent(WiFiEvent_t event) {
switch(event) {
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
Serial.println("WiFi Connected! Got IP: " + WiFi.localIP().toString());
break;
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
Serial.println("WiFi Disconnected. Attempting to reconnect...");
wifiMulti.run();
break;
default:
break;
}
}