首页 > 其他分享 >Arduino 平台下 ESP32-P4 MP3音频文件播放

Arduino 平台下 ESP32-P4 MP3音频文件播放

时间:2025-01-18 10:34:38浏览次数:3  
标签:info audio P4 Arduino ESP32 es8311 Serial define SD

ESP32-P4 开发板arduino 平台下从SD_MMC读取MP3文件播实验程序,初步验证成功。
开发板使用斑梨电子JC1060P470_P4,板载ES8311音频解码器和四线SD卡模块。
ES8311在Arduino下驱动使用了github上某国外猿的驱动代码,并搭配ESP32-AudioI2S库I2Saudio示例实现。原来想直接使用pschatzmann的arduino-drivers库,无奈此库在ESP32 3.10 ESP32 P4 Dev Module环境下编译始终无法通过。
程序环境如下、
Arduino IDE 2.3.4
Arduino IDE 中开发板使用 ESP32 P4 Dev Module
Arduino ESP32内核 3.10
ESP32-AudioI2S 版本 3.0.8(使用最新版3.0.13编译不通过)

#include "Arduino.h"
//#include "WiFiMulti.h"
#include "Audio.h"
#include "SPI.h"
#include "SD.h"
#include "SD_MMC.h"
#include "FS.h"
#include "Wire.h"
#include "esp_check.h"
#include "es8311.h"

//SD_MMC
#define SD_D0 39
#define SD_D1 40
#define SD_D2 41
#define SD_D3 42
#define SD_CMD 44
#define SD_CLK 43

Audio audio;

#define EXAMPLE_SAMPLE_RATE 16000
#define EXAMPLE_VOICE_VOLUME 60                  // 0 - 100
#define EXAMPLE_MIC_GAIN (es8311_mic_gain_t)(3)  // 0 - 7

#define I2C_NUM 0

#define SDAPIN 7  
#define SCLPIN 8

#define I2S_MCK_IO 13
#define I2S_BCK_IO 12
#define I2S_DI_IO 11
#define I2S_WS_IO 10  // Word Select (LRCK)
#define I2S_DO_IO 9

#define ES8311_PA 20  //ES8311 使能

const char *TAG = "esp32p4_i2s_es8311";

esp_err_t es8311_codec_init(void) {
  Wire.begin(SDAPIN, SCLPIN);
  es8311_handle_t es_handle = es8311_create(I2C_NUM, ES8311_ADDRRES_0);
  ESP_RETURN_ON_FALSE(es_handle, ESP_FAIL, TAG, "es8311 create failed");
  const es8311_clock_config_t es_clk = {
    .mclk_inverted = false,
    .sclk_inverted = false,
    .mclk_from_mclk_pin = true,
    .mclk_frequency = EXAMPLE_SAMPLE_RATE * 256,
    .sample_frequency = EXAMPLE_SAMPLE_RATE
  };

  ESP_ERROR_CHECK(es8311_init(es_handle, &es_clk, ES8311_RESOLUTION_16, ES8311_RESOLUTION_16));
  ESP_RETURN_ON_ERROR(es8311_sample_frequency_config(es_handle, es_clk.mclk_frequency, es_clk.sample_frequency), TAG, "set es8311 sample frequency failed");
  ESP_RETURN_ON_ERROR(es8311_microphone_config(es_handle, false), TAG, "set es8311 microphone failed");

  ESP_RETURN_ON_ERROR(es8311_voice_volume_set(es_handle, EXAMPLE_VOICE_VOLUME, NULL), TAG, "set es8311 volume failed");
  ESP_RETURN_ON_ERROR(es8311_microphone_gain_set(es_handle, EXAMPLE_MIC_GAIN), TAG, "set es8311 microphone gain failed");
  return ESP_OK;
}

void scan_i2c_device(TwoWire &i2c)  //I2C 模块地址扫描函数
{
  Serial.println("Scanning for I2C devices ...");
  Serial.print("      ");
  for (int i = 0; i < 0x10; i++) {
    Serial.printf("0x%02X|", i);
  }
  uint8_t error;
  for (int j = 0; j < 0x80; j += 0x10) {
    Serial.println();
    Serial.printf("0x%02X |", j);
    for (int i = 0; i < 0x10; i++) {
      Wire.beginTransmission(i | j);
      error = Wire.endTransmission();
      if (error == 0)
        Serial.printf("0x%02X|", i | j);
      else
        Serial.print(" -- |");
    }
  }
  Serial.println();
}

bool use_1_bit_mode = true;

void setup() {
  Serial.begin(115200);

  SD_MMC.setPins(SD_CLK, SD_CMD, SD_D0, SD_D1, SD_D2, SD_D3);  , d1, d2, d3

  if (!SD_MMC.begin()) {  //"/sdcard", use_1_bit_mode
    Serial.println("Card Mount Failed");
    return;
  }

  Serial.setDebugOutput(true);

  es8311_codec_init();
  pinMode(ES8311_PA, OUTPUT);
  digitalWrite(ES8311_PA, HIGH);
  scan_i2c_device(Wire);

  audio.setPinout(I2S_BCK_IO, I2S_WS_IO, I2S_DO_IO, I2S_MCK_IO);  
  audio.setVolume(21);                                            // 0...21
  audio.connecttoFS(SD_MMC, "1.mp3");
}

void loop() {
  audio.loop();
}

// optional
void audio_info(const char *info) {
  Serial.print("info        ");
  Serial.println(info);
}
void audio_id3data(const char *info) {  //id3 metadata
  Serial.print("id3data     ");
  Serial.println(info);
}
void audio_eof_mp3(const char *info) {  //end of file
  Serial.print("eof_mp3     ");
  Serial.println(info);
}
void audio_showstation(const char *info) {
  Serial.print("station     ");
  Serial.println(info);
}
void audio_showstreamtitle(const char *info) {
  Serial.print("streamtitle ");
  Serial.println(info);
}
void audio_bitrate(const char *info) {
  Serial.print("bitrate     ");
  Serial.println(info);
}
void audio_commercial(const char *info) {  //duration in sec
  Serial.print("commercial  ");
  Serial.println(info);
}
void audio_icyurl(const char *info) {  //homepage
  Serial.print("icyurl      ");
  Serial.println(info);
}
void audio_lasthost(const char *info) {  //stream URL played
  Serial.print("lasthost    ");
  Serial.println(info);
}

标签:info,audio,P4,Arduino,ESP32,es8311,Serial,define,SD
From: https://blog.csdn.net/Bigmouth_2004/article/details/145216537

相关文章

  • AI 加持下的 arduino ESP32S3 GT30L32S4W 汉字显示
    AI加持下的arduinoESP32S3GT30L32S4W汉字显示程序小白,手上一块中景园1.54寸ST7789显示屏,自带GT30L32S4W汉字字库显示芯片,因为不知道怎么在arduino平台下使用硬字库一直闲置着。在网上翻阅了大量资料针对arduino平台下使用此类硬字库芯片的代码例程没有找到。......
  • 【ESP 乐鑫相关】ESP32-S3启动流程
    转载自:https://blog.itpub.net/70040860/viewspace-3053923/ESP32-S3启动流程    本文将会介绍ESP32-S3从上电到运行app_main函数中间所经历的步骤(即启动流程)。从宏观上,该启动流程可分为如下3个步骤。    ①:一级引导程序,它被固化在ESP32-S3内部的ROM中,它会从flas......
  • P4770 [NOI2018] 你的名字 题解
    \(\text{P4770[NOI2018]你的名字题解}\)注意到\(l=1,r=|S|\)有整整68分的高分,让我们先来考虑这样的特殊情况。这样的特殊情形实际上要我们求的是\(t\)有多少个本质不同的子串满足其不是\(s\)的子串。正着做看上去有些困难,于是维护\(s,t\)的本质不同公共子串个数,用......
  • 【花雕学编程】Arduino动手做(246)---ESP8266 NodeMCU V3 Web Server
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......
  • 【花雕学编程】Arduino动手做(246)---设置ESP8266 V3 通过串口输出软AP的IP、MAC和WiFi
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......
  • ESP-IDF esp32添加自己的组件
    esp32添加自己的组件:1.按键盘的F1,或者点击菜单view-CommandPalette都可以,选择EDP-IDF:CreaterNewESP-IDFComponent,输入组件名称(比如说esp_pwmout),确定2.看到已经新建了该组件,修改对应.h文件#ifndef__ESP_PWMOUT_H__#define__ESP_PWMOUT_H__voidsetup_pwm(void);......
  • 《ESP32-S3使用指南—IDF版 V1.6》第二章 常用的C语言知识点
    第二章常用的C语言知识点1)实验平台:正点原子DNESP32S3开发板2)章节摘自【正点原子】ESP32-S3使用指南—IDF版V1.63)购买链接:https://detail.tmall.com/item.htm?&id=7684993426594)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html......
  • kea dhcp4 服务报错"No subnet matches interface"的问题分析
    目录环境现象结论环境电脑为Manjaro,KDE环境,已经配置ipv4地址192.168.201.182/24计划使用kea做DHCP服务器,配置新的192.168.182.1ip地址作为DHCPv4服务器地址(原本想直接用配置里的192.0.2.0/24做DHCP服务的)现象设备无法通过电脑获取DHCP地址wireshark看抓包,有DHC......
  • ESP32模拟IIC,0.96英寸OLED(四针),改编自江科大/江协。
    #喜欢的宝子可以copy。#本文采用ArduinoIDE开发,用到了多文件形式。点击这里可以创建文件。下面直接分享代码和效果图。效果图0.96OLED.ino #include"OLED.h"voidsetup(){OLED_Init();OLED_ShowString(1,1,"sugkug");}intcnt=0;voidloop()......
  • 关于安卓edge无法播放Wordpress上传的mp4视频问题
    使用默认插件上传后,电脑端可以播放视频,其他手机浏览器均可播放视频,但是安卓edge无法加载视频。大概是如下图样子:经查发现电脑打开页面会显示站点部分不安全的提示,说明edge端做了一些阻挡处理,导致视频无法播放。找了一些资料后,发现可以自行修改加载视频的代码框架,于是修改如下:......