找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1531

积分

0

好友

225

主题
发表于 5 天前 | 查看: 19| 回复: 0

本项目基于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接收模块。

快速使用指南

方法一:使用预编译固件

  1. 下载已编译好的二进制文件 eetree.ino.esp32s2.bin
  2. 在电脑上安装CH340 USB转串口驱动。
  3. 使用Arduino IDE的“上传”功能将二进制文件烧录至开发板。

方法二:从源码编译烧录

  1. 配置WiFi:在代码中修改您的WiFi SSID和密码。
    const char* SSID     = "Your_WiFi_SSID";
    const char* PASSWD = "Your_WiFi_Password";
  2. 配置网络电台服务器:设置网络电台服务器的IP地址与端口号。
    const char* WEBSERVERIP = "192.168.1.55";
    const char* WEBSERVERPORT = 8888;
  3. 设置FM起始搜索频率:在 searchFM() 函数中设置初始频率(单位: 10kHz)。
    void searchFM() {
        ...
        rx.setFrequency(9600); // 即 96.0 MHz
        ...
    }
  4. 安装CH340驱动。
  5. 使用Arduino IDE或VSCode编译并上传代码至ESP32-S2开发板。

Arduino IDE界面

系统运行演示

设备上电后:

  1. 首先显示“John Radio”品牌Logo页面。
  2. 初始化成功后,系统将在三个主页面间循环(通过按键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. 设备运行效果图
Logo页面
FM收音界面
时间显示界面

已知问题与局限

  1. 初始化依赖:上电时若WiFi连接失败或NTP校时失败,系统会停留在Logo界面无法进入主功能。
  2. 按键抖动:长按按键可能触发多次检测,导致页面非预期快速切换。
  3. 音频输出:关闭扬声器输出后,FM音频信号可能仍会从耳机插孔输出。

开发笔记与思路

1. 项目优化展望

  • 产品竞争力:相较于手机,专用收音机设备成本更低、续航更长、功能专注且体积小巧。
  • 未来改进:可考虑增加电池模块提升便携性;集成蓝牙模块以支持蓝牙音频功能。

2. 开发环境搭建步骤

  1. 下载并安装 Arduino IDE
  2. 下载并安装 Visual Studio Code
  3. 在VSCode中安装“Arduino”扩展。
  4. 在VSCode设置中添加ESP32开发板支持源。
    "arduino.additionalUrls": [
        "https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json"
    ]
  5. 通过Arduino库管理器或VSCode安装 U8g2RDA5807 第三方库。

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会自动使用本地文件。



上一篇:SPI通信协议深度解析:四种工作模式与基于FPGA的Verilog实现
下一篇:技术面试回答技巧:从项目经验到开放性问题,用系统方法脱颖而出
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 19:21 , Processed in 0.195249 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表