高性价比 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);

  // 初始化 VS1053
  player.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();

  // 连接 WiFi
  WiFi.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()) {
          // 将音频数据发送到 VS1053
          if (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.mfbz.cn/a/755400.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; MX5000000 is_prime [1] * MX is_prime[0]is_prime[1]0 for i in range(2, MX):if is_prime[i]:for j in range(i * i, MX, i):#循环每次增加iis_prime[j] 0 class Solution:def countPrimes(self, n: int) -> int:return sum(is_prim…

前端通过ResizeObserver来监听dom大小动态渲染echarts

export const GlobalResizeObserver (function () {const ATTR_NAME global-resizeobserver-keyconst attrValueToCallback {}function antiShake(fn, delay, immediate false) {let timer null//不能用箭头函数return function () {//在时间内重复调用的时候需要清空之前…

Linux Vim最全面的教程

Linux Vim简介 Linux Vim 是一个高度可定制的文本编辑器&#xff0c;广泛用于 Linux 和类 Unix 系统中。它起源于 Vi&#xff0c;一个早期的 Unix 系统中的编辑器&#xff0c;Vim 是 "Vi IMproved"&#xff08;改进版 Vi&#xff09;的缩写。Vim 继承了 Vi 的许多特性…

理解论文笔记:基于贝叶斯网络和最大期望算法的可维护性研究

看了与上一篇研究方向一致的文章&#xff0c;上一篇19年的&#xff0c;这一篇22年的更新。若有侵权&#xff0c;请联系删除。 I. INTRODUCTION 介绍 主要介绍了使用贝叶斯网络和历史数据对无线传感器网络可维护性研究的重要性和必要性&#xff0c;并对下面的各章进行了…

为什么有的手机卡没有语音功能呢?

大家好&#xff0c;今天这篇文章为大家介绍一下&#xff0c;无通话功能的手机卡&#xff0c; 在网上申请过手机卡的朋友应该都知道&#xff0c;现在有这么一种手机卡&#xff0c;虽然是运营商推出的正规号卡&#xff0c;但是却屏蔽了通话功能&#xff0c;你知道这是为什么吗&am…

APP项目测试 之 APP功能测试

1. APP测试流程 需求评审——计划编写——用例设计——用例执行——缺陷管理——测试报告 2. APP测试内容 功能测试 专项测试 性能测试 3.注册测试点扩充 4.登录测试点扩充 5.购物车测试点扩充 6.搜索测试点扩充 7.支付测试点扩充 8.评论测试点扩充 未完待续。…

decode()方法——解码字符串

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

layui在表格中嵌入上传按钮,并修改上传进度条

当需要在表格中添加上传文件按钮&#xff0c;并不需要弹出填写表单的框的时候&#xff0c;需要在layui中&#xff0c;用按钮触发文件选择 有一点需要说明的是&#xff0c;layui定义table并不是在定义的标签中渲染&#xff0c;而是在紧接着的标签中渲染&#xff0c;所以要获取实…

小模型家族又新增成员Gemma2

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba&#xff0c;xLSTM,KAN&#xff09;则提供了大模…

java大型医院绩效考核系统源码(医院为什么需要绩效机制?)医院绩效考核系统源码 医院管理绩效考核系统源码

java大型医院绩效考核系统源码&#xff08;医院为什么需要绩效机制&#xff1f;&#xff09;医院绩效考核系统源码 医院管理绩效考核系统源码 医院作为提供医疗服务的核心机构&#xff0c;其运营和管理效率直接影响到患者的就医体验、治疗效果以及医院的长期发展。因此&#xf…

Java编写学籍信息管理系统,完整代码

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

基于香农编码的图像压缩算法实现,聊聊!

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

【语言模型】探索AI模型、AI大模型、大模型、大语言模型与大数据模型的关系与协同

一、引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;各种AI模型如雨后春笋般涌现&#xff0c;其中AI模型、AI大模型、大模型、大语言模型以及大数据模型等概念在学术界和工业界引起了广泛关注。这些模型不仅各自具有独特的特点和应用场景&#xff0c;…

我关于Excel使用点滴的笔记

本篇笔记是我关于Excel使用点滴的学习笔记&#xff0c;摘要和地址链接列表。临时暂挂&#xff0c;后面可能在不需要时删除。 (笔记模板由python脚本于2024年06月28日 12:23:32创建&#xff0c;本篇笔记适合初通Python&#xff0c;熟悉六大基本数据(str字符串、int整型、float浮…

有人问周鸿祎: 学历不重要,为什么360只要985和211?

关注、星标公众号&#xff0c;直达精彩内容 有人问周鸿祎:你说学历不重要&#xff0c;为什么360招聘的人才只要985和211&#xff1f;他说这个事情&#xff0c;我专门问了我们的人力资源&#xff0c;我们的干品分为校园招聘和社会招聘 校园招聘的话会看文凭 社会招聘的话&#x…

es学习初步总结

看api看麻了不知道意义在哪里&#xff0c;所以就简单总结点我觉得有用的东西 基本数据结构解析 分为了文档&#xff0c;索引和映射 索引可以理解为一张表&#xff0c;映射描述了索引的数据结构&#xff0c;而文档就是一个个具体的行 所以一般我们需要在申明索引的时候同时申…

[数据库]事务的隔离级别存储引擎

事务的隔离级别 存储引擎 举例 myisam 进行回滚操作后可以发现有一个警告没有行受到影响 memory 比如用于qq的在线离线状态

EE trade:贵金属投资的优点及缺点

贵金属(如黄金、白银、铂金和钯金)一直以来都是重要的投资和避险工具。它们具有独特的物理和化学特性&#xff0c;广泛应用于各种行业&#xff0c;同时也被视为财富储备。在进行贵金属投资时&#xff0c;了解其优点和缺点对于做出明智的投资决策至关重要。 一、贵金属投资的优…

一个CentOS“倒下去”,更多开源创新服务器操作系统站起来

“一切过往&#xff0c;皆为序章。” ——出自莎士比亚的戏剧《暴风雨》 CentOS 7将在2024年6月30日正式停更&#xff0c;这在某种程度上宣告了国外开源操作系统一个时代的结束。那么&#xff0c;这是不是必然意味着&#xff0c;一个属于我国自主创新的开源操作…

人工智能设备pbootcms网站模板源码

模板介绍 人工智能行业发展趋势不断攀升逐渐成为了新业态&#xff0c;小编精心为大家收集整理了一款HTML5人工智能设备pbootcms网站模板整站源码下载&#xff0c;可帮助您快速建站以展示企业的产品与业务&#xff0c;响应式自适应设计也会适配所有浏览设备。 模板截图 源码下…