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

news2024/11/26 17:24:27

摘要: 本文将详细介绍如何使用 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.coloradmin.cn/o/1875677.html

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

相关文章

java基于ssm+jsp 多人命题系统

1管理员功能模块 管理员登录&#xff0c;管理员通过输入用户、密码等信息进行系统登录&#xff0c;如图1所示。 图1管理员登录界面图 管理员对个人中心进行操作填写原密码、新密码、确认密码并进行添加、删除、修改以及查看&#xff0c;如图2所示。 图2个人信息功能界面图 学…

大数据信用报告查询应该选什么样的平台?

随着大数据技术的不断发展&#xff0c;大数据信用报告查询平台也应运而生。这些平台通过数据挖掘和分析&#xff0c;为个人提供有关大数据信用的详细报告&#xff0c;帮助他们在做出决策时获得更多的信息。然而&#xff0c;面对众多的大数据信用报告查询平台&#xff0c;如何选…

Qt的入门

Qt的入门 1.Qt的配置2.介绍Qt的使用2.1 Qt 5.14.22.2 Linguist 5.14.22.3Designer 5.14.22.4 Assistant 5.14.22.5 Qt Creator 4.11.1 3.创建第一个项目3.1点击文件来新建一个新的文件或项目3.2选择项目路径和名称3.3选择构建工具3.4类信息3.5翻译文件3.6选择编译器3.7项目管理…

【算法学习】射线法判断点在多边形内外(C#)以及确定内外两点连线与边界的交点

1.前言&#xff1a; 在GIS开发中&#xff0c;经常会遇到确定一个坐标点是否在一块区域的内部这一问题。 如果这个问题不是一个单纯的数学问题&#xff0c;例如&#xff1a;在判断DEM、二维图像像素点、3D点云点等含有自身特征信息的这些点是否在一个区域范围内部的时候&#x…

第十节:学习ConfigurationProperties类来配置pojo实体类参数(自学Spring boot 3.x的第二天)

大家好&#xff0c;我是网创有方 。这节记录下如何使用ConfigurationProperties来实现自动注入配置值。。实现将配置文件里的application.properties的参数赋值给实体类并且打印出来。 第一步&#xff1a;新建一个实体类WechatConfig package cn.wcyf.wcai.config;import org…

C++进阶之哈希

一、unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&#xff0c;进行…

Langchain-实战篇-搭建本地问答机器人-01

项目背景 在这个快节奏的职场世界里&#xff0c;我们每个人都可能在某个时刻&#xff0c;化身为一头辛勤的牛或一匹奔腾的马&#xff0c;面对入职签合同时的迷茫&#xff0c;或是离职时的纠纷&#xff0c;心中难免会涌现出各种疑问。比如&#xff1a; "这份合同里的条款…

PAI3D: Painting Adaptive Instance-Prior for 3D Object Detection论文讲解

PAI3D: Painting Adaptive Instance-Prior for 3D Object Detection论文讲解 1. 引言2. PAI3D框架2.1 Instance Painter2.2 Adaptive Projection Refiner2.3 Fine-granular Detection Head 3. 实验结果3.1 消融实验 1. 引言 3D目标检测对于自动驾驶来说是一个非常重要的模块&a…

wsl ubuntu 安装Anaconda3步骤

如何在Ubuntu上安装Anaconda3呢?本章记录整个安装过程。 1、下载脚本 https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 下载之后,将脚本上传到Ubuntu里。 2、安装脚本 bash Anaconda3-2021.11-Linux-x86_64.sh根据提示进行安装,提示输…

NIVision-LabVIEW在灰度图上画圆

问题来源 在csdn上看到的这样一个问题&#xff0c;好像也没个正经答案&#xff0c;都用chatGPT回答&#xff0c;挺没劲的。不说提供个vi源代码&#xff0c;至少也来张截图嘛。我想着问题也不难&#xff0c;就自己动动手吧。 代码展示1 1、首先使用imaq ArrayToImage.vi创建了一…

抖音微短剧小程序源码搭建:实现巨量广告数据高效回传

在数字化营销日益盛行的今天&#xff0c;抖音微短剧小程序已成为品牌与观众互动的新渠道。这些短小精悍的剧目不仅能迅速抓住用户的注意力&#xff0c;还能有效提升品牌的知名度和用户黏性。然而&#xff0c;想要充分利用这一营销工具&#xff0c;关键在于如何高效地追踪广告数…

effective java (1)(考虑使用!)静态工厂方法代替构造方法

只是目前阶段 对本书第一章内容的浅显认知&#xff0c;说实话 这一章 我看了4遍左右&#xff0c;每一遍感觉都不一样 他的创建模式 有时候像设计模式&#xff0c;但作者已经在原文中描述&#xff0c;它并不等价于 设计模式 我们正常 创建一个年级类 是长这样的 我们不写成标准…

day57---面试专题(框架篇)

框架篇 1. Spring refresh 流程 要求 掌握 refresh 的 12 个步骤Spring refresh 概述 refresh 是 AbstractApplicationContext 中的一个方法,负责初始化 ApplicationContext 容器,容器必须调用 refresh 才能正常工作。它的内部主要会调用 12 个方法,我们把它们称为 refre…

【期末速成】计算机操作系统 EP02 | 学习笔记

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;☀️☀️☀️2.1 考点二&#xff1a;操作系统的功能及接口2.2 考点三&#xff1a;操作系统的发展及分类2.2 考点四&#xff1a;操作系统的运行环境&#xff08;重要&#xff09; 一、前言&#x…

LabVIEW航空用电缆检测

系统通过集成LabVIEW平台&#xff0c;实现了航空用电缆检测过程中的自动数据收集、处理和报告生成&#xff0c;显著提升了检测效率和数据准确性&#xff0c;降低了人工干预&#xff0c;提高了电缆检测的可靠性。 项目背景 在航空领域&#xff0c;电缆的质量检测对确保飞机及其…

【Python】已解决:TypeError: Object of type JpegImageFile is not JSON serializable

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;TypeError: Object of type JpegImageFile is not JSON serializable 一、分析问题背景 在进行Python编程时&#xff0c;特别是处理图像数据和JSON序列化时&…

星光云720全景VR系统源码

星光云720全景VR系统源码 系统体验地址项目介绍JDK版本后端主要依赖前端框架前端node 版本用户端框架介绍技术选型依赖全景内容简介系统图片部分功能截图系统体验地址 系统体验地址 VR全景系统体验地址 账号&#xff1a;18175760278 密码&#xff1a;12345678 项目介绍 JDK版…

如何应对pcdn网络拥塞和设备性能限制?

应对PCDN网络拥塞和设备性能限制&#xff0c;可以采取以下操作&#xff1a; 一、应对网络拥塞 1.优化路由选择&#xff1a;通过选择最优的路由路径&#xff0c;降低数据包在传输过程中的拥堵概率&#xff0c;从而减少网络拥塞的发生。 2.流量控制与调度&#xff1a; 3.流量…

安装 Kali NetHunter (完整版、精简版、非root版)、实战指南、ARM设备武器化指南、andrax、安卓渗透drozer

From&#xff1a;https://www.kali.org/docs/nethunter/ NetHunter 实战指南&#xff1a;https://www.vuln.cn/6430 乌云 存档&#xff1a;https://www.vuln.cn/wooyundrops 1、Kali NetHunter Kali NetHunter 简介 Net&#xff08;网络&#xff09;&#xff0c;hunter&#x…

Animate软件基础:从图层文件夹复制帧

图层文件夹是用来对图层进行管理的功能&#xff0c;可以参考系统中文件夹的作用&#xff0c;而且同样可以多重文件夹进行放置&#xff0c;直接使用鼠标拖动就可以改变文件夹的位置和所属层级&#xff1a; 要选择整个文件夹&#xff0c;请折叠文件夹&#xff08;单击时间轴中文件…