ESP32-S3 网络收音机:电路、代码与网页控制界面
ESP32-S3 N16R8 搭配 UDA1334 DAC,让你一个晚上就能搭建一台极简网络收音机。本项目使用 I2S 输出音频,SSD1306 OLED 显示屏显示状态,并通过网页界面管理电台。支持切换预设流媒体和输入自定义 URL。
组件与接线
所需组件:
- ESP32-S3 N16R8
- UDA1334 DAC(用于 MP3 解码)
- 带扬声器的放大器(如条形音箱)
- 杜邦线
可选:0.96 英寸 I2C SSD1306 OLED 显示屏。
UDA1334 与 ESP32-S3 接线:
| ESP32-S3 | UDA1334 |
|----------|---------|
| GPIO41 | BCLK |
| GPIO42 | WSEL |
| GPIO45 | DIN |
| GND | GND |
| 3V3 | 3V3 |
OLED SSD1306 接线:
| ESP32-S3 | SSD1306 |
|----------|---------|
| GPIO21 | SDA |
| GPIO20 | SCL |
| GND | GND |
| 3V3 | 3V3 |
供电:使用 100W 电源的 USB 分线器。ESP32 和放大器并联供电。
主要项目代码
完整代码位于单个 .ino 文件中。所需库:WiFi、HTTPClient、Audio、Adafruit_GFX、Adafruit_SSD1306。
#include <WiFi.h>
#include <HTTPClient.h>
#include <WebServer.h>
#include "driver/i2s.h"
#include "Audio.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// WiFi 设置
const char* ssid = "ssid";
const char* password = "password";
// I2S 引脚
#define I2S_BCLK 41
#define I2S_LRC 42
#define I2S_DOUT 45
// I2C 用于 OLED
#define I2C_SDA 21
#define I2C_SCL 20
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
struct RadioStation {
const char* name;
const char* url;
};
const RadioStation radioStations[] = {
{"RSJ", "http://stream.srg-ssr.ch/m/rsj/mp3_128"},
{"Revma", "https://stream.revma.ihrhls.com/zc238"},
{"爵士流媒体", "http://jazz.streamr.ru/jazz-128.mp3"},
{"巴黎爵士", "http://parisjazz.ice.infomaniak.ch/parisjazz-high.mp3"},
{"柔和爵士", "http://smoothjazz.cdnstream1.com/2619_128.mp3"},
{"爵士 WR06", "http://jazz-wr06.ice.infomaniak.ch/jazz-wr06-128.mp3"},
{"爵士 WR07", "http://jazz-wr07.ice.infomaniak.ch/jazz-wr07-128.mp3"},
{"爵士 WR10", "http://jazz-wr10.ice.infomaniak.ch/jazz-wr10-128.mp3"}
};
const int radioStationsCount = sizeof(radioStations) / sizeof(RadioStation);
int currentStationIndex = 0;
Audio audio;
int currentVolume = 18;
I2S 已为 UDA1334 初始化。显示屏显示 WiFi 状态、带滚动文本的电台名称和音量指示器。
网页管理界面
服务器运行在端口 80,提供包含以下内容的 HTML 页面:
- 预设电台列表(点击切换)
- 音量滑块(0-21)
- 自定义电台字段(名称 + URL)
- 当前电台状态和 IP 地址
关键端点:
/change?station=N— 切换电台/volume?value=N— 设置音量/custom?name=名称&url=URL— 自定义电台
HTML 动态生成,包含 CSS 样式和用于 AJAX 请求的 JavaScript。
OLED 显示屏输出
显示屏每 100 毫秒更新一次:
- 顶行:在线/离线状态
- 滚动显示的电台名称(溢出时滚动)
- 音量数字和进度条
void updateDisplay() {
display.clearDisplay();
// WiFi 状态
bool wifiConnected = (WiFi.status() == WL_CONNECTED);
display.setTextSize(1);
display.setCursor(0, 0);
display.println(wifiConnected ? "在线" : "离线");
// ... 其余逻辑
display.display();
}
关键要点
- 极简设计: 单个 .ino 文件,使用现成的 Audio 和 Adafruit 库
- I2S + UDA1334: 完整的 MP3 解码器,无额外开销
- 网页控制: 无需额外硬件即可管理,IP 地址显示在屏幕上
- 自定义流媒体: 通过表单输入任意 URL
- 稳定性: 在 100W USB 供电下运行,无重启问题
改进建议
- 优化供电:为 ESP32(3.3V/1A)和放大器使用独立的稳压器
- 添加 GPIO 按钮实现本地控制
- 在 NVS 中实现状态保存(最后收听的电台、音量)
- 通过更新 Audio 库支持 FLAC/OPUS 格式
- 设计带条形音箱安装位的机箱
本项目适合原型开发。扩展需重构代码并设计 PCB。
— Editorial Team
暂无评论。