Grafisches Menü

Hallo liebe Forengemeinde,

aktuell habe ich an meinem 3-Button TonUINO ein I2C-Display, das mir Lautstärke und Track-Nummern anzeigt.
Nun würde ich gerne auch das Menü grafisch darstellen. Also immer wenn das entsprechende Soundfile abgespielt wird eine Einblendung, die die weiteren Optionen zeigt.
Mein plan war einfach eine Displayausgabe nach jedem

mp3.playMp3FolderTrack(XXX);

einzubauen. Manche Tracknummern aus dem Mp3-Ordner finde ich allerdings gar nicht im Code.
Wo kann ich das dann einbauen?
Leider ist mir in der Code mittlerweile zu lang und zu unübersichtlich, dass ich wirklich noch durchsteige, wo sich welche Funktion versteckt. Zumal ich zugeben muss, dass ich zuvor manche Befehle noch nichtmal gelesen hatte und immer sehr viel basalere Programme geschrieben habe :cold_sweat:

Vielen Dank und Grüße,
Tuok

Manche der Sounddateien sind im Code etwas versteckt. Hier ein Auszug des Codes in dem Sounddateien des Adminmenüs aufgerufen werden

// *********************Admin-Menü-Funktionen auswählen*****************

  int subMenu = voiceMenu(12, 900, 900, false, false, 0, true); // Willkommen im Adminmenü,Wähle eine Funktion ...(mp3/ 900 - 912)
  if (subMenu == 0)
    return;
  // ************** Karte neu Konfiguriern ***********  
  if (subMenu == 1)         // Karte neu Konfigurieren

Diese Art des Aufrufs von Sounddateien findest du auch noch an anderen Stellen im Code.

Die Schlüsselposition für dias oben gezeigte Beispiel liegt im folgenden Codeteil:

int subMenu = voiceMenu(12, 900, 900, false, false, 0, true);

Der Rest dahinter beginnend mit den // Kommentarzeichen ist von mir ergänzt als Orientierungshilfe für mich.

Die Zeile sagt im Prinzip folgendes aus:
12 für 12 Optionen
900 für die erste Sounddatei.
Mit jedem weiterschalten der Optionen wird die darauffolgende Sounddatei gespielt, also 901, 902, ……912.

Danke, dann weiß ich zumindest wo es im Code steht. Macht die Sache dann aber nicht einfacher. Dachte ich könnte da jetzt überall den Code mit den jeweiligen Optionen rein copy/pasten. :sweat_smile:

Mach es doch so:

Erstell eine neue Funktion:

void mp3FolderPlayTrack (uint8_t track)
{
  mp3.playMp3FolderTrack(track);
  //Eigner Code
}

Dann mit strg+H (Suchen und ersetzen) den Text „mp3.playMp3FolderTrack(“ durch den Namen der neuen Funktion: „mp3FolderPlayTrack (“ erstzen.

Jetzt sollten alle Aufrufe einer MP3 im mp3-Ordner in die neue Funktion führen, in der du deinen Code für das Display integrieren kannst.

Aber wie Thomas-Lehnert geschrieben hat, verstecken die sich ja auch in anderen Befehlen, weswegen das leider nicht alle Menüpunkte erfassen würde… oder übersehe ich da was?
Liebe Grüße, Tuok

Die Funktion VoiceMenu ist ebenfalls im Quellcode implementiert und enthält auch nor die mp3.playMp3FolderTrack Funktion.

es ist nichts auf Bibliotheksebene versteckt oder dergleichen.

Teste es doch einfach, geht ja nichts kaputt.

Ich habe es versucht zu implementieren, leider scheitert ein Grafisches Menü am Programmspeicherplatz. Hier komme ich auf 112%…

Edit: Auch wenn ich alles auskomentiere und nur versuche bei einer voicemenue Option etwas anzeigen zu lassen, passiert am Display nix.
Habe es versucht wie folgt zu implementieren:

if (subMenu == 1) {
           /// hier Beginnt Display 
    oled.setFont(Callibri11_bold);

 
  oled.clear();
    oled.println(" Reset Karte");
    oled.println("Maximale Lautstärke");
    oled.println("Minimale Lautstärke");
    oled.println("Start-Lautstärke");
    oled.println("Equalizer");
  // Ende Display
  
    resetCard();
    mfrc522.PICC_HaltA();
    mfrc522.PCD_StopCrypto1();
  }
  else if (subMenu == 2) {

           /// hier Beginnt Display 
    oled.setFont(Callibri11_bold);

 
  oled.clear();
    oled.println("Reset Karte");
    oled.println(" Maximale Lautstärke");
    oled.println("Minimale Lautstärke");
    oled.println("Start-Lautstärke");
    oled.println("Equalizer");
  // Ende Display

Ich habe um das Programm zu verkleinern, alle Debug Ausgaben in die Konsole mit einem #ifdef DEBUG versehen, so kann man fast 30% einsparen. Zusätzlich „belaste“ ich den Arduino im laufenden Betrieb nicht mit unnötigen Aufgaben. Falls ich sie dennoch brauche sind sie schnell wieder über das #define DEBUG eingefügt.

1 Like