本项目基于ESP32-S2-MINI-1模组,设计并实现了一个集成WiFi网络电台与FM模拟电台功能的多模式收音机系统。系统配备了OLED显示屏用于信息交互,支持按键控制与NTP网络自动校时,可在时间显示、FM调频、网络电台等多个功能页面间切换。整个系统在资源受限(无外部PSRAM)的硬件平台上稳定运行。
系统功能介绍
1. 核心功能
- 双模收音:支持接收网络流媒体电台与本地FM广播信号,可通过物理按键进行模式切换与频道选择。
- 信息显示:在OLED屏幕上实时显示当前模式下的关键信息,如网络电台的IP地址、节目名称或FM频率。
- 自动校时:开机后自动通过NTP服务器同步并显示精确的年、月、日、时、分、秒。
2. 开发环境
- Arduino IDE v1.8.16: 开源电子原型平台。
- Visual Studio Code v1.60.0: 功能强大的跨平台源代码编辑器。
- VSCode Arduino扩展: 用于在VSCode中开发Arduino项目。
- arduino-esp32 v2.0.0: ESP32系列的Arduino核心库。
- U8g2库: 用于驱动OLED显示屏的图形库。
- RDA5807库: 用于控制RDA5807M FM收音机模块的库。
3. 硬件清单
- 主控: ESP32-S2-MINI-1 (基于ESP32-S2芯片,320KB SRAM,无PSRAM)。
- 收音模块: RDA5807M FM接收模块。
快速使用指南
方法一:使用预编译固件
- 下载已编译好的二进制文件
eetree.ino.esp32s2.bin。
- 在电脑上安装CH340 USB转串口驱动。
- 使用Arduino IDE的“上传”功能将二进制文件烧录至开发板。
方法二:从源码编译烧录
- 配置WiFi:在代码中修改您的WiFi SSID和密码。
const char* SSID = "Your_WiFi_SSID";
const char* PASSWD = "Your_WiFi_Password";
- 配置网络电台服务器:设置网络电台服务器的IP地址与端口号。
const char* WEBSERVERIP = "192.168.1.55";
const char* WEBSERVERPORT = 8888;
- 设置FM起始搜索频率:在
searchFM() 函数中设置初始频率(单位: 10kHz)。
void searchFM() {
...
rx.setFrequency(9600); // 即 96.0 MHz
...
}
- 安装CH340驱动。
- 使用Arduino IDE或VSCode编译并上传代码至ESP32-S2开发板。

系统运行演示
设备上电后:
- 首先显示“John Radio”品牌Logo页面。
- 初始化成功后,系统将在三个主页面间循环(通过按键1切换):
- 时间页面:显示从NTP服务器同步的精确时间。
- FM收音机页面:显示当前FM频率,通过按键2可切换至搜索到的其他电台频率。
- 网络收音机页面:显示已连接的网络电台服务器IP与端口。
1. 编译输出日志
编译完成后,IDE会输出存储空间占用情况,示例如下:
项目使用了 722978 字节,占用了 (55%) 程序存储空间。最大为 1310720 字节。
全局变量使用了37348字节,(11%)的动态内存,余留290332字节局部变量。最大为327680字节。
随后是esptool工具烧录固件的详细过程日志。
2. 运行串口日志
系统运行时会通过串口打印调试信息,例如WiFi连接IP、FM搜台过程等:
192.168.43.143
Search FM8710:0
Search FM8720:0
Search FM8730:1
Good Frequency: 8760
...
info: FM Radio Page
info: Net Radio Page
info: Datetime Page
3. 设备运行效果图



已知问题与局限
- 初始化依赖:上电时若WiFi连接失败或NTP校时失败,系统会停留在Logo界面无法进入主功能。
- 按键抖动:长按按键可能触发多次检测,导致页面非预期快速切换。
- 音频输出:关闭扬声器输出后,FM音频信号可能仍会从耳机插孔输出。
开发笔记与思路
1. 项目优化展望
- 产品竞争力:相较于手机,专用收音机设备成本更低、续航更长、功能专注且体积小巧。
- 未来改进:可考虑增加电池模块提升便携性;集成蓝牙模块以支持蓝牙音频功能。
2. 开发环境搭建步骤
- 下载并安装 Arduino IDE。
- 下载并安装 Visual Studio Code。
- 在VSCode中安装“Arduino”扩展。
- 在VSCode设置中添加ESP32开发板支持源。
"arduino.additionalUrls": [
"https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json"
]
- 通过Arduino库管理器或VSCode安装
U8g2 和 RDA5807 第三方库。
3. 核心软件流程
- 初始化阶段 (
setup()):依次初始化GPIO、串口、显示屏、连接WiFi、初始化FM模块并搜台、配置NTP校时、设置按键引脚。
void setup() {
pinMode(41, OUTPUT);
Serial.begin(115200);
mointorInit();
displayWelcome();
IPAddress = WifiConnecttion();
fmInit();
searchFM();
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
pinMode(button1, INPUT_PULLUP);
// ... 其他初始化
}
- 主循环 (
loop()):持续刷新显示、监听四个按键状态,并根据按键标志位执行相应的功能(切页、调台等)。当处于网络电台模式时,调用 playMusic() 函数处理音频流。
void loop() {
displayMessage();
// 检测按键1
if (digitalRead(button1) == LOW) {
delay(50); // 简单消抖
if (digitalRead(button1) == LOW) {
buttonFlag = 1;
}
}
// ... 检测其他按键
if (buttonFlag != 0) {
FunctionUp(); // 执行按键功能
}
if (curr_sour == 2) { // 当前为网络电台源
playMusic();
}
buttonFlag = 0;
}
- WiFi连接:采用STA模式连接指定热点。
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASSWD);
while (WiFi.status() != WL_CONNECTED) {
delay(400);
}
- FM自动搜台:从起始频率开始步进扫描,根据信号强度(RSSI)和立体声标志判断有效电台并存储。
void searchFM() {
uint16_t i = 0;
uint8_t num = 0;
rx.setFrequency(9600); // 起始频率
while (i < 210) { // 扫描范围
delay(100);
if (rx.isStereo() && rx.getRssi() > 20) {
fmstation[num++] = rx.getFrequency();
Serial.print("Good Frequency: ");
Serial.println(rx.getFrequency());
if (num >= MAX_STATIONS) return;
}
rx.setFrequencyUp(); // 频率步增
i++;
}
}
开发中遇到的问题与解决
1. 提升编译速度
- 问题:在Windows下,即使使用VSCode,Arduino项目的二次编译速度仍不理想,影响调试效率。
- 解决:
- 在项目
.vscode设置中优化构建参数,可有效提升增量编译速度。
- 迁移至Linux开发环境,实测编译速度提升超过80%。对于嵌入式开发,Linux下的工具链通常效率更高。
2. VSCode中ESP32库支持异常
- 问题:因网络问题,通过Git克隆arduino-esp32库后手动安装,导致VSCode无法识别开发板。
- 解决:
- 彻底删除手动安装的库,通过VSCode内的“开发板管理器”在线安装,确保依赖关系正确。
- 若网络不稳定导致在线安装失败,可根据命令行提示的URL,先用下载工具获取对应的
zip包,手动放置于Arduino15/staging/packages目录下,再执行安装命令,IDE会自动使用本地文件。
|