• 高性价比 ESP32 网络收音机:OLED 显示+编码器控制 (源码开源)


    摘要: 本文将详细介绍如何使用 ESP32 开发板制作一个功能完备的网络收音机。我们将涵盖硬件选择、软件架构、网络连接、音频流解码、用户界面设计等方面,并提供完整的代码示例和详细的解释,帮助您轻松构建自己的网络收音机。

    关键词: ESP32, 网络收音机, VS1053, Arduino, 音频流, HTTP, MP3, AAC

    1. 项目概述

    1.1 功能简介

    本项目旨在利用 ESP32 的强大性能和丰富的功能,打造一款可以播放互联网广播的网络收音机。主要功能包括:

    • 通过 WiFi 连接互联网
    • 搜索并播放网络电台
    • 支持多种音频流格式,例如 MP3, AAC 等
    • 通过编码器调节音量和切换电台
    • 使用 OLED 显示屏显示电台信息
    1.2 硬件组成

    以下是本项目所需的硬件清单:

    • ESP32 开发板 (例如: ESP32-DevKitC)
    • VS1053 MP3 解码模块
    • OLED 显示屏 (例如: SSD1306 128x64)
    • 旋转编码器
    • 扬声器 (8Ω, 3W)
    • 面包板和跳线
    1.3 软件架构

    本项目采用 Arduino IDE 进行开发,主要使用的库包括:

    • WiFi.h: 用于连接 WiFi 网络
    • HTTPClient.h: 用于发送 HTTP 请求获取音频流
    • VS1053.h: 用于控制 VS1053 解码模块
    • Wire.h: 用于与 I2C 设备 (OLED 显示屏) 通信
    • Adafruit_SSD1306.h: 用于控制 SSD1306 OLED 显示屏
    • Encoder.h: 用于读取旋转编码器的值

    以下是软件架构图:

    2. 硬件连接

    请参考以下电路图连接硬件:

    3. 软件实现

    3.1 代码示例

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. // WiFi 设置
    8. const char* ssid = "你的WiFi名称";
    9. const char* password = "你的WiFi密码";
    10. // 电台列表
    11. const char* radioStations[] = {
    12. "http://icecast.spc.org.au/3pbsfm",
    13. "http://stream.radioparadise.com/flac-320",
    14. // 添加更多电台...
    15. };
    16. const int numStations = sizeof(radioStations) / sizeof(radioStations[0]);
    17. // 当前电台索引
    18. int currentStation = 0;
    19. // VS1053 引脚定义
    20. #define VS1053_CS 5
    21. #define VS1053_DCS 16
    22. #define VS1053_DREQ 4
    23. // OLED 显示屏引脚定义
    24. #define OLED_SDA 21
    25. #define OLED_SCL 22
    26. // 旋转编码器引脚定义
    27. #define ENCODER_CLK 18
    28. #define ENCODER_DT 19
    29. #define ENCODER_SW 23
    30. // 实例化对象
    31. VS1053 player(VS1053_CS, VS1053_DCS, VS1053_DREQ);
    32. Adafruit_SSD1306 display(128, 64, &Wire);
    33. Encoder encoder(ENCODER_CLK, ENCODER_DT);
    34. void setup() {
    35. Serial.begin(115200);
    36. // 初始化 VS1053
    37. player.begin();
    38. player.setVolume(5); // 设置初始音量
    39. // 初始化 OLED 显示屏
    40. display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    41. display.clearDisplay();
    42. display.setTextSize(2);
    43. display.setTextColor(WHITE);
    44. display.setCursor(0, 0);
    45. display.print("Connecting...");
    46. display.display();
    47. // 连接 WiFi
    48. WiFi.begin(ssid, password);
    49. while (WiFi.status() != WL_CONNECTED) {
    50. delay(500);
    51. Serial.print(".");
    52. }
    53. Serial.println("WiFi connected!");
    54. Serial.print("IP address: ");
    55. Serial.println(WiFi.localIP());
    56. // 显示第一个电台信息
    57. displayStationInfo();
    58. }
    59. void loop() {
    60. // 读取编码器数值
    61. int encoderValue = encoder.read();
    62. if (encoderValue != 0) {
    63. // 调整音量或切换电台
    64. if (encoderValue > 0) {
    65. currentStation = (currentStation + 1) % numStations;
    66. } else {
    67. currentStation = (currentStation - 1 + numStations) % numStations;
    68. }
    69. playStation(radioStations[currentStation]);
    70. }
    71. // 播放音频流
    72. if (player.available()) {
    73. // 从网络读取音频数据
    74. HTTPClient http;
    75. http.begin(radioStations[currentStation]);
    76. int httpCode = http.GET();
    77. if (httpCode > 0) {
    78. if (httpCode == HTTP_CODE_OK) {
    79. WiFiClient client = http.getStream();
    80. while (client.connected()) {
    81. // 将音频数据发送到 VS1053
    82. if (player.readyForData()) {
    83. uint8_t buffer[32];
    84. size_t bytesRead = client.read(buffer, sizeof(buffer));
    85. player.playData(buffer, bytesRead);
    86. }
    87. }
    88. }
    89. } else {
    90. Serial.printf("HTTP request failed, error: %s\n", http.errorToString(httpCode).c_str());
    91. }
    92. http.end();
    93. }
    94. }
    95. void playStation(const char* url) {
    96. // 停止播放
    97. player.stopSong();
    98. // 显示电台信息
    99. displayStationInfo();
    100. // 开始播放新电台
    101. // (注意: 实际播放逻辑在 loop() 函数中处理)
    102. }
    103. void displayStationInfo() {
    104. // 在 OLED 显示屏上显示电台信息
    105. display.clearDisplay();
    106. display.setCursor(0, 0);
    107. display.print("Radio:");
    108. display.setCursor(0, 16);
    109. display.print(radioStations[currentStation]);
    110. display.display();
    111. }
    3.2 代码解释
    1. 包含头文件: 引入必要的库文件,包括 WiFi, HTTPClient, VS1053, Wire, Adafruit_SSD1306 和 Encoder。
    2. 定义变量: 定义 WiFi 连接信息、电台列表、当前电台索引、引脚定义和实例化对象。
    3. setup() 函数: 初始化串口、VS1053、OLED 显示屏,连接 WiFi 并显示初始信息。
    4. loop() 函数: 循环读取编码器数值,根据数值调整音量或切换电台,并持续从网络获取音频数据发送到 VS1053 播放。
    5. playStation() 函数: 停止当前播放,更新电台信息并准备播放新电台。
    6. displayStationInfo() 函数: 在 OLED 显示屏上显示当前电台信息。

    4. 项目扩展

    本项目可以进行以下扩展:

    • 添加更多功能: 例如,可以添加时钟显示、闹钟功能、睡眠定时器等。
    • 改进用户界面: 例如,可以使用更美观的界面库,或者使用 TFT 彩屏显示更丰富的电台信息。
    • 支持更多音频格式: 例如,可以添加对 FLAC、OPUS 等音频格式的支持。
    • 实现远程控制: 例如,可以使用手机 App 通过蓝牙或 WiFi 控制网络收音机。

    5. 总结

    本文介绍了如何使用 ESP32 制作一个功能完备的网络收音机,并提供了详细的代码示例和解释。您可以根据自己的需求对项目进行修改和扩展,打造属于自己的个性化网络收音机。

    知识点参考链接

  • 相关阅读:
    输出与输出
    06公共方法
    13.5 GAS与连击
    Redis-浅谈主从同步
    一百八十八、Hive——HiveSQL查询表中的日期是星期几(亲测,附截图)
    echarts 柱状堆叠图(图例和x轴都是动态的)
    了解string以及简单模拟实现(c++)
    【基于pyAudioKits的Python音频信号处理(四)】傅里叶变换:从时域到频域
    Go语言中ipv4与Uint32转换
    adb不是内部或外部命令
  • 原文地址:https://blog.csdn.net/qq_40431685/article/details/140044521