Mp3 Jinglebox mit Rotary Encoder schmiert nach ersten Playback ab

Hallo zusammen,

Als Anfänger probiere ich viel rum und aus und orientiere mich an verschiedenen Beispielen. Bei diesem Projekt hab ich mir den Beispielsketch von erni-berni geschnappt und für entsprechend erweitert. Idee war, über den Encoder ein Track auszuwählen und ihn mit Druck auf den Encoder abzuspielen. Einfach damit ich nicht für jeden Track eine einzelne Taste brauch. Das Menu funktioniert soweit auch ganz gut, sobald ich was auswähle, zeigt mir das Lcd das an und springt zurück ins Menü. Soweit so gut. Wenn ich aber die Zeile Mp3player.playtrack() in die Unterprogramme einbaue, spielt der die Mp3, geht nach dem Delay zurück und bleibt auf der zuletzt gewählten Position im Menu. Kann weder rauf noch runter scrollen. Nur die selbe Mp3 durch drücken abspielen. Streiche ich die playback Zeile, funktioniert das Menü wieder.
Was hab ich übersehen?

Ich hab den Code mal bei Pastebin hochgeladen
https://pastebin.com/TUDFUgSU

Edit: ich verwende einen Uno Clone mit 16x2 LCD und I2C Backpack. Das Mp3 Shield ist ein Clone des Sparkfun Shields mit dem VS1053 Decoder

RFTFunker:
Ich hab den Code mal bei Pastebin hochgeladen

Und ich hab ihn hier angehangen. So ist nämlich die Chance, Hilfe zu bekommen, größer :wink:

// Simple menu for LCD displays.
// Author: Reinhard Nickels 02.01.2012
// Selection of menu item with a rotary encoder (eg. http://www.pollin.de/shop/dt/Njg2OTU3OTk-/Bauelemente_Bauteile/Passive_Bauelemente/Potis_Trimmer_Encoder/Encoder_PANASONIC_EVEQDBRL416B.html)
// Rotary encoder example based on http://arduino.cc/forum/index.php/topic,62026.msg449681.html#msg449681 from Nick Gammon

// Wiring: Connect common pin of encoder to ground.
// Connect pin A (one of the outer ones) to a pin that can generate interrupts (eg. D2)
// Connect pin B (the other outer one) to another free pin (eg. D5)

// Code was developed for I2C LCD displays, selection should be done with #define I2CDISPLAY value.
// Debug with serial interface can be activated with define DEBUG

//#define DEBUG   
int dummy;    // this a workaround to avoid error messages with #define and #ifdef, see http://code.google.com/p/arduino/issues/detail?id=206
#define I2CDISPLAY
#define MAXLINES 2    // defines the number of display lines
#define LCD_CHARACTERS 16

#ifdef I2CDISPLAY

#include <SPI.h>   
#include <SdFat.h>
#include <SFEMP3Shield.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define LCD_ADRESS 0x3F
LiquidCrystal_I2C lcd(LCD_ADRESS,LCD_CHARACTERS,MAXLINES);  // I2C LCD address is 0x27
#else
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // RS, E, D4, D5, D6, D7 - the standard connection
#endif

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

#define PINA 2
#define PINB 4
#define PUSHP 3
#define INTERRUPT 0  // that is, pin 2
#define INTERRUPTB 1  // that is, pin 3

volatile boolean turned;   // rotary was turned
volatile boolean fired;    // knob was pushed
volatile boolean up;  // true when turned cw

int CursorLine = 0;
int DisplayFirstLine = 0;
char* MenueLine[] = {"0. Track 1","1. Track 2","2. Track 3","3. Track 4","4. pre Bot Line","5. End"};
int MenueItems;

// Interrupt Service Routine for a change to pushpin
void isrp ()
{
  if (!digitalRead (PUSHP))
    fired = true;
}  // end of isr

// Interrupt Service Routine for a change to encoder pin A
void isr ()
{
  if (digitalRead (PINA))
    up = digitalRead (PINB);
  else
    up = !digitalRead (PINB);
  turned = true;
}  // end of isr


void setup ()
{
  if(!sd.begin(9, SPI_HALF_SPEED)) sd.initErrorHalt();  //SD Karte mit MP3 Dateien auslesen
  if (!sd.chdir("/")) sd.errorHalt("sd.chdir");

  MP3player.begin();    //MP3 Shield starten
  MP3player.setVolume(15,15); //Die Lautstärke einstellen 
  
  digitalWrite (PINA, HIGH);     // enable pull-ups
  digitalWrite (PINB, HIGH);
  digitalWrite (PUSHP, HIGH);
  attachInterrupt (INTERRUPT, isr, CHANGE);   // interrupt 0 is pin 2
  attachInterrupt (INTERRUPTB, isrp, FALLING);   // interrupt 5 is pin 18
#ifdef I2CDISPLAY
  lcd.init();
  lcd.backlight();
#else
  lcd.begin(LCD_CHARACTERS, MAXLINES);
#endif
  lcd.setCursor(0,0);
  lcd.print("Testing Menue!");
  lcd.setCursor(0,1);
  lcd.print("SW Ver 1.0");
  delay(1500);
  MenueItems = sizeof(MenueLine)/sizeof(MenueLine[0]);
#ifdef DEBUG 
  Serial.begin (9600);
  Serial.println("Testing Menue!........");
  Serial.print("Number of Menue Items ");
  Serial.println(MenueItems);
#endif
  lcd.clear();
  print_menue();
#ifdef I2CDISPLAY
  lcd.cursor_on();
#else
  lcd.cursor();
#endif 
  lcd.blink();
}  // end of setup

void loop ()
{
  MP3player.available();
  if (turned)
    {
    if (up)
      move_up();
    else
      move_down();
    turned = false;
    }
  else if (fired)
    {
    selection();
    fired = false;
    }  // end if fired
}  // end of loop

void print_menue() {
  lcd.clear();
  for (int i=0;i<MAXLINES;i++) {
    lcd.setCursor(0,i);
    lcd.print(MenueLine[DisplayFirstLine + i]);
  }
  lcd.setCursor(0,(CursorLine-DisplayFirstLine));
}

void move_down() {
  if (CursorLine == (DisplayFirstLine+MAXLINES-1)) {
    DisplayFirstLine++;
  }
  if (CursorLine == (MenueItems-1)) {
    CursorLine = 0;
    DisplayFirstLine = 0;
  }
  else {
    CursorLine=CursorLine+1;
  }
  print_menue();
}

void move_up() {
  if ((DisplayFirstLine == 0) & (CursorLine == 0)) {
    DisplayFirstLine = MenueItems-MAXLINES;   
  }
  else if (DisplayFirstLine == CursorLine) {
    DisplayFirstLine--;
  }
  if (CursorLine == 0) {
    CursorLine = MenueItems-1;
  }
  else {
    CursorLine=CursorLine-1;
  }
  print_menue();
}

void selection() {
// integrate here your calls to selected sub (eg. with switch/case)
#ifdef DEBUG 
  Serial.print("Menueline ");
  Serial.print(CursorLine);
  Serial.println(" selected");
  Serial.print("..this is Menuetext ");
  Serial.println(MenueLine[CursorLine]);
#endif
/* lcd.clear();
  lcd.print("You selected....");
  lcd.setCursor(0,1);
  lcd.print("Menue ");
  lcd.print(CursorLine);
  delay(1000); */
  switch (CursorLine) {
    case 0:
      track1();
      break;
    case 1:
      track2();
      break;
    case 2:
      track3(); 
      break;
    case 3:
      track4(); 
      break;
    default:
      break;
  }
  print_menue(); 
}

void track1() {
  lcd.clear();
  delay(100);
  MP3player.playTrack(1);
  lcd.print("Track 1");
  delay(1000);
}

void track2() {
  lcd.clear();
  delay(100);
  MP3player.playTrack(2);
  lcd.print("Track 2");
  delay(1000);
}

void track3() {
  lcd.clear();
  delay(100);
  MP3player.playTrack(3);
  lcd.print("Track 3");
  delay(1000);
}

void track4() {
  lcd.clear();
  delay(100);
  //MP3player.playTrack(4);
  lcd.print("Track 4");
  delay(1000);
}

Ok ::slight_smile:
Bei Fatzebook wollen alle immer Pastebin

RFTFunker:
Ok ::slight_smile:
Bei Fatzebook wollen alle immer Pastebin

Und wo sind wir hier ?

Wieso so ein blödsinniger Vergleich ?

Hier gehören alle Anhänge direkt in das Forum.
Andernfalls fehlen teile und zerreißen damit den Zusammenhang.

Edit:
Hyperlinks zu deinen Teilen wären auch von Vorteil, dann kann man sehen, was du verwendest.
Bitte hier posten, nirgend wo anders.

HotSystems:
Und wo sind wir hier ?

Wieso so ein blödsinniger Vergleich ?

Naja, Facebookgruppen sind ja auch nur Foren :wink: aber nun gut, weiß ja jetzt bescheid

HotSystems:
Hier gehören alle Anhänge direkt in das Forum.
Andernfalls fehlen teile und zerreißen damit den Zusammenhang.

Edit:
Hyperlinks zu deinen Teilen wären auch von Vorteil, dann kann man sehen, was du verwendest.

ich nehme mal an, mit teilen meinst du die einzelnen Geräte/Komponenten. ich hab da mal die entsprechenden rausgesucht

I2C Backpack

Uno Clone

MP3 Shield

Encoder

HotSystems:
Bitte hier posten, nirgend wo anders.

Wie meinst das? um Crossposts zu vermeiden?

RFTFunker:
Wie meinst das? um Crossposts zu vermeiden?

Doppelgleisig fahren (Gleich Frage in mehreren Foren bzw mehreren Untergruppen von Foren zu posten) ärgert viele User da sie sich, oft zu recht, Umsonst Antworten geben die anderswo bereits beantwortet wurden.
Grüße Uwe

uwefed:
Doppelgleisig fahren (Gleich Frage in mehreren Foren bzw mehreren Untergruppen von Foren zu posten) ärgert viele User da sie sich, oft zu recht, Umsonst Antworten geben die anderswo bereits beantwortet wurden.
Grüße Uwe

Das meinte ich, aber du hast es besser ausgedrückt :slight_smile:

Hier noch die vereinfachte Darstellung der Schaltung. Beim LCD fehlt der Backpack, den muss man sich einfach dazu denken :sunglasses:

RFTFunker:
Wie meinst das? um Crossposts zu vermeiden?

uwefed:
Doppelgleisig fahren (Gleich Frage in mehreren Foren bzw mehreren Untergruppen von Foren zu posten) ärgert viele User da sie sich, oft zu recht, Umsonst Antworten geben die anderswo bereits beantwortet wurden.

Sorry, ich meinte nur hier im Forum posten, nicht wieder auf "pastebin".

@RTFFunker

Hast du am I2C keine Pullup-Widerstände ?
Das kann evtl. auch zu einem Problem führen.

Oha, nein pullups hab ich keine dran. Welche nimmt man üblicherweise? 1k würde ich spontan versuchen

RFTFunker:
Oha, nein pullups hab ich keine dran. Welche nimmt man üblicherweise? 1k würde ich spontan versuchen

Üblich ist alles, was gut genug ist :smiley:

Ich nehme eigentlich alles von 1k bis 10k. Derzeit habe ich gerade 4k7 übrig ...

Gruß

Gregor

Pullups dran, leider keine Veränderung :frowning:
Egal ob 1k, 4,7k oder 10k

RFTFunker:
Pullups dran, leider keine Veränderung :frowning:
Egal ob 1k, 4,7k oder 10k

Denn Effekt kenne ich :slight_smile: Ist mir oft passiert. Dann liegt's sehr wahrscheinlich an etwas Anderem.

Sorry, Du könntest denken, dass ich mich über Dich lustig mache. Mache ich aber nicht. Ich weiß allerdings nicht mehr, woran es am Ende jeweils lag.

Es gibt einen Sketch, der einen Arduino zu einem „I²C-Sniffer“ macht, d. h. man kann mitlesen, was über I²C läuft. Für's Debugging von I²C-Sachen fand ich den ganz praktisch. Wenn Du das Ding nicht findest, gucke ich mal. Aber das sollte leicht zu finden sein.

Gruß

Gregor

Alles gut, Gregor :wink:

Ich hab das Gefühl, das es was mit Mp3 Shield zu tun hat. So funktioniert es wie gesagt nicht...

void track1() {
  lcd.clear();
  delay(100);
  MP3player.playTrack(1);
  lcd.print("Track 1");
  delay(1000);
}

So hingegen, funktioniert das Menü wieder. Nur ohne das die Mp3 gespielt wird

void track1() {
  lcd.clear();
  delay(100);
 // MP3player.playTrack(1);
  lcd.print("Track 1");
  delay(1000);
}

RFTFunker:
Ich hab das Gefühl, das es was mit Mp3 Shield zu tun hat. ...

Bleib doch erst mal bei der Fehlersuche/-behebung bei I²C. Oder haben sich die Probleme damit erledigt?

Gruß

Gregor

gregorss:
Bleib doch erst mal bei der Fehlersuche/-behebung bei I²C. Oder haben sich die Probleme damit erledigt?

Gruß

Gregor

sei mir nicht böse, aber ich sehe gerade keinen Fehler beim I2C Bus. Das läuft ja soweit alles, Display zeigt ja alles an

RFTFunker:
Ich hab das Gefühl, das es was mit Mp3 Shield zu tun hat. So funktioniert es wie gesagt nicht...

Hast du denn das MP3-Shield mal mit den Beispielen der Library solo getestet ?

Dann kann man am Besten Fehler finden.

Tipp: Immer die verwendeten Module einzeln testen!

Ich schaue ja bei unerklärlichen Fehlern gerne bei den grundsätzlichen Dingen, beispielsweise der Stromversorgung.

Dank Deiner schönen Links habe ich da mal drauf geklickt und lese beim VS1053 MP3 Shield: "3.3V and 2.8V of LDO chip AMS-1117 on board, provides up to 800mA current." Das ist eine Menge und könnte zusammen mit dem Display zu viel sein. Kann man manchmal am Flackern der Power-LED erkennen.

Der erwähnte Crowduino hat einen anderen Spannungsregler als ein Arduino oder Dein Clone und kann daher möglicherweise genug Strom liefern.

Also Programm laden, USB abziehen, zusammen mit GND 5V von externem Netzteil an 5V-Pin anschließen.

HotSystems:
Hast du denn das MP3-Shield mal mit den Beispielen der Library solo getestet ?

Dann kann man am Besten Fehler finden.

Tipp: Immer die verwendeten Module einzeln testen!

Solo funktioniert das wunderbar

agmue:
Ich schaue ja bei unerklärlichen Fehlern gerne bei den grundsätzlichen Dingen, beispielsweise der Stromversorgung.

Dank Deiner schönen Links habe ich da mal drauf geklickt und lese beim VS1053 MP3 Shield: "3.3V and 2.8V of LDO chip AMS-1117 on board, provides up to 800mA current." Das ist eine Menge und könnte zusammen mit dem Display zu viel sein. Kann man manchmal am Flackern der Power-LED erkennen.

Der erwähnte Crowduino hat einen anderen Spannungsregler als ein Arduino oder Dein Clone und kann daher möglicherweise genug Strom liefern.

Also Programm laden, USB abziehen, zusammen mit GND 5V von externem Netzteil an 5V-Pin anschließen.

also extern mit 5V statt über USB? hatte es bisher nur über USB dran. ich teste das einfach mal am Labornetzteil, denn seh ich ja direkt was das ganze zieht

RFTFunker:
also extern mit 5V statt über USB?

Ja.

RFTFunker:
ich teste das einfach mal am Labornetzteil, denn seh ich ja direkt was das ganze zieht

Die Trägheit des Meßinstrumetes könnte Dir einen Streich spielen. Bei Musik dürfte der Strombedarf recht schwankend sein.

Wenn das Netzteil mehr als 1,5A liefern kann und es funktioniert, bist Du auf der richtigen Fährte.