#include <Arduino.h>
//La libreria de Audio utilizada es:https://github.com/earlephilhower/ESP8266Audio
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h" // Con ESP8266 usa pin GPIO03(RX)Pero con ESP32 usa el pin GPIO22
#include "AudioFileSourceSD.h"
//SD Card Pins
#define SCK 18
#define MISO 19
#define MOSI 23
#define CS 5
AudioGeneratorMP3 *mp3; //Tipo de Archivo SD
AudioFileSourceSD *file;//Fuente de archivos de audio Tarjeta SD
AudioOutputI2SNoDAC *out; //Salida de Audio PDM por ESP32 PIN 22
//-------------------------------------------------------------------------------------------------------------------Interrupción de touch botón--------
int threshold = 40;
volatile bool touch1Presionado = false;
void InterrupT2(){
touch1Presionado = true;
}
//--------------------------------------------------------------------------------- Setup-----------------------------------
void setup()
{
Serial.begin(115200);
delay(1000);
audioLogger = &Serial;
Serial.println("ESP32 Touch interrupción Activada");
touchAttachInterrupt(T2, InterrupT2, threshold); //Activa la interrupción en touch 2
if (!SD.begin(CS)) { //inicia la SD utilizando el pin definido como CS para dicha funcion de SPI
Serial.println("No se pudo iniciar la SD");
return;
}
Serial.println("SD Inicializada");
out = new AudioOutputI2SNoDAC(); //llama al constructor de la clase, definiendo que la Salida del reproductor se realizara usando un conversor Digital Analogico virtual
/*
Descripción: AudioOutputI2SNoDAC se utiliza para generar una señal “analógica”
en los datos I2S mediante una técnica de delta-sigma (emulación de DAC) en lugar de utilizar un DAC físico.
Esto significa que no hay un convertidor digital-analógico (DAC) dedicado en el chip,
sino que se utiliza una técnica de modulación para generar una señal de audio.
Funcionamiento: En lugar de enviar directamente una señal analógica a un DAC,
AudioOutputI2SNoDAC genera una señal digital de alta frecuencia (delta-sigma)
que se envía a través del bus I2S. Luego, un filtro pasa-bajas en el amplificador de audio
del dispositivo convierte esta señal en una forma de onda analógica.
se debe colocar un filtro pasabajos R/C (fc=1/2*pi*R*C)
donde fc es la frecuencia de corte en el digrama de bode de para 1 polo -3dB si se hace a 4kHz puede ser 3k3 10pF
se observa que para mejorar el sonido se coloca 1,5K y 100nF
*/
out->SetOutputModeMono(true); // Especifica que el audio, de ser estereo reroducirá monoaural
mp3 = new AudioGeneratorMP3(); //instancia el tipo de archivo Mp3
// file = new AudioFileSourceSD("/T1pop.mp3"); //llama al constructor de la clase AudioFileSourseSD
// mp3->begin(file, out);
}
void cargarArchivo (const char opcion){
switch (opcion)
{
case '1':
file = new AudioFileSourceSD("/T1pop.mp3");
break;
case '2':
file = new AudioFileSourceSD("/1.mp3");
break;
case '3':
file = new AudioFileSourceSD("/1.mp3");
break;
case '4':
file = new AudioFileSourceSD("/1.mp3");
break;
case '5':
file = new AudioFileSourceSD("/1.mp3");
break;
case '6':
file = new AudioFileSourceSD("/1.mp3");
break;
case '7':
file = new AudioFileSourceSD("/1.mp3");
break;
case '8':
file = new AudioFileSourceSD("/1.mp3");
break;
case '9':
file = new AudioFileSourceSD("/1.mp3");
break;
case 'A':
file = new AudioFileSourceSD("/1.mp3");
break;
case 'B':
file = new AudioFileSourceSD("/1.mp3");
break;
case 'C':
file = new AudioFileSourceSD("/1.mp3");
break;
case 'D':
file = new AudioFileSourceSD("/1.mp3");
break;
case 'E':
file = new AudioFileSourceSD("/1.mp3");
break;
}
mp3->begin(file, out);
}
void loop()
{
if (mp3->isRunning()) {
Serial.printf("Reproducción of Comenzó...\n");
if (!mp3->loop())
{
mp3->stop(); //Deja de reproducir.
file->close(); //cierra el archivo
Serial.printf("Reproducción Finalizada..\n");
delete file; //llama al destructor de la clase, liberando la ram utilizada
}
} else {
Serial.printf("No se está reproduciendo audio\n");
delay(1000);
}
if(touch1Presionado)
{
touch1Presionado = false;
Serial.println("Touch 1 detected");
}
}