摘要: 本文将详细介绍如何使用 ESP32 开发板制作一个功能完备的网络收音机。我们将涵盖硬件选择、软件架构、网络连接、音频流解码、用户界面设计等方面,并提供完整的代码示例和详细的解释,帮助您轻松构建自己的网络收音机。
关键词: ESP32, 网络收音机, VS1053, Arduino, 音频流, HTTP, MP3, AAC
本项目旨在利用 ESP32 的强大性能和丰富的功能,打造一款可以播放互联网广播的网络收音机。主要功能包括:
以下是本项目所需的硬件清单:
本项目采用 Arduino IDE 进行开发,主要使用的库包括:
以下是软件架构图:
请参考以下电路图连接硬件:
- #include
- #include
- #include
- #include
- #include
- #include
-
- // WiFi 设置
- const char* ssid = "你的WiFi名称";
- const char* password = "你的WiFi密码";
-
- // 电台列表
- const char* radioStations[] = {
- "http://icecast.spc.org.au/3pbsfm",
- "http://stream.radioparadise.com/flac-320",
- // 添加更多电台...
- };
- const int numStations = sizeof(radioStations) / sizeof(radioStations[0]);
-
- // 当前电台索引
- int currentStation = 0;
-
- // VS1053 引脚定义
- #define VS1053_CS 5
- #define VS1053_DCS 16
- #define VS1053_DREQ 4
-
- // OLED 显示屏引脚定义
- #define OLED_SDA 21
- #define OLED_SCL 22
-
- // 旋转编码器引脚定义
- #define ENCODER_CLK 18
- #define ENCODER_DT 19
- #define ENCODER_SW 23
-
- // 实例化对象
- VS1053 player(VS1053_CS, VS1053_DCS, VS1053_DREQ);
- Adafruit_SSD1306 display(128, 64, &Wire);
- Encoder encoder(ENCODER_CLK, ENCODER_DT);
-
- void setup() {
- Serial.begin(115200);
-
- // 初始化 VS1053
- player.begin();
- player.setVolume(5); // 设置初始音量
-
- // 初始化 OLED 显示屏
- display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
- display.clearDisplay();
- display.setTextSize(2);
- display.setTextColor(WHITE);
- display.setCursor(0, 0);
- display.print("Connecting...");
- display.display();
-
- // 连接 WiFi
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) {
- delay(500);
- Serial.print(".");
- }
- Serial.println("WiFi connected!");
- Serial.print("IP address: ");
- Serial.println(WiFi.localIP());
-
- // 显示第一个电台信息
- displayStationInfo();
- }
-
- void loop() {
- // 读取编码器数值
- int encoderValue = encoder.read();
- if (encoderValue != 0) {
- // 调整音量或切换电台
- if (encoderValue > 0) {
- currentStation = (currentStation + 1) % numStations;
- } else {
- currentStation = (currentStation - 1 + numStations) % numStations;
- }
- playStation(radioStations[currentStation]);
- }
-
- // 播放音频流
- if (player.available()) {
- // 从网络读取音频数据
- HTTPClient http;
- http.begin(radioStations[currentStation]);
- int httpCode = http.GET();
- if (httpCode > 0) {
- if (httpCode == HTTP_CODE_OK) {
- WiFiClient client = http.getStream();
- while (client.connected()) {
- // 将音频数据发送到 VS1053
- if (player.readyForData()) {
- uint8_t buffer[32];
- size_t bytesRead = client.read(buffer, sizeof(buffer));
- player.playData(buffer, bytesRead);
- }
- }
- }
- } else {
- Serial.printf("HTTP request failed, error: %s\n", http.errorToString(httpCode).c_str());
- }
- http.end();
- }
- }
-
- void playStation(const char* url) {
- // 停止播放
- player.stopSong();
- // 显示电台信息
- displayStationInfo();
- // 开始播放新电台
- // (注意: 实际播放逻辑在 loop() 函数中处理)
- }
-
- void displayStationInfo() {
- // 在 OLED 显示屏上显示电台信息
- display.clearDisplay();
- display.setCursor(0, 0);
- display.print("Radio:");
- display.setCursor(0, 16);
- display.print(radioStations[currentStation]);
- display.display();
- }
本项目可以进行以下扩展:
本文介绍了如何使用 ESP32 制作一个功能完备的网络收音机,并提供了详细的代码示例和解释。您可以根据自己的需求对项目进行修改和扩展,打造属于自己的个性化网络收音机。