Problem mit MP3-Shield - Soll auf Tasten reagieren, dudelt ab Taster 4 ständig

Hallo zusammen,

ich bin blutiger Arduino-Anfänger und merke das gerade an einem Sketch.

Ich habe einen Arduino Uno und das VS 1053 MP3-Shield darauf gesteckt.
Ich versuche eine Art Tastertafel zusammenzubauen wo es auf jeden Tastendruck ein Geräusch oder einen Liedschnipsel gibt - ähnlich wie es Stefan Raab mal auf seinem Tisch hatte. Ich befürchte aber ich habe da etwas ganz grundlegendes übersehen oder nicht verstanden....

Mein Problem ist folgendes: Alles funktioniert wunderbar bis zum dritten Taster.
Nehme ich aber den 4. Taster in den Loop-Programmteil mit auf, dann erklingt der Liedschnipsel fortwährend in Dauerschleife. :o Es ist egal ob ich den Taster drücke oder nicht. Es ist sogar so, dass das MP3 auch dann weiterdudelt, wenn ich den Taster elektrisch komplett abklemme. Nehme ich weitere Taster in den Loop-Teil auf, dann scheint es so, als würden die unterschiedlichen MP3s einfach "random" abgespielt.

Könnt Ihr mir sagen wo mein Fehler ist?

Technisch habe ich sämtliche Pins (außer 0 - hab gelesen, das soll man nicht) belegt, auch die analogen. Am PIN10 hängt derzeit noch eine LED.

Ganz ehrlich: Als Anfänger habe ich ein wenig mit Anleitungen und vorgefertigten Sketchen geübt und mir den jetzigen Sketch dann daraus zusammengeschustert...

Anbei gleich der Code.

Schonmal vielen Dank fürs Eure Tipps. Bin auch für jeden anderen Hinweis dankbar, was ich besser machen kann... :slight_smile:

Buntspecht

#include <FreeStack.h>
#include <SdFat.h>
#include <SdFatConfig.h>
#include <SPI.h>
#include <vs1053_SdFat.h>

//Vorbereitungen für MP3-Shield

SdFat sd;       //SD Karte benennen
vs1053 MP3player;   //MP3 Shield als „MP3Player benennen

int t=8000;       //Der Wert für „t“ gibt im Code den zeitlichen Abstand zwischen dem Abspielen der Datei an.

//Variablen definieren und PIN-Nutzung festlegen

const int LEDblau=10;
const int taster_1Reihe_1vL=12;
const int taster_1Reihe_2vL=14;
const int taster_1Reihe_3vL=13;
const int taster_1Reihe_4vL=11;
const int taster_1Reihe_5vL=9;
const int taster_1Reihe_6vL=8;
const int taster_1Reihe_7vL=7;
const int taster_2Reihe_1vL=6;
const int taster_2Reihe_2vL=5;
int tasterstatus_1Reihe_1vL=0;
int tasterstatus_1Reihe_2vL=0;
int tasterstatus_1Reihe_3vL=0;
int tasterstatus_1Reihe_4vL=0;
int tasterstatus_1Reihe_5vL=0;
int tasterstatus_1Reihe_6vL=0;
int tasterstatus_1Reihe_7vL=0;
int tasterstatus_2Reihe_1vL=0;
int tasterstatus_2Reihe_2vL=0;

void setup() 

{
//Definieren, was die Pins machen

pinMode(LEDblau, OUTPUT);
pinMode(taster_1Reihe_1vL, INPUT);
pinMode(taster_1Reihe_2vL, INPUT);
pinMode(taster_1Reihe_3vL, INPUT);
pinMode(taster_1Reihe_4vL, INPUT);
pinMode(taster_1Reihe_5vL, INPUT);
pinMode(taster_1Reihe_6vL, INPUT);
pinMode(taster_1Reihe_7vL, INPUT);
pinMode(taster_2Reihe_1vL, INPUT);
pinMode(taster_2Reihe_2vL, INPUT);

//MP3-Shield Definieren das SD-Karte gelesen werden soll und dass Fehler kommt wenn etwas nicht passt

  if(!sd.begin(SD_SEL, SPI_FULL_SPEED)) sd.initErrorHalt(); //SD Karte mit MP3 Dateien auslesen
  if (!sd.chdir("/")) sd.errorHalt("sd.chdir");

  MP3player.begin();    //MP3 Shield starten
  MP3player.setVolume(20,20); //Die Lautstärke einstellen 
  
}

//Eigentliches Programm startet

void loop() 
{
tasterstatus_1Reihe_1vL=digitalRead(taster_1Reihe_1vL);
if (tasterstatus_1Reihe_1vL == HIGH)
{
MP3player.available();

  MP3player.playTrack(1);     //Das MP3 Shield spielt nun die MP3 Datei mit dem Namen „track001“. Bei einer Datei mit dem Namen „track002“ müsste eine „2“ anstelle der „1“ in diese Klammer.
  // delay(t);               //Vorher festgelegte Pause
}
else
{
digitalWrite(LEDblau, LOW); 
}
tasterstatus_1Reihe_2vL=digitalRead(taster_1Reihe_2vL);
if (tasterstatus_1Reihe_2vL == HIGH)
{
MP3player.available();

  MP3player.playTrack(2);     //Das MP3 Shield spielt nun die MP3 Datei mit dem Namen „track001“. Bei einer Datei mit dem Namen „track002“ müsste eine „2“ anstelle der „1“ in diese Klammer.
  // delay(t);               //Vorher festgelegte Pause
}
else
{
tasterstatus_1Reihe_3vL=digitalRead(taster_1Reihe_3vL);
if (tasterstatus_1Reihe_3vL == HIGH)
{
MP3player.available();

  MP3player.playTrack(3);     //Das MP3 Shield spielt nun die MP3 Datei mit dem Namen „track001“. Bei einer Datei mit dem Namen „track002“ müsste eine „2“ anstelle der „1“ in diese Klammer.
  // delay(t);               //Vorher festgelegte Pause
}
else

//Ab hier wird es kritisch. Füge ich die den Taster 1Reihe_4vL hinzu spielt kontinuirelich track004. Füge ich weitere Schalter hinzu, werden die jeweils dort benannten Tracks einfach durcheinander nacheinander abgespielt. 

{
tasterstatus_1Reihe_4vL=digitalRead(taster_1Reihe_4vL);
if (tasterstatus_1Reihe_4vL == HIGH)
{
MP3player.available();

  MP3player.playTrack(4);     //Das MP3 Shield spielt nun die MP3 Datei mit dem Namen „track001“. Bei einer Datei mit dem Namen „track002“ müsste eine „2“ anstelle der „1“ in diese Klammer.
  // delay(t);               //Vorher festgelegte Pause
}
else
{
digitalWrite(LEDblau, LOW); // Im Moment nur dafür da den letzten "Else" wegzubekommen - da sollen noch weitere Taster folgen.
}
}
}
}

Schaltplan?

Nutzt du Pulldown Widerstände? Wenn nein, mit welcher guten Begründung nicht?

Drück mal STRG-T in der IDE um die Einrückungen richtig zu stellen. Vermutlich siehst dann schon selber dein Durcheinander.

Ergänze Serial-Print Ausgaben und schreibe dir zu jedem If (in jedes else) eine Ausgabe raus, wo du momentan bist.
Dann erkennst du leichter ob du einen Logikfehler im Programm hast oder was an deiner Hardware faul ist.

Wenn es funktioniert, erkunde dich was es mit Arrays auf sich hat und bau den Sketch um.

Auch den Pin D1 sollte man möglichst nicht nutzen.
D0 und D1 werden vom USB-Adapter-Chip genutzt.

Warum verwendest du nicht einen besseren MP3-Player ?
Z.B. den DFPlayer mini.

(deleted)

Moin zusammen,

vielen Dank für Eure Hinweise. Werde ich ausprobieren.
@noiasca: Schaltplan kommt. Aber um Deine Fragen zu beantworten: Ja ich nutze Pulldown-Widerstände.
@HotSystems: OK, den PIN 1 spar ich mir dann auch. Das VS1053 war das erste MP3-Shield was ich gesehen hatte. Es sah so schön narrensicher aus, weil es zum draufstecken war, nicht das ich wirklich Ahnung gehabt hätte...

@Peter: Danke für die ausführlichen Erklärungen. :slight_smile:

Die LED wird einfach ne Power-LED sein. Jetzt nehme ich sie zum Testen.
Die Taster 1. Reihe 2. Reihe etc. reflektieren die Anordnung auf dem Schaltbrett. Ich dachte das wäre übersichtlicher. Ich hatte schlicht in einem Arduino-Tutorial gelernt wie man eine LED mit nem Taster schaltet, habe das Ganze dann einfach 20mal wiederholt und versucht auf MP3 umzubiegen :slight_smile: Der Ansatz war vielleicht etwas sportlich... 8)

Mit Deinen Tipps unten geht das dann natürlich viel schöner - jetzt hab ich nen Ansatz in welche Richtung ich mich erstmal "weiterbilden" kann. Super, dass Du gleich nen Codeschnipsel mitgegeben hast.

Viele Grüße
Buntspecht

(deleted)