183 lines
5.9 KiB
C++
183 lines
5.9 KiB
C++
// 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>
|
|
|
|
|
|
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<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();
|
|
}
|
|
}
|