mp3-Player mit einem mp3-Shield

Lese­zeit: 5 Minu­ten
Navi­ga­ti­on

Mit einem mp3-Shield kön­nen mp3-Dateien abge­spielt wer­den.
Du benö­tigst eine Micro-SD-Karte, die mit FAT32 for­ma­tiert wur­de.

Kopie­re meh­re­re mp3-Dateien auf die SD-Karte.
Du musst die Namen nach fol­gen­dem Mus­ter ändern:
track001.mp3, track002.mp3 ...

Instal­lie­re die Biblio­thek vs1053 für das mp3-Shield:
Sketch → Biblio­thek ein­bin­den → Biblio­the­ken verwalten

Bei Pro­gram­men, die einen Tas­ter ver­wen­den, taucht immer das Pro­blem auf, dass ein län­ge­rer Druck auf den Tas­ter die gewünsch­te Akti­on mehr­fach aus­führt. Selbst ein kur­zes delay() kann das Pro­blem nicht lösen, son­dern höchs­ten abmil­dern. Die­ses Phä­no­men wird „Prel­len“ genannt. 

Das klei­ne Bei­spiel­pro­gramm ver­deut­licht das Problem:

void setup() 
{ 
  pinMode(5, INPUT_PULLUP); 
  Serial.begin(9600); 
} 

void loop() 
{ 
  int TasterStatus = digitalRead(5); 
  if (TasterStatus == LOW) 
   { 
     delay(200); 
     Serial.println("Taster gedrueckt!");
   }
} 

Ein län­ge­rer Druck auf den Tas­ter pro­du­ziert die mehr­fa­che Aus­ga­be des Textes.

Die Biblio­thek Bounce2 löst genau die­ses Pro­blem:

Sketch → Biblio­thek ein­bin­den → Biblio­the­ken verwalten

Ste­cke das mp3-Shield auf den Ardui­no und ver­bin­de das Tas­ten­feld mit den dazu­ge­hö­ri­gen Pins.

Metho­den der Biblio­thek vs1053

Metho­deAus­füh­rung
begin()Play­er starten
get­Sta­te()Sta­tus des Play­ers abfragen
0 = der Play­er wur­de nicht gestartet
1 = der Start des Play­ers war erfolgreich
setVolume(links, rechts)Laut­stär­ke set­zen -> links, rechts
1, 1 sehr laut
je grö­ßer der Wert, des­to leiser 
playTrack(Nummer)
track001.mp3 → playTrack(1)
track002.mp3 → playTrack(2)
spielt den Track (Num­mer)
Track darf eine wav oder mp3-Datei sein
playMP3(Dateiname)
track001.mp3 → playMP3(track001.mp3)
track002.mp3 → playMP3(track002.mp3)
im Unter­schied zu playTrack()
dür­fen Datei­na­men ange­ge­ben werden
stop­Track()stoppt den gera­de lau­fen­den Track
pau­se­Mu­sic()pau­siert den gera­de lau­fen­den Track
resum­e­Mu­sic()setzt die Wie­der­ga­be nach der Pau­se fort
setBassAmplitude(Wert);Bäs­se ein­stel­len: erlaub­te Wer­te: 0 bis 15
setTrebleAmplitude(Wert)Höhen ein­stel­len: erlaub­te Wer­te: -8 bis 7
Send­Sin­gleM­IDI­no­te()spielt ein „Beep“

Im Kopf des Pro­gramms wer­den die benö­tig­ten Biblio­the­ken ein­ge­bun­den und die Varia­blen defi­niert. Beach­te die Kommentare.

# include <vs1053_SdFat.h>
# include <SdFat.h>
# include <Bounce2.h>

// Bezeichnung der SD-Karte
SdFat sd;

// Bezeichnung des mp3-Shields
vs1053 MP3player;

// Variable für das Lesen des Verzeichnisses
File Verzeichnis;
File Datei;

// die Taster
int TASTER1 = 5;
int TASTER2 = 4;
int TASTER3 = 7;
int TASTER4 = 6;

// Bibliothek Bounce2
// "Prellverhinderer" für die Tasten starten
Bounce Taste_play = Bounce();
Bounce Taste_naechster = Bounce();
Bounce Taste_Pause = Bounce();
Bounce Taste_weiter = Bounce();

// wenn ein Taster gedrückt wurde
int TasterStatus;

// Tracknummer/Anzahl der Tracks
int Track = 1;
int TrackMax = 0;

Der setup-Teil:

void setup() 
{ 
  pinMode(TASTER1, INPUT_PULLUP); 
  pinMode(TASTER2, INPUT_PULLUP); 
  pinMode(TASTER3, INPUT_PULLUP); 
  pinMode(TASTER4, INPUT_PULLUP); 

  // Instanzen des Objekts Bounce für jede Taste zuordnen 
  // Zeitintervall einstellen 
  Taste_play.attach(TASTER1); 
  Taste_play.interval(20); 
  Taste_naechster.attach(TASTER2); 
  Taste_naechster.interval(20); 
  Taste_Pause.attach(TASTER3); 
  Taste_Pause.interval(20); 
  Taste_weiter.attach(TASTER4); 
  Taste_weiter.interval(20); 

  // Seriellen Monitor starten 
  Serial.begin(9600); 

  // SD Karte starten 
  sd.begin(SD_SEL, SPI_FULL_SPEED);

  // Anzahl der Tracks im Wurzelverzeichnis zählen 
  // Char-Array für den Dateinamen 
  char Dateiname[13]; 
  sd.chdir("/", true); 

  while (Datei.openNext(sd.vwd(), O_READ)) 
  { 
    Datei.getName(Dateiname, sizeof(Dateiname)); 

    // handelt es sich um eine Musikdatei (isFnMusic) 
    if (isFnMusic(Dateiname)) 
    { 
      Serial.print(Dateiname); 
      
      // Dateigröße ermitteln, in MB umwandeln, Punkt durch Komma ersetzen 
      float DateiGroesse = Datei.fileSize(); 
      String Groesse = String(DateiGroesse/1000000); 
      Groesse.replace(".", ",");  
      Serial.println(" " + Groesse + " MB"); 
      TrackMax ++; 
    } 
    Datei.close(); 
  } 
  Serial.println();   Serial.println("Anzahl der Tracks: " + String(TrackMax)); 
  Serial.println("------------------------------"); 

  // Player starten 
  MP3player.begin(); 

  // Höhen: erlaubte Werte: -8 bis 7 
  MP3player.setTrebleAmplitude(4); 

  // Bässe: erlaubte Werte 0 bis 15 
  MP3player.setBassAmplitude(7); 

  // Status des Players ermitteln 
  if (MP3player.getState() == 1) Serial.println("Player erfolgreich gestartet"); 

  // Lautstärke setzen -> links, rechts -> 1, 1 sehr laut 
  // je größer die Werte desto leiser   
  MP3player.setVolume(40,40); 
} 

Der loop-Teil.
Beach­te die Kommentare.

void loop()
{
  // aktuellen Track abspielen
  if (Taste_play.update())
  {
    if (Taste_play.read() == LOW)
    {
      // kurzes "Beep" spielen
      MP3player.SendSingleMIDInote();
      MP3player.SendSingleMIDInote();

      // laufenden Track stoppen/aktuellen Track abspielen
      MP3player.stopTrack();
      Serial.println("Spiele Track " + String(Track));
      MP3player.playTrack(Track);
    }
  }

  // nächster Track
  if (Taste_naechster.update())
  {
    if (Taste_naechster.read() == LOW)
    {
      // kurzes Beep spielen
      MP3player.SendSingleMIDInote();
      MP3player.SendSingleMIDInote();
      MP3player.stopTrack();

      // wenn der letzte Track gespielt wurde
      // -> Neustart mit 1
      if (Track < TrackMax) Track ++;
      else Track = 1;
      Serial.println("Spiele Track " + String(Track));
      MP3player.playTrack(Track);
    }
  }

  // Pause
  if (Taste_Pause.update())
  {
    if (Taste_Pause.read() == LOW)
    {
      MP3player.SendSingleMIDInote();
      MP3player.SendSingleMIDInote();

      // Track pausieren
      Serial.println("Pause Track " + String(Track));
      MP3player.pauseMusic();
    }
  }

  // weiter abspielen
  if (Taste_weiter.update())
  {
    if (Taste_weiter.read() == LOW)
    {
      MP3player.SendSingleMIDInote();
      MP3player.SendSingleMIDInote();

      // Wiedergabe fortsetzen
      Serial.println("Weiter Track " + String(Track));
      MP3player.resumeMusic();
    }
  }
}


Ver­wand­te Aufgaben:


Letzte Aktualisierung: 24. Nov 2020 @ 9:05