本文介绍使用 ESP32 构建一个有趣的音频播放器,您只需在 ESP32 上连接一个额外的扬声器即可在其中播放音效。在这里,我们将使用LM386 和一个带有 ESP32 的扬声器来播放音乐文件。
所需组件
ESP32
LM386 放大器模块
8欧姆扬声器
跳线
电路原理图
ESP32音乐播放器的电路图如下-
要在 ESP32 上播放声音,我们需要一个扬声器。扬声器通过 LM386音频放大器模块连接。Amplifier Module 的 Vcc 和 GND 引脚连接到 ESP32 的 VIN 和 GND,而 Amplifier 模块的 IN 引脚连接到 ESP32 的 GPIO 25 引脚。GPIO 25 是 2 个 DAC(数模转换器)引脚之一。
ESP32 音乐播放器的完整设置如下所示:
LM386 是一款音频放大器 IC,您可以通过以下链接了解更多关于 LM386 的信息。
准备好音频文件
要在 ESP32 板上播放音频声音,我们需要.wav格式的音频文件,因为 ESP32 只能播放.wav格式的音频文件。
所以第一步是获取你想在 ESP32 上播放的文件。之后,下载并安装Audacity Audio Editor App。此应用程序将用于更改文件类型、采样率和其他属性。
安装完成后,打开 Audacity 应用程序,然后转到文件 》 打开并选择要编辑的音频文件。
首先需要改变的是采样率。对于在 ESP32 上播放音频文件,8000 到 16000 的采样率会很好,因为 ESP32 没有太多内存。因此,将 Project Rate 更改为 16000。
之后,导航到文件 》 导出 》 导出为 WAV以将音频文件保存为.wav格式。
现在在下一个窗口中,选择WAV (Microsoft)作为文件类型,选择Unsigned 8-bit PCM作为编码格式,然后单击保存。
现在我们需要一个 Hex Editor 应用程序来为音频文件生成 Hex 代码。因此,从给定的链接下载并安装十六进制编辑器 (HxD) 。之后,打开应用程序,然后转到文件 》 打开 并打开.wav 文件。这将为.wav 文件生成十六进制代码。
然后使用ctrl+A 选择完整的代码,然后转到编辑 》 复制为 》 C以复制 C 语言格式的代码。
然后将此代码粘贴到 Arduino IDE 中。
代码说明
非接触式ESP32 音频播放器的完整代码在页面末尾给出。在这里,我们将解释代码的一些重要部分。在这个程序中,我们将使用来自XTronical的XT DAC 音频库。XT DAC 音频库可以从这里下载。
因此,像往常一样,通过包含所有必需的库来启动代码。SoundData.h文件包含要播放的 .Wav 文件的十六进制代码。
#include "SoundData.h"
#include "XT_DAC_Audio.h"
在下一行中,创建一个XT_Wav_Class类型的对象, DAC 音频类使用该对象将.wav数据作为参数传递。DacAudio,主要播放器类对象,其中 25 是连接放大器引脚的 DAC 引脚编号。
XT_Wav_Class sound();
XT_DAC_Audio_Class DacAudio(25,0);
在setup()函数中,以 115200 的波特率初始化串行监视器以进行调试。
setup() {
Serial.begin(115200);
}
在loop()函数中,用数据填充声音缓冲区并检查声音是否正在播放,如果没有,则在循环中播放声音。
loop() {
DacAudio.FillBuffer();
if (sound.play==false)
DacAudio.Play(&Sound);
Serial.println(DemoCounter++);
}
测试 ESP32 音频播放器
代码准备好后,通过 LM386 或任何其他放大器模块将扬声器连接到 ESP32 的 GPIO 25。现在将 ESP32 连接到笔记本电脑并上传代码。上传代码后,ESP32 开始播放音频。使用放大器模块的电位器可以改变音质。
#include "SoundData.h"
#include "XT_DAC_Audio.h"
XT_Wav_Class sound();
XT_DAC_Audio_Class DacAudio(25,0);
uint32_t DemoCounter=0;
setup() {
Serial.begin(115200);
}
loop() {
DacAudio.FillBuffer();
if (sound.play==false)
DacAudio.Play(&Sound);
Serial.println(DemoCounter++);
}
图灵测试的方法是:被测试人,和一个待测试的机器。测试时,测试人与被测试人是分开的,测试人只有以纯文本的方式向被测试人问一些问题,这些问题随便是什么问题都可以。问过一些问题后,如果测试人能够正确地分出谁是人谁是机器,那机器就没有通过图灵测试,如果测试人没有分出谁是机器谁是人,那这个机器就是有智能的。
本文介绍ESP32中的中断机制,以及如何通过GPIO中断实现按钮控制。重点讲解了如何设置中断服务例程、处理中断抖动问题,并提供了消除中断抖动的示例代码。
本文主要介绍在未联网(AP热点)情况下实现WEB交互界面的CSS和javascript库。
本文介绍如何使用Arduino-ESP32库中的API函数获取ESP32的芯片、RAM信息等,并提供了一个示例程序代码。
ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。
ESP32 芯片有34个物理GPIO管脚。每个GPIO管脚都可用作一个通用IO,或连接一个内部的外设信号。IO_MUX ¹、RTC IO MUX 和GPIO交换矩阵用于将信号从外设传输至GPIO管脚。
ESP32Encoder库是一个利用ESP32脉冲计数器硬件外设实现高效旋转编码器读取的软件库。
本文对比了几款适合物联网开发的盒子硬件参数,供大家参考。
乐动掌控采用掌控板作为主控,塑胶一体式外壳,侧面和底面开具多个乐高扩展孔位,兼容乐高积木,可完成多种创意应用。
在MicroPython的ESP32库中,NVS类用于管理非易失性存储,支持 32 位有符号整数和 二进制blob。
Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。