Projektvorstellung: Library für das Erstellen von Menus für LCD Displays

Ja, Text3 auch nur deshalb, weil meine Lib momentan mehrere "Textformate" unterstützt. Wird dann später bereinigt :wink:

Die Fuunktion für PROGMEM ist klar: strcpy_P(Text, (char*)pgm_read_word(_Text2));

Dann werde ich mal suchen, was den __FlashStringHelper in ein char Array klopfen kann.

den __FlashStringHelper

... gibt es so gar nicht "wirklich".
Von einem Pointer auf einen __Flashstringhelper weiss man, dass print() es drucken kann, und dass man diesen Pointer als einen prog_char* ( oder einen PGM_P ) verwenden kann.

also z.B. strcpy_P(rambuffer, (prog_char*)Text3 );

--> arduino-1.0.1\hardware\tools\avr\avr\include\avr\pgmspace.h

Einsame Klasse - so gehts!

mkl0815:
Damit man einen definierten Start hat, würde ich ein "root" Element im Menu-Objekt definieren, welches immer den ersten Eintrag liefert. Zusätzlich sollte jedes MenuItem entsprechende Methoden getForward(), getBack(), getUp und getDown() haben, damit man auf die angehängten Elemente zugreifen und damit durch den Baum / Graph navigieren kann.

So ein ROOT Element halte ich auch für wichtig. Da beim Menü sich um eine Baum-Datenstruktur handelt. Und die Baumstruktur braucht immer eine Wurzel.

Siehe hier:

Allerdings handelt es sich bei der Datensturktur eher um einen gerichteten Graphen, nicht um einen Baum. In einem Baum gibt es keine Schleifen, die aber in der Menustruktur durchaus möglich sind. Z.B. damit ich beim Weiterblättern nach dem letzten Eintrag einer Ebene wieder an deren Anfang heraus komme.

alhin:
So ein ROOT Element halte ich auch für wichtig. Da beim Menü sich um eine Baum-Datenstruktur handelt. Und die Baumstruktur braucht immer eine Wurzel.

Also ich habe einen Einstiegspunkt mit begin(int startElement).

mkl0815:
Allerdings handelt es sich bei der Datensturktur eher um einen gerichteten Graphen, nicht um einen Baum. In einem Baum gibt es keine Schleifen, die aber in der Menustruktur durchaus möglich sind. Z.B. damit ich beim Weiterblättern nach dem letzten Eintrag einer Ebene wieder an deren Anfang heraus komme.

Und wie in diesem Post beschrieben ist dies eher kein Baum sondern ein Graph und das macht es auch möglich endlos durch eine Ebene zu laufen (Also wenn man am letzten Element angekommen ist gehts oben wieder weiter). Dies war auch so von mir gewollt. Wobei mich interessieren würde, wo für ein root Element gut sein soll?

Cronos, du könntest jetzt auch die Texte über den Flash realisieren.
Vorlagen sind ja vorhanden :grin:

Mardetuino:
Cronos, du könntest jetzt auch die Texte über den Flash realisieren.
Vorlagen sind ja vorhanden :grin:

Ja hab das hier mit bekommen aber war erst mal ziemlich überfordert oO :D. Meinst du mit Flash den EEPROM? Zudem hab ich es versucht die Strings durch Char Arrays zu erstetzen, aber dadurch das ich diese zwischen den Klassen hin und her reiche und das nicht ganz will, bin ich erst mal bei Strings geblieben.

Ich hätte aber nichts dagegen wenn mir dabei geholfen wird die Lösung mit dem Flash um zusetzen :wink:

Ich habe mir in meiner Lib eine private _GetText Funktion erstellt.
Durch diese kann ich immer auf den Text zugreifen.

Der Flash ist der Programmspeicher (ReadOnly-wird beim Upload "gebrannt"/"geflashed" ^^), nicht das EEPROM.

Ich muss nur noch schauen, wie ich die passende char Buffergröße auswählen soll. Nicht, dass der Text im Flash doch zu groß ist und nacher wird nicht richtig dargestellt...

Mardetuino:
Ich habe mir in meiner Lib eine private _GetText Funktion erstellt.
Durch diese kann ich immer auf den Text zugreifen.

Der Flash ist der Programmspeicher (ReadOnly-wird beim Upload "gebrannt"/"geflashed" ^^), nicht das EEPROM.

Ich muss nur noch schauen, wie ich die passende char Buffergröße auswählen soll. Nicht, dass der Text im Flash doch zu groß ist und nacher wird nicht richtig dargestellt...

Aber mach ich das nicht auch? Auser das ich das ganze mit Strings verwalte. Ansonsten hab ich auch eine private getName();

Teste es mal in der Art. Oder du stellst deine char Array Lösung mal online...

// Die Funktion
void DeElemente::_GetText(char* Text)
{
     strcpy_P(Text, (prog_char*)_Text);
}


// Privater Zeiger
const __FlashStringHelper* _Text;

// Aufruf
char Text[20];
_GetText(Text);

Egal was ich mache, ich bekomme die Meldung "Menu" does not name a type. muss natürlich dazu sagen, das ich nicht viel mache, da ich wenig Ahnung habe.
Kann mir bitte jemand erklären wie ich vorgehen muss, um das Menü auf meines 16x2 Display Shield zu testen?

vondasein:
Egal was ich mache, ich bekomme die Meldung "Menu" does not name a type. muss natürlich dazu sagen, das ich nicht viel mache, da ich wenig Ahnung habe.
Kann mir bitte jemand erklären wie ich vorgehen muss, um das Menü auf meines 16x2 Display Shield zu testen?

Wenn Du einen Programm-Sketch hast, in dem per #include zusätzliche Library-Dateien eingebunden werden, z.B. mit Zeilen wie:

#include <Menu.h>
#include <MenuItem.h>

dann solltest Du als erstes mal die zugrundeliegende Library korrekt auf Deinem PC installieren.

Wenn Du eine Library neu installiert hast, dann testest Du danach am besten zuerst mal mindestens eines der zu dieser Library mitgelieferten Demoprogramme. Du findest das Demoprogramm zu einer Library im Menü der Arduino-Software unter:
"Datei - Beispiele - [Name der Library]"

Wenn Du so eines der zur Library gehörenden Demoprogramme einwandfrei zum Laufen bekommen hast, dann kannst Du es auch mit anderen Programmen versuchen, die dieselbe Library verwenden.

Ich seh diesen Eintrag gerade zum ersten Mal.

Wenn es um ein Menü geht, das im Flash liegt, könnt ihr auch meine Lib verwenden. (die ist aber nicht dynamisch)
Ich will hier nun auch nicht den Thread klauen. Im Sommer werde ich nochmal einen eigenen Thread starten in dem alle Änderungen gegenüber der LCDMenu2 Lib dokumentiert sind.

Ich bin im Moment noch dabei die LCDMenu2 Lib weiter anzupassen. Was bisher verändert wurde:

  • Strings liegen im Flash
  • Initialisierung vereinfacht
  • Den Aufruf von Funktionen die im Menü verwendet werden, vereinfacht
  • Fehler ausgebessert (Scrollen zum Elment -1 nach oben hin nicht mehr möglich, anpassungen an Arduino V 1.04
  • Ram Auslastung minimiert
  • Läuft unabhängig von LCDMenu2 Lib und Menu Lib
  • 128 Menupunkte Pro Ebene
  • Tiefe der Ebenen nicht begrenzt (nur durch Flash speicher)
  • jeder Menüpunkt ruft automatisch eine definierte Funktion auf
  • verschiedene Ansteuerungsmöglichkeiten (Seriell, Analog, oder mit LCDKeyShield)
  • Beispielprogramm vorhanden

To Do:

  • Weitere Vereinfachung der vorgegebenen Funktionen
  • eventuell einfachere Generierung der Menu Struktur

Das Beispiel das sich in der Lib befindet, besteht aus zwei Dateien:

  • Hauptdatei: Hier müssen die Defines sowie die Menüstruktur angepasst werden
    --- Die Menüstruktur wird mit _LCDMENU angelegt und in den Schritten weiter unten ergänzt
  • Zweite Datei: "MENU_FUNC" hier werden alle Funktionen abgelegt, die vom Menu aufgerufen werden können

Wenn ihr dazu Anmerkungen oder Verbesserungen habt, dann schickt mir eine PM /PN.

Mehr Informationen
Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )

Als ich nach Menüs gesucht hatte, habe ich auch diese getestet. Doch deine, Jomelo, hat mir bis jetzt am besten gefallen :smiley:
Ich kam mit dem Code nicht klar, deswegen für LCDMenu2 entschieden.

Hallo zusammen,

ich find die Lib richtig gut und habe versucht sie in mein Projekt einzubinden. Wenn ich sie kompiliere gibt es keine Fehler, auf dem Board (Arduino Mega mit 20*4 Display) gibt es keine saubere Anzeige. Es kommt nur in der obersten Zeile und in der dritten Zeile ein Haufen Minuszeichen.

Irgendwo muss ich ein BUG drin haben. Bitte helft mir den Fehler zu finden. Anbei mein Code.
Code Teil eins, rest im folgenden Beitrag

#include <LiquidCrystal.h>
#include <Menu.h>
#include <MenuItem.h>
#include <IRremote.h>                   // Bibliothek für IR-Empfänger

//**********************************************************************************************************************************************************
//************************************************************Variablen deklarieren*************************************************************************
//********************************************************************************************************************************************************** 

int readButton;                         // Variable to store the last pressed Button
int RECV_PIN = 10;                     // Eingang IR Reciever
int select;                             // Variable für MenüID von mymenu
String IrEingabe;                       // Variable für Decodierung der Fernbedienung in klare Tastenbezeichnungen
String IrRaw;                           // String von IR Empfang 
int STATUS_PIN = 13;                   // LED PIN (interne LED Mega)

// Create a Display object

LiquidCrystal lcd(52, 50, 48, 46, 44, 42); //Display inizialisieren (Welcher Port bekommt was)

//**********************************************************************************************************************************************************
//************************************************************Initiaalisierung IR***************************************************************************
//********************************************************************************************************************************************************** 
IRrecv irrecv(RECV_PIN);               //
IRsend irsend;                         //
decode_results results;                //

//**********************************************************************************************************************************************************
//************************************************************Menü initialisieren***************************************************************************
//********************************************************************************************************************************************************** 
// Create a Menu object (The frame you feed with MenuItems

Menu myMenu; 

// Create the MenuItems

//                Name                 Number   For    Back    up     down

  //Einträge Hauptebene
MenuItem item001("Filter-Setup",       001,     002,   001,    001,   001);
MenuItem item002("O2-Pumpe-Setup",     002,     003,   001,    001,   001);
MenuItem item003("Co2-Setup",          003,     004,   002,    001,   001);
MenuItem item004("Stroemung-Setup",    004,     005,   003,    001,   001);
MenuItem item005("Heizung-Setup",      005,     006,   004,    001,   001);
MenuItem item006("Tag-Licht 1-Setup",  006,     007,   005,    001,   001);
MenuItem item007("Tag-Licht 2-Setup",  007,     013,   006,    001,   001);
MenuItem item013("Nacht-Licht 1-Setup",013,     014,   007,    001,   001);
MenuItem item014("Supply 1 - Setup",   014,     010,   013,    001,   001);
MenuItem item010("Supply 2 - Setup",   010,     011,   014,    001,   001);
MenuItem item011("Einstellungen",      011,     012,   010,    001,   001);
MenuItem item012("Wartungs-Device-Sw.",012,     012,   011,    001,   001);

  // Einträge Ebene2-Filter
MenuItem item101("Filter-An-Zeit",     101,     101,   001,    102,   101);
MenuItem item102("Filter-Aus-Zeit",    102,     102,   001,    103,   101);
MenuItem item103("Permanent-AN-AUS",   103,     103,   001,    103,   102);

  // Einträge Ebene2-O2
MenuItem item201("O2-An-Zeit",         201,     201,   002,    202,   201);
MenuItem item202("O2-Aus-Zeit",        202,     202,   002,    203,   201);
MenuItem item203("O2-AN-AUS",          203,     203,   002,    203,   202);

  // Einträge Ebene2-Co2
MenuItem item301("Co2-An-Zeit",        301,     301,   003,    302,   301);
MenuItem item302("Co2-Aus-Zeit",       302,     302,   003,    303,   301);
MenuItem item303("Co2-AN-AUS",         303,     303,   003,    303,   302);

  // Einträge Ebene2-Strömung

MenuItem item401("Stroemung-An-Zeit",  401,     401,   004,    402,   401);
MenuItem item402("Stroemung-Aus-Zeit", 402,     402,   004,    403,   401);
MenuItem item403("Stroemung-AN-AUS",   403,     403,   004,    403,   402);

  // Einträge Ebene2-Heizung
MenuItem item501("Heizung-Tag-An",     501,     501,   005,    502,   501);
MenuItem item502("Heizung-Tag-Aus",    502,     502,   005,    503,   501);
MenuItem item503("Heizung-Tag-Temp",   503,     503,   005,    504,   502);
MenuItem item504("Heizung-Tag-An",     504,     504,   005,    505,   503);
MenuItem item505("Heizung-Tag-Aus",    505,     505,   005,    506,   504);
MenuItem item506("Heizung-Nacht-Temp", 506,     506,   005,    506,   505);

  // Einträge Ebene2-Licht1
MenuItem item601("Tag-Licht1-An",      601,     601,   006,    602,   601);
MenuItem item602("Tag-Licht-1Aus",     602,     602,   006,    603,   601);
MenuItem item603("TL 1-Start-Min",     603,     603,   006,    604,   602);
MenuItem item604("TL 1-Start-Max",     604,     604,   006,    605,   603);
MenuItem item605("TL 1-Start-DiT",     605,     604,   006,    606,   604);
MenuItem item606("TL 1-Stopp-Min",     606,     605,   006,    607,   605);
MenuItem item607("TL 1-Start-Max",     607,     604,   006,    608,   606);
MenuItem item608("TL 1-Start-DiT",     608,     604,   006,    608,   607);

  // Einträge Ebene2-Licht2

MenuItem item701("Tag-Licht1-An",      701,     701,   007,    702,   701);
MenuItem item702("Tag-Licht-1Aus",     702,     702,   007,    703,   701);
MenuItem item703("TL 1-Start-Min",     703,     703,   007,    704,   702);
MenuItem item704("TL 1-Start-Max",     704,     704,   007,    705,   703);
MenuItem item705("TL 1-Start-DiT",     705,     704,   007,    706,   704);
MenuItem item706("TL 1-Stopp-Min",     706,     705,   007,    707,   705);
MenuItem item707("TL 1-Start-Max",     707,     704,   007,    708,   706);
MenuItem item708("TL 1-Start-DiT",     708,     704,   007,    708,   707);

  // Einträge Ebene2-Nachtlicht
MenuItem item801("Tag-Licht1-An",      801,     801,   013,    802,   801);
MenuItem item802("Tag-Licht-1Aus",     802,     802,   013,    803,   801);
MenuItem item803("TL 1-Start-Min",     803,     803,   013,    804,   802);
MenuItem item804("TL 1-Start-Max",     804,     804,   013,    805,   803);
MenuItem item805("TL 1-Start-DiT",     805,     804,   013,    806,   804);
MenuItem item806("TL 1-Stopp-Min",     806,     805,   013,    807,   805);
MenuItem item807("TL 1-Start-Max",     807,     804,   013,    808,   806);
MenuItem item808("TL 1-Start-DiT",     808,     804,   013,    808,   807);

  // Einträge Ebene2-Dose1
MenuItem item901("Supply 1-An-Zeit",   901,     901,   014,    902,   901);
MenuItem item902("Supply 1-Aus-Zeit",  902,     902,   014,    903,   901);
MenuItem item903("Supply 1-AN-AUS",    903,     903,   014,    903,   902);

    // Einträge Ebene2-Dose1
MenuItem item1001("Supply 2-An-Zeit",   1001,    1001,  010,    1002,  1001);
MenuItem item1002("Supply 2-Aus-Zeit",  1002,    1002,  010,    1003,  1001);
MenuItem item1003("Supply 2-AN-AUS",    1003,    1003,  010,    1003,  1002);

    // Einträge Ebene2-Einstellungen
MenuItem item1101("Uhrzeit",            1101,    1101,  011,    1102,  1101);
MenuItem item1102("Datum",              1102,    1102,  011,    1103,  1101);

    // Einträge Ebene2-Wartung
MenuItem item1201("Filter-An-Aus",      1201,    1101,  012,    1202,  1201);
MenuItem item1202("O2-An-Aus",          1202,    1202,  012,    1203,  1201);
MenuItem item1203("Co2-An-Aus",         1203,    1203,  012,    1204,  1202);
MenuItem item1204("Stroemung-An-Aus",   1204,    1204,  012,    1205,  1203);
MenuItem item1205("Heizung-An-Aus",     1205,    1205,  012,    1206,  1204);
MenuItem item1206("Licht 1-An-Aus",     1206,    1206,  012,    1207,  1205);
MenuItem item1207("Licht 2-An-Aus",     1207,    1207,  012,    1208,  1206);
MenuItem item1208("Nachtlicht-An-Aus",  1208,    1208,  012,    1209,  1207);
MenuItem item1209("Supply1-An-Aus",     1209,    1209,  012,    1210,  1208);
MenuItem item1210("Supply2-An-Aus",     1210,    1210,  012,    1210,  1209);
 
//---------------------------------------------------------------------------------------------------------------------------------

 

Bitte helft mir.

Code Teil zwei

void setup()
{ pinMode(13, OUTPUT); // Set pinMode for Test LED
  Serial.begin(9600);                 // Startet serielle Schnittstelle für seriellen Monitor
  irrecv.enableIRIn();                // Start the receiver

  // Add the items to the menu
  myMenu.addItem(item001);
  myMenu.addItem(item101);
  myMenu.addItem(item102);
  myMenu.addItem(item103);  

  myMenu.addItem(item002);
  myMenu.addItem(item201);
  myMenu.addItem(item202);
  myMenu.addItem(item203);

  myMenu.addItem(item003);
  myMenu.addItem(item301);
  myMenu.addItem(item302);
  myMenu.addItem(item303); 

  myMenu.addItem(item403);
  myMenu.addItem(item401);
  myMenu.addItem(item402);
  myMenu.addItem(item403); 

  myMenu.addItem(item005);
  myMenu.addItem(item501);
  myMenu.addItem(item502);
  myMenu.addItem(item503); 
  myMenu.addItem(item504);
  myMenu.addItem(item505);
  myMenu.addItem(item506); 

  myMenu.addItem(item006);
  myMenu.addItem(item601);
  myMenu.addItem(item602);
  myMenu.addItem(item603); 
  myMenu.addItem(item604);
  myMenu.addItem(item605);
  myMenu.addItem(item606); 
  myMenu.addItem(item607);
  myMenu.addItem(item608); 
 
  myMenu.addItem(item007);
  myMenu.addItem(item701);
  myMenu.addItem(item702);
  myMenu.addItem(item703); 
  myMenu.addItem(item704);
  myMenu.addItem(item705);
  myMenu.addItem(item706); 
  myMenu.addItem(item707);
  myMenu.addItem(item708); 

  myMenu.addItem(item013);
  myMenu.addItem(item801);
  myMenu.addItem(item802);
  myMenu.addItem(item803); 
  myMenu.addItem(item804);
  myMenu.addItem(item805);
  myMenu.addItem(item806); 
  myMenu.addItem(item807);
  myMenu.addItem(item808); 

  myMenu.addItem(item014);
  myMenu.addItem(item901);
  myMenu.addItem(item902);
  myMenu.addItem(item903); 

  myMenu.addItem(item010);
  myMenu.addItem(item1001);
  myMenu.addItem(item1002);
  myMenu.addItem(item1003); 

  myMenu.addItem(item011);
  myMenu.addItem(item1101);
  myMenu.addItem(item1102);

  myMenu.addItem(item012);
  myMenu.addItem(item1201);
  myMenu.addItem(item1202);
  myMenu.addItem(item1203); 
  myMenu.addItem(item1204);
  myMenu.addItem(item1205);
  myMenu.addItem(item1206); 
  myMenu.addItem(item1207);
  myMenu.addItem(item1208); 
  myMenu.addItem(item1209);
  myMenu.addItem(item1210); 
  myMenu.begin(001); // Start at the Menu with at the MenuItem you want
  lcd.begin(20, 4);
  // Add the display to the menu
  myMenu.addLCD(&lcd);
}

//**********************************************************************************************************************************************************
//************************************************************IR-Receiver-Storrage-Routine******************************************************************
//**********************************************************************************************************************************************************
int codeType = -1;                   // The type of code
unsigned long codeValue;             // The code value if not raw
int codeLen;                        // The length of the code
 

//---------------------------------------------------------------------------------------------------------------------------------------------------

 

 

void loop()

{
  //IrAbfrage();
  MenuSelect();
}

//-------------------------------------------------------------------------------------------------------------------------------------------------- 
  //##############################Abfrage des IR-Controllers####################################
    void IrAbfrage()
    {
        if (irrecv.decode(&results)) 
      {
        digitalWrite(STATUS_PIN, HIGH);
        storeCode(&results);
        irrecv.resume(); // resume receiver
        digitalWrite(STATUS_PIN, LOW);
      }
    }
  
  //##################################IR-Code dekodieren########################################
    void storeCode(decode_results *results) // Stores the code for later playback
    {
      codeType = results->decode_type;
      int count = results->rawlen;
        if (codeType == RC5) 
        {
          //if (results->value != REPEAT) 
          //{
          Serial.println(results->value, HEX);
          IrRaw = String(results->value, HEX);
          codeValue = results->value;
          codeLen = results->bits;
          IrDekodieren();
          
            /* //Prüfen ob Hauptmenü oder Submenü aktiv
            if (HMenueaktiv == false && SMenuektiv != true)                      
            {Hauptmenuesteuerung();}
            else //if (SMenuektiv == true) 
            {Submenuesteuerung();}
            /*else if (S2Menueaktiv == true)
            {Sub2menuesteuerung();)
          //}*/
        } 
    }
 
//------------------------------------------------------------------------------------------------------

void ledTest()
{
  digitalWrite(13, HIGH);
  delay(3000);
  digitalWrite(13, LOW);
}

//---------------------------------------------------------------------------------------------------------------------------------------------------

void MenuSelect ()
{

    // Check if a button was press
  if(IrEingabe == "right"){myMenu.goForward();}
  if(IrEingabe == "up"){myMenu.goUp();}
  if(IrEingabe == "left"){myMenu.goDown();}
  if(IrEingabe == "left"){myMenu.goBack();}
  // Check if selectbutton was press
  if(IrEingabe == "select")
  {

    select = myMenu.select(); //use select() to check if the item you are at has a runable function

    

    switch(select)
    {
      case 033: //if found a funtion for a item run it
        ledTest();
        break;
     default: 
        break;
    }

  }

}

//----------------------------------------------------------------------------------------------------------------------------------------------------

void IrDekodieren ()
{
  if (IrRaw == "1" || "801") {IrEingabe = "Taste 1";}
  else if (IrRaw == "2" || "802") {IrEingabe = "Taste 2";}
  else if (IrRaw == "3" || "803") {IrEingabe = "Taste 3";}
  else if (IrRaw == "4" || "804") {IrEingabe = "Taste 4";}
  else if (IrRaw == "5" || "805") {IrEingabe = "Taste 5";}
  else if (IrRaw == "6" || "806") {IrEingabe = "Taste 6";}
  else if (IrRaw == "7" || "807") {IrEingabe = "Taste 7";}
  else if (IrRaw == "8" || "808") {IrEingabe = "Taste 8";}
  else if (IrRaw == "9" || "809") {IrEingabe = "Taste 9";}
  else if (IrRaw == "0" || "800") {IrEingabe = "Taste 10";}
  else if (IrRaw == "a" || "80a") {IrEingabe = "Taste 11";}
  else if (IrRaw == "3d" || "83d") {IrEingabe = "Taste 12";}          
  else if (IrRaw == "37" || "837") {IrEingabe = "hh minus";}           // Kontrast minus
  else if (IrRaw == "36" || "836") {IrEingabe = "hh plus";}            // Kontrast plus
  else if (IrRaw == "32" || "832") {IrEingabe = "mm minus";}           // Helligkeit plus
  else if (IrRaw == "34" || "834") {IrEingabe = "mm plus";}            // Helligkeit plus
  else if (IrRaw == "29" || "829") {IrEingabe = "left";}               // Rückspulen taste
  else if (IrRaw == "2b" || "82b") {IrEingabe = "right";}              // Vorspulen taste 
  else if (IrRaw == "2e" || "82e") {IrEingabe = "up";}                 // Pause Taste
  else if (IrRaw == "3f" || "83f") {IrEingabe = "down";}               // Stop
  else if (IrRaw == "3c" || "83c") {IrEingabe = "select";}             // play
  else if (IrRaw == "c" || "80c") {IrEingabe = "power";}               // Powertaste
  else if (IrRaw == "d" || "80d") {IrEingabe = "mute";}                // mute taste
  else if (IrRaw == "24" || "824") {IrEingabe = "I/II";}               // I/II Taste
  else if (IrRaw == "38" || "838") {IrEingabe = "TV";}                 // TV/VCR Taste
  else if (IrRaw == "f" || "80f") {IrEingabe = "Punkt";}               // Punkt Taste 
  else if (IrRaw == "10" || "810") {IrEingabe = "Vol+";}                 
  else if (IrRaw == "11" || "811") {IrEingabe = "Vol-";}              
  else if (IrRaw == "20" || "820") {IrEingabe = "Chan+";}             
  else if (IrRaw == "21" || "821") {IrEingabe = "Chan-";}               
}

Nimm die LCDMenu2 Lib von Jomelo. Ich hatte damals auch lauter komischer Zeichen auf dem Display.

Gibt's dazu irgendwo ein Tutorial ? Aus der Beschreibung oben klingt es so, als ob ich alle Prozeduren in einer zweiten Datei bearbeiten muss?

Unabhängig davon wäre es aber prima, wenn mir jemand sagen kann wo mein Fehler liegt. So komm ich dann in Zukunft auch besser weiter...lerneffekt.

Ich kann dir nicht so genau sagen wo der Fehler liegt, da ich die Lib nicht im Detail kenne.

Zu meiner Lib gibt es nur ein Beispiel, das sich mit in der Lib befindet und nach dem einbinden in das "libraries" und des neu Startens der Software unter "Datei->Beispiele->LCDMenuLib" geöffnet werden kann. In dem Beispiel ist alles beschrieben was beachtet werden muss.

Das Arbeiten mit zwei Dateien ist nicht kompliziert, da es in der Arduino Software durch zwei Tabs dargestellt wird. Diese dienen der Übersicht. Klar kann man auch alles in einer Datei ablegen, das ist aber unübersichtlich.

Ich werde am Wochenende ein Tutorial schreiben, aber die Inhalte aus dem Tutorial befinden sich auch alle im Beispiel das jetzt schon existiert.

Edit 1:
Die Datei der Lib mit der guten Beschreibung befindet sich am ende des ersten Beitrages in diesem Thread:
Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )

Das Tutorial wird darüber in den nächsten Tagen erscheinen