Micropython学习交流群 学习QQ群:786510434 提供多种固件下载和学习交流。

Micropython-扇贝物联 QQ群:31324057 扇贝物联是一个让你与智能设备沟通更方便的物联网云平台

Micropython学习交流群 学习QQ群:468985481 学习交流ESP8266、ESP32、ESP8285、wifi模块开发交流、物联网。

Micropython老哥俩的IT农场分享QQ群:929132891 为喜欢科创制作的小白们分享一些自制的计算机软硬件免费公益课程,由两位多年从事IT研发的中年大叔发起。

Micropython ESP频道

Micropython开发ESP32开发板之通过MAX98357 I2S音频模块播放音乐


一、目的

        这一节我们学习如何使用我们的ESP32开发板来播放音乐。

二、环境

        ESP32 + MAX98357 I2S音频模块 + Thonny IDE + 几根杜邦线

接线方法:

049a8348630c4496a39dc1fc7442b6cd.png

三、代码

    代码1,播放wav格式文件:wav格式文件几百K,别太大ESP32存储空间有限。

音频格式转换网站:

在线转换音频文件 https://www.aconvert.com/cn/audio/

from machine import I2S  # 导入I2S协议库,什么是I2S自行百度
from machine import Pin
 
 
"""
GPIO13 -- DIN
GPIO12 --- BCLK
GPIO14 -- LRC
GND -- GND
5V或3.3V -- VCC
"""
 
# 初始化引脚定义
sck_pin = Pin(12) # 串行时钟输出
ws_pin = Pin(14)  # 字时钟
sd_pin = Pin(13)  # 串行数据输出
 
 
"""
sck 是串行时钟线的引脚对象
ws 是单词选择行的引脚对象
sd 是串行数据线的引脚对象
mode 指定接收或发送
bits 指定样本大小(位),16 或 32
format 指定通道格式,STEREO(左右声道) 或 MONO(单声道)
rate 指定音频采样率(样本/秒)
ibuf 指定内部缓冲区长度(字节)
"""
 
# 初始化i2s
audio_out = I2S(1, sck=sck_pin, ws=ws_pin, sd=sd_pin, mode=I2S.TX, bits=16, format=I2S.MONO, rate=16000, ibuf=20000)
 
 
wavtempfile = "test.wav"
with open(wavtempfile,'rb') as f:
 
    # 跳过文件的开头的44个字节,直到数据段的第1个字节
    pos = f.seek(44) 
 
    # 用于减少while循环中堆分配的内存视图
    wav_samples = bytearray(1024)
    wav_samples_mv = memoryview(wav_samples)
     
    print("开始播放音频...")
    
    #并将其写入I2S DAC
    while True:
        try:
            num_read = f.readinto(wav_samples_mv)
            
            # WAV文件结束
            if num_read == 0: 
                break
 
            # 直到所有样本都写入I2S外围设备
            num_written = 0
            while num_written < num_read:
                num_written += audio_out.write(wav_samples_mv[num_written:num_read])
                
        except Exception as ret:
            print("产生异常...", ret)
            break

代码2,播放网络音乐:

from machine import I2S
from machine import Pin
import urequests
import network
import time
 
 
"""
GPIO12 --- BCLK
GPIO14 --- LRC
GPIO13 --- DIN
GND    --- GND
5V     --- VCC
"""
 
# 初始化引脚定义
sck_pin = Pin(12) # 串行时钟输出
ws_pin  = Pin(14)  # 字时钟
sd_pin  = Pin(13)  # 串行数据输出
 
 
"""
sck 是串行时钟线的引脚对象
ws  是单词选择行的引脚对象
sd  是串行数据线的引脚对象
mode 指定接收或发送
bits 指定样本大小(位),16 或 32
format 指定通道格式,STEREO(左右声道) 或 MONO(单声道)
rate 指定音频采样率(样本/秒),数值越大播放速度越快
ibuf 指定内部缓冲区长度(字节)
"""
 
# 初始化i2s
audio_out = I2S(1, sck=sck_pin, ws=ws_pin, sd=sd_pin, mode=I2S.TX, bits=16, format=I2S.MONO, rate=44100, ibuf=20000)
 
# 连接网络函数
def do_connect():
    """链接WIFI网络"""
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect('WIFI名字', 'WIFI密码')  # WIFI名字密码
        i = 1
        while not wlan.isconnected():
            print("正在链接中...{}".format(i))
            i += 1
            time.sleep(1)
    print('network config:', wlan.ifconfig())
 
 
# 连接网络
do_connect()
 
# 注意不要用https,要用http
response = urequests.get("http://doc.itprojects.cn/0006.zhishi.esp32/01.download/audio/chaojimali.wav", stream=True)
response.raw.read(44)  # 跳过开头的44字节音频文件头信息
 
print("开始播放音频...")
 
#并将其写入I2S DAC
while True:
    try:
        content_byte = response.raw.read(1024)  # 每次读取1024个字节
        
        # 判断WAV文件是否结束
        if len(content_byte) == 0: 
            break
        # 调用I2S对象播放音频
        audio_out.write(content_byte) 
            
    except Exception as ret:
        print("程序产生异常...", ret)
        audio_out.deinit()
        break
 
audio_out.deinit()  # 音乐播放完毕后,退出


来源:https://doc.itprojects.cn/0006.zhishi.esp32/02.doc/index.html#/33.audio


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 ESP56.com All Rights Reserved

执行时间: 0.011934995651245 seconds