返回首页

ESP32-S3 网络收音机:代码和原理图

ESP32-S3 网络收音机项目使用 UDA1334 进行 I2S 音频和 OLED 显示。网络界面允许切换电台和输入自定义流媒体。完整代码和连接原理图。

ESP32-S3 一晚间网络收音机:原理图 + 代码
Advertisement 728x90

ESP32-S3 网络收音机:电路、代码与网页控制界面

ESP32-S3 N16R8 搭配 UDA1334 DAC,让你一个晚上就能搭建一台极简网络收音机。本项目使用 I2S 输出音频,SSD1306 OLED 显示屏显示状态,并通过网页界面管理电台。支持切换预设流媒体和输入自定义 URL。

组件与接线

所需组件:

  • ESP32-S3 N16R8
  • UDA1334 DAC(用于 MP3 解码)
  • 带扬声器的放大器(如条形音箱)
  • 杜邦线

可选:0.96 英寸 I2C SSD1306 OLED 显示屏。

Google AdInline article slot

UDA1334 与 ESP32-S3 接线:

| ESP32-S3 | UDA1334 |

|----------|---------|

Google AdInline article slot

| GPIO41 | BCLK |

| GPIO42 | WSEL |

| GPIO45 | DIN |

Google AdInline article slot

| 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

Advertisement 728x90

继续阅读