// Specifically for use with the Adafruit Feather, the pins are pre-set here! // include SPI, MP3 and SD libraries #include #include #include char* audio[9] {"1.mp3", "2.mp3", "3.mp3", "4.mp3", "5.mp3", "6.mp3", "7.mp3", "8.mp3", "9.mp3",}; // 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) #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 M4, M0, 328, 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 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")); pinMode(1, INPUT_PULLUP); //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); #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(audio[0]); // // Serial.println(F("Playing track 002")); // musicPlayer.startPlayingFile(audio[0]); } void loop() { int mp3_audio = random(0,9); musicPlayer.playFullFile(audio[mp3_audio]); uint32_t mp3_time = random(20000, 300000); delay(mp3_time); // Serial.print("."); // // File is playing in the background // if (musicPlayer.stopped()) { // Serial.println("Done playing music"); // while (1) { // delay(10); // we're done! do nothing... // } // } // if (Serial.available()) { // char c = Serial.read(); // // // if we get an 's' on the serial console, stop! // if (c == 's') { // musicPlayer.stopPlaying(); // } // // // if we get an 'p' on the serial console, pause/unpause! // if (c == 'p') { // if (! musicPlayer.paused()) { // Serial.println("Paused"); // musicPlayer.pausePlaying(true); // } else { // Serial.println("Resumed"); // musicPlayer.pausePlaying(false); // } // } // } // delay(100); } /// File listing helper void printDirectory(File dir, int numTabs) { while(true) { File entry = dir.openNextFile(); if (! entry) { // no more files //Serial.println("**nomorefiles**"); break; } for (uint8_t i=0; i