#include <SPI.h> #include <Adafruit_VS1053.h> #include <SD.h> #define SHIELD_CS 7 // VS1053 chip select pin (output) #define SHIELD_DCS 6 // VS1053 Data/command select pin (output) #define DREQ 3 // VS1053 Data request, ideally an Interrupt pin #define CARDCS 4 // Card chip select pin Adafruit_VS1053_FilePlayer musicPlayer = Adafruit_VS1053_FilePlayer(SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
In der setup() Methode werden musicPlayer und SD-Karte initialisiert.
// initialise the music player if (!musicPlayer.begin()) { Serial.println("VS1053 not found"); while (1); // don't do anything more } // initialise the SD card SD.begin(CARDCS);
Damit das Abspielen der MP3-Dateien im Hintergrund ablaufen kann, wird Interrupt verwendet.
// If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background // audio playing musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ int
Um zu überprüfen, dass das MP3 Shield erfolgreich initialisiert worden ist, wird ein Ton ausgegeben.
musicPlayer.sineTest(0x44, 100); // Make a tone to indicate VS1053 is working
Als nächstes wird analysiert wie viele MP3s in welchen Ordnern abgelegt sind. Die Anzahl der Dateien wird in einem Array abgelegt. Jeder Eintrag im Array entspricht einem Ordner auf der SD-Karte.
unsigned int numberOfFiles[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
Es wird davon ausgegangen, dass auf der SD-Karte 10 Ordner angelegt sind, die von 0 bis 9 durchnummeriert sind. In den Ordnern 1 bis 9 liegen jeweils beliebig viele MP3-Dateien. Diese sind ebenfalls durchnummeriert (1.mp3, 2.mp3, 3.mp3, ...). Im Ordner 0 sind Konfigurationsdateien abgelegt. Es wird durch alle Ordner durchiteriert
// read the number of tracks in each folder for (byte i = 0; i < 10; i++) { String temp = "/"; temp.concat(i); char filename[3]; temp.toCharArray(filename, sizeof(filename)); numberOfFiles[i] = countFiles(SD.open(filename)); Serial.print(filename); Serial.print(": "); Serial.println(numberOfFiles[i]); }
und die Anzahl der Dateien im Ordner bestimmt.
// counts the number of files in directory unsigned int countFiles(File dir) { unsigned int counter = 0; while (true) { File entry = dir.openNextFile(); if (!entry) { // no more files break; } counter++; entry.close(); } dir.close(); return counter; }
Damit nach einem erneuten Einschalten der zuletzt gespielte Titel gespielt wird, wird dieser aus einer Datei ausgelesen. Aktueller Ordner und aktuelle Datei werden abgespeichert. Als aktuelle Datei wird der Vorgänger abgespeichert, da beim Start der nächste Track abgespielt wird.
char currentTrackFileName[] = "/0/current.txt";
byte currentFolder = 1; unsigned int currentFile = 0;
// read remembered track if (SD.exists(currentTrackFileName)) { File file = SD.open(currentTrackFileName, FILE_READ); if (file) { currentFolder = file.readStringUntil('\n').toInt(); currentFile = file.readStringUntil('\n').toInt() - 1; } file.close(); }
Nachdem jetzt die setup() Methode abgehandelt worden ist, schauen wir uns als nächstes die loop() Methode an.
Weitere Blogeinträge
- Auswahl der Komponenten
- Das Entwicklungsbrett
- Das erste Einschalten
- Die Entwicklungsumgebung
- Knöpfe (digital)
- Mehrere Knöpfe (digital)
- Mehrere Knöpfe (analog)
- Potentiometer
- Das MP3 Shield
- Auswahl der Komponenten 2
- Auswahl der Komponenten (Zusammenfassung)
- Punkt-Streifenrasterplatine und Knöpfe
- Punkt-Streifenrasterplatine und weitere Komponenten
- Das Gehäuse
- Sketch 1 (setup-Methode)
- Sketch 2 (loop-Methode)
- Sketch 3 (Der komplette Code)
- PC-Software