Last active
August 12, 2024 17:27
-
-
Save johnwargo/d1faa619fc0b008837bafaabe8581e84 to your computer and use it in GitHub Desktop.
ESP32 and the Adafruit Music Maker FeatherWing without Interrupts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Adafruit Sample Sketch modified to not use Interrupts | |
// Documented here: https://randomerrors.dev/posts/2023/esp32-and-the-adafruit-music-maker-featherwing/ | |
// Specifically for use with the Adafruit Feather, the pins are pre-set here! | |
// include SPI, MP3 and SD libraries | |
#include <SPI.h> | |
#include <SD.h> | |
#include <Adafruit_VS1053.h> | |
// These are the pins used | |
#define VS1053_RESET -1 // VS1053 reset pin (not used!) | |
// Feather ESP8266 | |
#if defined(ESP8266) | |
#define VS1053_CS 16 // VS1053 chip select pin (output) | |
#define VS1053_DCS 15 // VS1053 Data/command select pin (output) | |
#define CARDCS 2 // Card chip select pin | |
#define VS1053_DREQ 0 // VS1053 Data request, ideally an Interrupt pin | |
// Feather ESP32 | |
#elif defined(ESP32) && !defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2) | |
#define VS1053_CS 32 // VS1053 chip select pin (output) | |
#define VS1053_DCS 33 // VS1053 Data/command select pin (output) | |
#define CARDCS 14 // Card chip select pin | |
#define VS1053_DREQ 15 // VS1053 Data request, ideally an Interrupt pin | |
// Feather Teensy3 | |
#elif defined(TEENSYDUINO) | |
#define VS1053_CS 3 // VS1053 chip select pin (output) | |
#define VS1053_DCS 10 // VS1053 Data/command select pin (output) | |
#define CARDCS 8 // Card chip select pin | |
#define VS1053_DREQ 4 // VS1053 Data request, ideally an Interrupt pin | |
// WICED feather | |
#elif defined(ARDUINO_STM32_FEATHER) | |
#define VS1053_CS PC7 // VS1053 chip select pin (output) | |
#define VS1053_DCS PB4 // VS1053 Data/command select pin (output) | |
#define CARDCS PC5 // Card chip select pin | |
#define VS1053_DREQ PA15 // VS1053 Data request, ideally an Interrupt pin | |
#elif defined(ARDUINO_NRF52832_FEATHER) | |
#define VS1053_CS 30 // VS1053 chip select pin (output) | |
#define VS1053_DCS 11 // VS1053 Data/command select pin (output) | |
#define CARDCS 27 // Card chip select pin | |
#define VS1053_DREQ 31 // VS1053 Data request, ideally an Interrupt pin | |
// Feather RP2040 | |
#elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) | |
#define VS1053_CS 8 // VS1053 chip select pin (output) | |
#define VS1053_DCS 10 // VS1053 Data/command select pin (output) | |
#define CARDCS 7 // Card chip select pin | |
#define VS1053_DREQ 9 // VS1053 Data request, ideally an Interrupt pin | |
// Feather M4, M0, 328, ESP32S2, nRF52840 or 32u4 | |
#else | |
#define VS1053_CS 6 // VS1053 chip select pin (output) | |
#define VS1053_DCS 10 // VS1053 Data/command select pin (output) | |
#define CARDCS 5 // Card chip select pin | |
// DREQ should be an Int pin *if possible* (not possible on 32u4) | |
#define VS1053_DREQ 9 // VS1053 Data request, ideally an Interrupt pin | |
#endif | |
int counter = 0; | |
Adafruit_VS1053_FilePlayer musicPlayer = | |
Adafruit_VS1053_FilePlayer(VS1053_RESET, VS1053_CS, VS1053_DCS, VS1053_DREQ, CARDCS); | |
void setup() { | |
Serial.begin(115200); | |
// if you're using Bluefruit or LoRa/RFM Feather, disable the radio module | |
//pinMode(8, INPUT_PULLUP); | |
// Wait for serial port to be opened, remove this line for 'standalone' operation | |
while (!Serial) { delay(1); } | |
delay(500); | |
Serial.println("\n\nAdafruit VS1053 Feather Test"); | |
if (!musicPlayer.begin()) { // initialise the music player | |
Serial.println(F("Couldn't find VS1053, do you have the right pins defined?")); | |
while (1) | |
; | |
} | |
Serial.println(F("VS1053 found")); | |
musicPlayer.sineTest(0x44, 500); // Make a tone to indicate VS1053 is working | |
if (!SD.begin(CARDCS)) { | |
Serial.println(F("SD failed, or not present")); | |
while (1) | |
; // don't do anything more | |
} | |
Serial.println("SD OK!"); | |
// list files | |
printDirectory(SD.open("/"), 0); | |
// Set volume for left, right channels. lower numbers == louder volume! | |
musicPlayer.setVolume(10, 10); | |
// REMOVE THIS BECAUSE THIS ENABLES INTERRUPTS | |
// #if defined(__AVR_ATmega32U4__) | |
// // Timer interrupts are not suggested, better to use DREQ interrupt! | |
// // but we don't have them on the 32u4 feather... | |
// musicPlayer.useInterrupt(VS1053_FILEPLAYER_TIMER0_INT); // timer int | |
// #else | |
// // If DREQ is on an interrupt pin we can do background | |
// // audio playing | |
// musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ int | |
// #endif | |
// Play a file in the background, REQUIRES interrupts! | |
// Serial.println(F("Playing full track 001")); | |
// musicPlayer.playFullFile("/soundfile1.mp3"); | |
// Serial.println(F("Playing track 002")); | |
// musicPlayer.startPlayingFile("/soundfile1.mp3"); | |
} | |
void loop() { | |
// Are we playing a sound file? | |
if (musicPlayer.stopped()) { | |
// No, then start a sound file | |
Serial.println("\nStarting sound file"); | |
// ========================================= | |
// we can't play the file this way because it uses interrupts: | |
// musicPlayer.playFullFile("/snore01.mp3"); | |
// ========================================= | |
// With this approach, it *starts* playing it only, | |
// Then you use feedBuffer (below) to feed more sound | |
// file data into the player. | |
musicPlayer.startPlayingFile("/snore01.mp3"); | |
} | |
// https://forums.adafruit.com/viewtopic.php?p=953823&hilit=music+maker+esp32#p953823 | |
musicPlayer.feedBuffer(); | |
// print a dot so we can tell the loop is executing | |
Serial.print("."); | |
// put a blank line every 25 periods | |
counter += 1; | |
if (counter > 25) { | |
counter = 0; | |
Serial.println(); | |
} | |
delay(100); | |
} | |
/// File listing helper | |
void printDirectory(File dir, int numTabs) { | |
while (true) { | |
File entry = dir.openNextFile(); | |
if (!entry) { | |
break; | |
} | |
for (uint8_t i = 0; i < numTabs; i++) { | |
Serial.print('\t'); | |
} | |
Serial.print(entry.name()); | |
if (entry.isDirectory()) { | |
Serial.println("/"); | |
printDirectory(entry, numTabs + 1); | |
} else { | |
// files have sizes, directories do not | |
Serial.print("\t\t"); | |
Serial.println(entry.size(), DEC); | |
} | |
entry.close(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment