用ESP8266播放音乐

简介: 最近我们做一个项目需要在ESP8266中播放一段音乐,当时一下就傻了,ESP8266可是没有D/A输出的! 一开始我们直接买了一块D/A解码的板子然后接上一个小功放来播放,但效果令人失望。

最近我们做一个项目需要在ESP8266中播放一段音乐,当时一下就傻了,ESP8266可是没有D/A输出的! 一开始我们直接买了一块D/A解码的板子然后接上一个小功放来播放,但效果令人失望。声音小不说其声音有很大的干扰噪声。而且这种做法无疑是难以产品化的,一个D/A解码再加一个功放那成本已经直接飙升了。

几经努力我们终于找到了一个非常实用的方案,根本不需要增加任何的附加硬件就以直接播放mp3!

这都归功于ESP8266Audio这个库,将喇叭直接接到一个数字输出口就可以直接播放MP3了,为了能有更大的功率加个普通三极管就可以完美推动一个小功率喇叭正常动作了。

 2N3904 (NPN)
                            +---------+
                            |         |     +-|
                            | E  B  C |    / S|
                            +-|--|--|-+    | P|
                              |  |  +------+ E|
                              |  |         | A|
ESP8266-GND ------------------+  |  +------+ K| 
                                 |  |      | E|
ESP8266-I2SOUT (Rx) -------------+  |      \ R|
                                    |       +-|
USB 5V -----------------------------+

这里我会放一个最简单的示例来展示一下怎么来使用这个库。

首先这个示例要使用SPIFFS来存储音乐文件,关于SPIFFS的具体用法可以参考我以前发表的SPIFFS的使用一文。

将ESP8266Audio这个库安装好以后,要先引用以下几个头文件:

#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"

这个库使用起来非常简单。首先是初始化

AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2SNoDAC *out;

void setup()
{
  SPIFFS.begin();
  file = new AudioFileSourceSPIFFS("/test.mp3");
  out = new AudioOutputI2SNoDAC();
  mp3 = new AudioGeneratorMP3();
  mp3->begin(file, out);
}

然后在主循环函数中判断文件是否已经播放完成

void loop()
{
  if (mp3->isRunning()) {
    if (!mp3->loop()) mp3->stop(); 
  } else {
    Serial.printf("MP3 done\n");
    delay(1000);
  }
}

以下是全部代码:

#include <Arduino.h>
#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"

AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2SNoDAC *out;
void setup()
{
  Serial.begin(115200);
  delay(1000);
  SPIFFS.begin();
  file = new AudioFileSourceSPIFFS("/jamonit.mp3");
  out = new AudioOutputI2SNoDAC();
  mp3 = new AudioGeneratorMP3();
  mp3->begin(file, out);
}

void loop()
{
  if (mp3->isRunning()) {
    if (!mp3->loop()) mp3->stop(); 
  } else {
    Serial.printf("MP3 done\n");
    delay(1000);
  }
}

参考阅读

相关文章
|
Android开发 芯片
ESP8266-mini-d1+点灯科技——制作手机远程MP3播放器
ESP8266-mini-d1+点灯科技——制作手机远程MP3播放器
623 0
ESP8266-mini-d1+点灯科技——制作手机远程MP3播放器
|
网络协议 安全 前端开发
springcloud服务连接超时
springcloud服务连接超时的原因竟然是linux的参数设置原因
|
Prometheus Cloud Native Java
微服务框架(二十三)Prometheus + Grafana 安装、配置及使用
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。 本文为Prometheus + Grafana 安装、配置及使用 本系列文章中所使用的框架版本为Spring ...
|
9月前
|
存储 C语言
【C语言】输入/输出函数详解
在C语言中,输入/输出操作是通过标准库函数来实现的。这些函数分为两类:标准输入输出函数和文件输入输出函数。
1053 6
|
11月前
|
机器学习/深度学习 PyTorch TensorFlow
Jetson 学习笔记(五):pb转uff---pb转onnx转trt----pth转onnx转pb
这篇文章是关于如何在NVIDIA Jetson平台上使用TensorRT来优化和部署深度学习模型的详细教程,包括了从不同格式的模型转换到TensorRT引擎的构建和推理过程。
404 1
Jetson 学习笔记(五):pb转uff---pb转onnx转trt----pth转onnx转pb
|
11月前
|
数据采集 人工智能 算法
近五千支队伍决战AI之巅, AFAC2024金融智能创新大赛在2024 Inclusion · 外滩大会完美收官
自从2022年12月ChatGPT上线以来,全球掀起了一场你追我赶的AI竞赛,不少国家都在全力以赴,抢占制高点。
|
JavaScript 前端开发 UED
HTML 文件上传 ,学会了保证不亏!
HTML 文件上传 ,学会了保证不亏!
|
API
servlet研究学习总结--OutputStream和PrintWriter的区别
servlet研究学习总结--OutputStream和PrintWriter的区别
512 1
|
并行计算 Windows
23.10.02更新 Windows下CUDA和CUDNN的安装和配置(图多详细)
23.10.02更新 Windows下CUDA和CUDNN的安装和配置(图多详细)
979 1