Frage: Zuletzt gespielte Karte als Shortcut - Softwarefeature

Guten Morgen liebe Community,

mit der Suche bin ich leider nicht fündig geworden. Ich würde gerne folgende Funktion in der Software implementieren:

Mein Sohn hört sehr gerne Hörbücher (aktuell wie wild Drache Kokosnuss). Da ich inzwischen auch eine recht tragbare Version des Tonuino gebaut habe, wird dieser auch in der ganzen Wohnung herumgeschleppt. Ab und zu kommt es dann vor, dass der Tonuino oben in der Küche steht, die gestern gehörte Karte aber irgendwo in seinem Zimmer liegt. Ist es möglich, dass man sich die zuletzt gespielte Karte merkt (im EEPROM?!) und auf einen Shortcut (z.B. Play/Pause) legt. Gut wäre dann natürlich auch, dass er bei einer gemerkten Hörbuchkarte auch die Titelposition merkt und verwendet.

Ich werde mich heute mal ein wenig mit der Implementierung beschäftigen. Aber vielleicht hat ja der ein oder andere eine solche Funktion schon eingebaut oder weiss auf die schnelle wie es gehen könnte.

Vielen Dank.

4-Farben-Stift

Ich denke am einfachsten ist es einfach die Aufgelegte Karte zu Speichern, also alle Informationen folder/mode/special usw und mit einem shortcut Verknüpft. Dann sollte beim Start immer die letzte Karte egal welcher mode über den shortcut geladen werden und laufen.

Wenn Du nur das aktuelle Lied, oder Hörspiel speichern möchtest, dann geht das über mp3.getCurrentTrack(), spielt dann aber auch nur das eine Lied/ oder Hörbuch, nächste Titel sind damit aber erstmal nicht anwählbar.

Hoffe das hilft weiter, und ist von der Implementierung nicht zu komplex. Wenn es einfachere wege gibt, wird es bestimmt jemand sagen :wink:

1 „Gefällt mir“

Genau das Problem hatte ich vor zwei Tagen. Wir machten einen Ausflug und hatten wegen eines Missverständnisses keine Karte dabei. Mein Sohn war total fertig, weil er während der langen Fahrt nicht wie versprochen ein Hörspiel hören konnte.

Am Abend habe ich dann die Shortcut-Funktion implementiert. Dazu wird bei jedem Auflegen einer Karte deren Ordnernummer, Modus und Special-Wert im EEPROM gespeichert, so dass der TonUINO die Konfiguration der jeweils letzten Karte kennt.

Der Shortcut funktioniert nun so: Wenn man beim Einschalten des TonUINO die Play/Pause-Taste gedrückt hält, wird die Konfiguration der letzten Karte ausgelesen und abgespielt.

Auch der Hörbuchmodus funktioniert damit problemlos, da der jeweils letzte Track eines Hörbuches sowieso im EEPROM abgelegt wird.

Bei der Gelegenheit habe ich noch einen weiteren Shortcut auf die NEXT-Taste gelegt: Wenn man diese beim Starten gedrückt hält, wird ein zufälliger Ordner abgespielt. In diesem Fall ist der zum Ordner gehörende Abspiel-Modus nicht bekannt, und es werden daher einfach alle Tracks des Ordners nacheinander abgespielt.

Bei mir merkt er sich auch alles. Ua den track, Ordner, Lautstärke. Fängt dann beim nächsten Neustart der Box wieder da an, wo er aufgehört hat. Mit den Buttons kann ich dann selber wählen, welcher Ordner gespielt wird. Sehr praktisch wenn keine Karte zur Hand, bei 117 Kinderliedern im Ordner, bei Hörspielen mit vielen Tracks, wenn einem die Karten ausgehen, das Gehäuse sehr klein ist, oder oder oder.

Ein NFC-Emulator übers Handy, am besten mit Datenbank, wäre natürlich noch besser :wink:

Hallo @Peer
Ich würde diese Funktion bei mir auch gerne implementieren. Kannst du den code mal posten?
Wünsche auch schöne Weihnachten und einen guten Rutsch.
Gruß
Thomas

Mein Code basiert noch auf Master, dürfte aber ähnlich auch in Dev integrierbar sein. Leider komme ich über Weihnachten nicht an meinen Rechner, daher kann ich Dir die nötigen Codeänderungen jetzt nicht posten.

Hi zusammen.

Anbei mal die Modifikationen zum Belegen des Lang-Druckes des Play/Pause Buttons mit der zuletzt aufgelegten Karte. Im Grunde definiere ich bei jedem Start des Tonuino den Shortcut0(Play/Pause) neu mit der zuletzt gespielten Karte.

//defines für LastCard z.B. bei Definition der Buttons
#define folderReg 201
#define modeReg 202
#define specialReg 203

//LastCard auf Play legen (Als letzter Funktionsaufruf in void setup() {}
setupPlayShortcut(&mySettings.shortCuts[0]);

// Aufgelegte Karte im EEPROM Speichern (LastCard) in der do-Schleife der loop Funktion z.B. nach mp3.loop();
  EEPROM.update(folderReg,myFolder->folder);
  EEPROM.update(modeReg,myFolder->mode);
  EEPROM.update(specialReg,myFolder->special);

// Funktion für LastCard z.B. nach Funktion "setupPlayShortcut"
bool setupPlayShortcut(folderSettings * theFolder){
  theFolder->folder = EEPROM.read(folderReg);
  theFolder->mode = EEPROM.read(modeReg);
  theFolder->special = EEPROM.read(specialReg);
}

Mit den Modifikationen könnt ihr quasi im Nicht-Play Modus bei langem Druck auf Play/Pause die im EEPROM gespeicherte Karte abspielen :crossed_fingers:

Ich hoffe ich habe nix vergessen.
PS.: Integriert und getestet mit der letzten DEV-Version.

3 „Gefällt mir“

Hey.Super. Das werde ich noch bei mir integrieren. Danke fürs Teilen. Wünsche noch einen guten Rutsch ins Neue Jahr und weiterhin erfolgreiches Basteln.

Hallo Hier noch mal Ich
Ich habe versucht deine Version zu implementieren. Leider klappt es nicht.
Alles wie beschrieben im Code eingefügt, aber beim kompilieren gibt’s eine Fehlermeldeung. Hast du was unvollständig gepostet?
Hier der Part mit der Fehlermeldung
Eingefügt am Ende des Setup Bin mir nicht sicher ob die Funktion nicht vor dem Setup eingefügt werden muss?

   // Funktion für LastCard z.B. nach Funktion "setupPlayShortcut"
  bool setupPlayShortcut(folderSettings * theFolder){
  theFolder->folder = EEPROM.read(folderReg);
  theFolder->mode = EEPROM.read(modeReg);
  theFolder->special = EEPROM.read(specialReg);
}
    setupPlayShortcut(&mySettings.shortCuts[0]);     //LastCard auf Play legen  



        void loop() {

Diese Zeile wird angemeckert mit;
exit status 1
expected constructor, destructor, or type conversion before ‚(‘ token

setupPlayShortcut(&mySettings.shortCuts[0]); //LastCard auf Play legen

Hast du da nen Tip?

Gruß Thomas

Ohne zu wissen, was genau du wo hinkopiert hast nee. Es steht doch eigentlich dabei, was wo hin soll. Die Vermutung ist, du hast einfach was an die falsche Stelle kopiert.

Hallo @stephan
Das ist auch meine Vermutung.

     //defines für LastCard z.B. bei Definition der Buttons
    #define folderReg 201
    #define modeReg 202
    #define specialReg 203

habe ich nach der Definition der Buttons eingefügt.

//LastCard auf Play legen (Als letzter Funktionsaufruf in void setup() {}
setupPlayShortcut(&mySettings.shortCuts[0]);

habe ich im void setup als letzte Zeile eingefügt.

// Aufgelegte Karte im EEPROM Speichern (LastCard) in der do-Schleife der loop Funktion z.B. nach mp3.loop();
  EEPROM.update(folderReg,myFolder->folder);
  EEPROM.update(modeReg,myFolder->mode);
  EEPROM.update(specialReg,myFolder->special);

habe ich im Loop nach mp3.loop(); eingefügt.

// Funktion für LastCard z.B. nach Funktion "setupPlayShortcut"
bool setupPlayShortcut(folderSettings * theFolder){
  theFolder->folder = EEPROM.read(folderReg);
  theFolder->mode = EEPROM.read(modeReg);
  theFolder->special = EEPROM.read(specialReg);
}

Hatte ich erst im Setup eingefügt. brachte die besagte Fehlermeldung beim Kompilieren.
Habe es dann verschoben nach vor dem Setup. Gleiches Ergebnis.
Die Funktion "setupPlayShortcut " als Orientierungshilfe gibt es in der DEV nicht.

So, Problem gelöst. Hatte die letzte Anweisung " LastCard auf Play legen" außerhalb der geschweiften Klammer eingefügt. Innerhalb der Klammer gesetzt und es funktioniert. Manchmal ist halt die Brille etwas beschlagen, und Blindheit schützt vor Fehlern nicht.
Zur Orientierung , Die Funktion für LastCard muss vor dem Void setup() eingefügt werden.
War etwas missverständlich beschrieben.
Jetzt versuche ich noch eine Modifikation, weil diese Funktion auch den zuletzt gespielten shortcut auf die Pausetaste legt. Da die shortcuts auf den anderen Tasten ja festgelegt sind, macht das wenig Sinn. Besser ist es dass eben die zuletzt aufgelegte Karte auf Play gespeichert wird, auch wenn inzwischen ein shortcut der anderen Tasten gespielt wurde.

Hallo @4-Farben-Stift
Ich habe jetzt nach ein paar kleineren Problemen die Funktion ans Laufen gebracht. Dabei ist mir folgendes aufgefallen. Die Funktion legt auch von einem schortcut der auf eine der anderen Tasten und dem Startsound einen shortcut auf die Playtaste. Ich bin im moment dabei eine Lösung zu finden, das nur ein shortcut auf Play gelegt wird wenn eine Karte gespielt wird.
Desweiteren habe ich festgestellt, dass in deinem Code der EEPROM bei jedem Durchlauf der loop Schleife geschrieben wird. Ich habe mal irgendwo gelesen, dass die EEPROMS bezüglich der Schreibzyklen eine begrenzte Lebensdauer haben. Das heißt, dass durch das permanente Beschreiben der Arduino bzw EEPROM nah einiger Zeit nicht mehr funktioniert.
Um das zu vermeiden bin ich auch noch dabei den Code dahingehend zu ändern, dass nur bei einem Trackwechsel der EEPROM beschrieben wird.
Wenn ich eine funktionierende Lösung habe werde ich sie hier posten. Aber vielleicht hast du da auch noch Ideen.
Guten Rutsch ins Neue Jahr wünsche ich noch
Gruß Thomas

So, es ist geschafft. Ich habe jetzt die Aktualisierung des EEPROMS aus der loop ganz herausgenommen. Dadurch wird er nur 1 mal aktualisiert wenn eine Karte aufgelegt wird.
Als Basis habe ich weiterhin den Code von @4-Farben-Stift verwendet. Die Umbauten bzw Änderungen sind folgende:

Codeänderungen für shortcut letzte Karte auf PlayTaste.

Diesen Part vor der Definition der Buttons einfügen (ziemlich am Amfang des Codes)

//Letzte gespielte Karte als shortcut auf Playtaste legen 

//defines für LastCard
#define folderReg 201
#define modeReg 202
#define specialReg 203

Diesen Part vor der void setup() einfügen (vor der letzten geschweiften Klammer"}" )

// Funktion für LastCard 
  bool ShortCutIsPlaying = false ;     // Marker ob von einem Shortcut wiedergegeben wird.
  bool setupPlayShortcut(folderSettings * theFolder){
  theFolder->folder = EEPROM.read(folderReg);
  theFolder->mode = EEPROM.read(modeReg);
  theFolder->special = EEPROM.read(specialReg);

Diesen Part im void setup() einfügen. Am Ende der void playFolder() } ". Auch hier darauf achten vor der letzten geschweiften Klammer am Ende

 if(ShortCutIsPlaying == false) { ;                      // wenn Marker  "shortcut wird nicht gespielt"
    EEPROM.update(folderReg,myFolder->folder);            // EEPROM updaten 
    EEPROM.update(modeReg,myFolder->mode);
    EEPROM.update(specialReg,myFolder->special);
    Serial.println(F("=== EEPROM -> Folder-Update ShortCut Playtaste"));
  }
  
ShortCutIsPlaying = false ;                                // Marker rücksetzen "shortcut wird gespielt"

Diesen Part anstelle des Originalparts einfügen, am Ende von voidSetup().

void playShortCut(uint8_t shortCut) {
  Serial.println(F("=== playShortCut()"));
  Serial.println(shortCut);
  if(shortCut == 0){
    setupPlayShortcut(&mySettings.shortCuts[0]);    //LastCard auf Play legen 
    Serial.println(F("Shortcut Playtaste configured!")); 
  }
  if (mySettings.shortCuts[shortCut].folder != 0) { // wenn ein shortcut gespeichert
    myFolder = &mySettings.shortCuts[shortCut];     // aktueller Track -> Gespeichert in shortcut
    ShortCutIsPlaying = true ;                     // Marker setzen "shortcut wird gespielt"
    playFolder();                                   // shortcut spielen
    disablestandbyTimer();
    delay(1000);
  }
  else {                                             // wenn kein shortcut gespeichert tue nichts
    Serial.println(F("Shortcut not configured!"));
    ShortCutIsPlaying = false ;                     // Marker setzen "Kein shortcut gespielt"
  }
 }

Die Aktualisierung des EEPROMS ist jetzt nicht mehr im loop und wird nur noch ausgeführt wenn ein Track von einer Karte wiedergegeben wird. Die Shortcuts inklusive Startsound werden für die Aktualisierung des EEPROMS nicht mehr berücksichtigt.

Bei mir funktioniert es gut ( DEV Version)

2 „Gefällt mir“