高性价比 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 制作一个功能完备的网络收音机,并提供了详细的代码示例和解释。您可以根据自己的需求对项目进行修改和扩展,打造属于自己的个性化网络收音机。

知识点参考链接

欢迎下载研华科技主题白皮书: 【深度剖析】研华多核异构ARM核心板之机器视觉应用案例 [摘要] TI Sitara系列AM5718/5728是采用ARM+DSP多核异构架构,可以实现图像采集、算法处理、显示控制等功能,具有实时控制、低功耗、多标准工业控制网络互联、工业人机界面的优化、2D/3D图形处理、1080 HD的高清视频应用、工业控制设备的小型化等特点。广泛应用在机器视觉、工业通讯、汽车多媒体、医疗影像、工厂自动化、工业物联网等领域。 https://www.eefocus.com/resource/advantech/index.p... 很早以前用过网络收音机,N年前了,都忘记了当初用的是什么软件了,当时只是觉得整天听MP3听腻了,想回到过去,听听广播,尽管有时候会插播广告,比较烦人,不过有笑话听,挺逗人的。那个网络收音机的软件用了没多久,就不再用了,软件用的不爽是一方面,为了听广播而开着电脑实在是大炮打蚊子,还不如花二十块钱买个真的半导体收音机。 今天无意间看到一个,基于ARM的网络收音机,跟半导体收音机一样,装在小盒子里,可以收听通过互联网传来的广播,比电脑省电,而且因为是网络版的,突破了地域限制,收听国外的广播一样清晰。感兴趣的同学自己做一个,收听VOA,练英语听力,那才叫音质,才叫舒服。 这个收音机的原理图并不复杂,想学点东西的同学可以自制。 ARM Cortex-M3网络收音机系统设计框图: 说明: 系统利用TPS2375实现以太网供电(PoE),跟USB供电一样,不需要额外的变压器。CPU则是Cortex-M3内核的LM3S6950,解码器则是VS1053,都是常见的集成电路。系统还支持SD卡,搞不好将来做成“网络录音机”,离线播放录下来的广播,也是说不定的事儿。 固件代码方面,因为是“网络收音机吗,毋庸置疑,需要TCP、IP协议,至于收听广播部分的协议,这里用到的是SHOUTcast协议,是由Nullsoft开发的,一种免费的声音流技术,用于网路广播。 附件内容提供了ARM Cortex-M3网络收音机全部的原理图、PCB制版图、以及固件代码。 ARM Cortex-M3网络收音机电路参数(英文)介绍: Open-Source HardwareMicrocontroller: LM3S6950 ARM Cortex-M3 from Luminary Micro / TI Audio Codec: VS1053 from VLSI Display: S65 LCD with 176x132 pixel and 16bit color microSD Socket Rotary Encoder IR Receiver (RC5) PoE (Power over Ethernet) Open-Source SoftwarePlay Shoutcast/Icecast and RTSP Streams Play audio files from the memory card Alarm Clock
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客小张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值