高性价比 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 代码示例

#include <WiFi.h>
#include <HTTPClient.h>
#include <VS1053.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Encoder.h>// WiFi 设置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";// 电台列表
const char* radioStations[] = {"http://icecast.spc.org.au/3pbsfm","http://stream.radioparadise.com/flac-320",// 添加更多电台...
};
const int numStations = sizeof(radioStations) / sizeof(radioStations[0]);// 当前电台索引
int currentStation = 0;// VS1053 引脚定义
#define VS1053_CS 5
#define VS1053_DCS 16
#define VS1053_DREQ 4// OLED 显示屏引脚定义
#define OLED_SDA 21
#define OLED_SCL 22// 旋转编码器引脚定义
#define ENCODER_CLK 18
#define ENCODER_DT 19
#define ENCODER_SW 23// 实例化对象
VS1053 player(VS1053_CS, VS1053_DCS, VS1053_DREQ);
Adafruit_SSD1306 display(128, 64, &Wire);
Encoder encoder(ENCODER_CLK, ENCODER_DT);void setup() {Serial.begin(115200);// 初始化 VS1053player.begin();player.setVolume(5); // 设置初始音量// 初始化 OLED 显示屏display.begin(SSD1306_SWITCHCAPVCC, 0x3C);display.clearDisplay();display.setTextSize(2);display.setTextColor(WHITE);display.setCursor(0, 0);display.print("Connecting...");display.display();// 连接 WiFiWiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("WiFi connected!");Serial.print("IP address: ");Serial.println(WiFi.localIP());// 显示第一个电台信息displayStationInfo();
}void loop() {// 读取编码器数值int encoderValue = encoder.read();if (encoderValue != 0) {// 调整音量或切换电台if (encoderValue > 0) {currentStation = (currentStation + 1) % numStations;} else {currentStation = (currentStation - 1 + numStations) % numStations;}playStation(radioStations[currentStation]);}// 播放音频流if (player.available()) {// 从网络读取音频数据HTTPClient http;http.begin(radioStations[currentStation]);int httpCode = http.GET();if (httpCode > 0) {if (httpCode == HTTP_CODE_OK) {WiFiClient client = http.getStream();while (client.connected()) {// 将音频数据发送到 VS1053if (player.readyForData()) {uint8_t buffer[32];size_t bytesRead = client.read(buffer, sizeof(buffer));player.playData(buffer, bytesRead);}}}} else {Serial.printf("HTTP request failed, error: %s\n", http.errorToString(httpCode).c_str());}http.end();}
}void playStation(const char* url) {// 停止播放player.stopSong();// 显示电台信息displayStationInfo();// 开始播放新电台// (注意: 实际播放逻辑在 loop() 函数中处理)
}void displayStationInfo() {// 在 OLED 显示屏上显示电台信息display.clearDisplay();display.setCursor(0, 0);display.print("Radio:");display.setCursor(0, 16);display.print(radioStations[currentStation]);display.display();
}
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 制作一个功能完备的网络收音机,并提供了详细的代码示例和解释。您可以根据自己的需求对项目进行修改和扩展,打造属于自己的个性化网络收音机。

知识点参考链接

  • ESP32:
    • ESP32 官方网站
    • ESP32 Arduino 资源
  • OLED 显示屏:
    • SSD1306 数据手册
    • Adafruit SSD1306 Arduino 库
  • Arduino IDE:
    • Arduino 官方网站
    • Arduino IDE 下载
  • HTTP 通信:
    • HTTP 协议简介
    • Arduino HTTPClient 库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/37203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免交互和嵌入执行模式

目录 概念 语法格式 统计行数 赋值变量 修改密码​编辑往文件里添加内容 ​编辑​编辑引入变量 整体赋值​编辑 加引号不赋值变量 expect实现免交互 免交互设置密码 免交互切换用户 嵌入执行模式 添加用户并免交互设置密码 免交互登录 传参实现ssh 练习 概念 …

梦想CAD二次开发

1.mxdraw简介 mxdraw是一个HTML5 Canvas JavaScript框架&#xff0c;它在THREE.js的基础上扩展开发&#xff0c;为用户提供了一套在前端绘图更为方便&#xff0c;快捷&#xff0c;高效率的解决方案&#xff0c;mxdraw的实质为一个前端二维绘图平台。你可以使用mxdraw在画布上绘…

复盘|接口自动化测试框架建设的经验与教训

为什么选择这个话题&#xff1f; 一是发现很多“点工”在转型迷茫期都会问一些自动化测试相关的问题&#xff0c;可以说自动化测试是“点工”升级的必经之路&#xff1b;二是Google一下接口自动化测试&#xff0c;你会发现很多自动化测试框架相关的文章&#xff0c;但是大部分…

VBA 批量变换文件名

1. 页面布局 在“main”Sheet中按照下面的格式编辑。 2. 实现代码 Private wsMain As Worksheet Private intIdx As LongPrivate Sub getExcelBookList(strPath As String)Dim fso As ObjectDim objFile As ObjectDim objFolder As ObjectSet fso CreateObject("Script…

CAN和CANFD数据写入.asc文件的dll

因为工作需要&#xff0c;需要做一些硬件不是CANoe的上位机&#xff08;比如说周立功CAN,NI-CAN&#xff09;&#xff0c;上位机需要有记录数据的功能&#xff0c;所以用Qt制作了一个记录数据的dll&#xff0c;方便重复使用&#xff08;因为有的客户指定了编程软件&#xff0c;…

Redis主从复制、哨兵以及Cluster集群

1.Redis高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提供…

加密教程:pdf怎么加密?7个pdf加密技巧任你选(图文详解)

pdf作为一种便携式文档&#xff0c;是展示内容的首选格式&#xff0c;目前也已广泛应用于交换和分享重要等温&#xff0c;例如内部报告、人力资源文件&#xff0c;以及商业提案等包含敏感信息的文档。然而&#xff0c;在如今的数字化时代&#xff0c;随着越来越多的企业将其文档…

capitalize()方法——字符串首字母转换为大写

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 capitalize()方法用于将字符串的首字母转换为大写&#xff0c;其他字母为小写&#xff0c;例如图1所示的效果。 图1 字符串首字母大写效果…

动手实现一个可发送短信随机密码的高安全性用户密码系统

动手实现一个可发送短信随机密码的高安全性用户密码系统 1、背景2、设计3、代码实现3.1、首先先看一下ThreadSpecificSecureRandom组件代码实现,如图所示3.2、调用nextInt的UserPasswordSystemManager组件的代码实现3.3、UserPasswordSystemManager组件所提供的方法,请看下图…

智慧数据中心可视化:高效管理与直观监控的未来

随着数据中心的规模和复杂性不断增加&#xff0c;传统管理方式难以满足需求。智慧数据中心通过图扑可视化实现实时数据监控和智能分析&#xff0c;将复杂的基础设施直观呈现&#xff0c;极大提升了运维效率、故障排查速度和资源优化能力&#xff0c;为企业提供现代化、智能化的…

农业新质生产力数据(2012-2022年)原始+dofile+测算数据集

数据简介&#xff1a;农业新质生产力是指在现代农业发展中&#xff0c;通过融合尖端科技、信息技术与创新管理模式&#xff0c;实现农业生产效率飞跃、产品质量显著提升及生产可持续性增强的一种革新性生产能力&#xff0c;农业新质生产力代表了从依赖传统资源转向依靠科技创新…

一加Ace3 刷机救砖简化说明

注意&#xff1a;工具使用英文目录&#xff0c;支持救砖和降级。PJE110国行版&#xff0c;CPH2609国际版。目前国行版不能完美转换国际版&#xff0c;每次升级都需要刷oplusstanvbk&#xff0c;不建议使用。跨国转换或ROOT一定先解锁Bootloader&#xff0c;可以使用“一加全能工…

为什么用excel求出的和是错误的?

Excel中求和结果错误的原因可能有几种常见的情况&#xff1a;1. **数据格式问题**&#xff1a;有时候数字可能被错误地视为文本格式。这种情况下&#xff0c;Excel 在求和时会忽略这些单元格。你可以通过将这些单元格的格式改为数值格式来解决。2. **隐藏的行或列**&#xff1a…

01_基于git代码代码运行JADE的第一个Agent

第一步&#xff1a;下载JADE代码 进入官网地址 Jade (jade-project.gitlab.io) 使用git下载JADE代码 第二步&#xff1a;编译并打包代码 在代码目录下执行mvn install 注意事项 1. maven版本需大于3.2.6 第三步&#xff1a;新建一个常规maven项目 <?xml version&q…

encode()方法——编码字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 编码是将文本&#xff08;字符串&#xff09;转换成字节流&#xff0c;Unicode格式转换成其他编码格式。在Python中提供了encode()方法&am…

Linux_应用篇(24) CAN 应用编程基础

本章我们学习 CAN 应用编程&#xff0c; CAN 是目前应用非常广泛的现场总线之一&#xff0c;主要应用于汽车电子和工业领域&#xff0c;尤其是汽车领域&#xff0c;汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。 CAN 总线目前是自动化领域发展的热点技术之一&#xf…

活动|华院计算受邀参加2024全球人工智能技术大会(GAITC),探讨法律大模型如何赋能社会治理

6月22至23日&#xff0c;备受瞩目的2024全球人工智能技术大会&#xff08;GAITC&#xff09;在杭州市余杭区未来科技城隆重举行。本届大会以“交叉、融合、相生、共赢”为主题&#xff0c;集“会、展、赛”为一体&#xff0c;聚“产、学、研”于一堂。值得一提的是&#xff0c;…

深度解析RocketMq源码-消费者索引ConsumeQueue

1.绪论 rocketmq的broker中关于消息持久化的组件主要包含三个&#xff0c;分别是&#xff1a;持久化消息到文件中的组件commitLog&#xff1b;根据消息key索引commitLog日志的indexFile&#xff1b;消费者根据topic和queueId查询commitLog日志的consumeQueue。前面已经介绍com…

使用QGIS进行研究区域制图实战

目录 前言 一、QGIS的版本和数据介绍 1、关于QGIS版本 2、需要准备的数据 二、准备制图 1、制作全国区位图 2、矢量和遥感信息的编辑 三、出图编辑 1、设置主题信息 2、打印布局制作 3、美化地图 总结 前言 俗话说“一图胜千言”&#xff0c;在地理信息的领域中&…

ai智能语音机器人在电销里发挥怎样的作用

得益于语音识别技术的的进步&#xff0c;人工智能发展越来越成熟。相信作为企业的管理者&#xff0c;都遇到过这样的事&#xff1a;一个电销新人刚刚入行&#xff0c;需求经过一两个月的学习培训才能成为一名合格的销售人员。在这段学习的期间&#xff0c;企业投入的成本是没有…