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

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

Hey,

danke für den Beitrag und danke für den Link. Hab mir gerade die Lib geladen. Ich habe sehen serielle oder Button Steuerung. Wie kann ich es realisieren eine IrFernbedienung ranzuhängen?
Wenn ich es richtig sehe muss ich nur die letzte if Schleife mit den Buttenstatusabfragen so modifizieren, dass z.B. statt eines analogRead Wertes mein Wert aus IrEingabe (Variable mit Fernbedinnungscodes wie beispielsweise RC:829) verglichen wird. Sehe ich das richtig?

Die Struktur wirkt auf den ersten Blick gut. Ich werde heute Abend gleich testen.

Du musst eine Button Funktion anpassen.

z.B.

void ButtonMode_serial()
{
  if(Serial.available()) 
  {
    if(CTR_timer(g_button_press_time, _BUTTON_press_time))
    {  
      switch(Serial.read())
      {
        case 'e':
           ButtonMode_help_enter();
        break;
        case 'w':
           ButtonMode_help_up();
        break;
        case 's':
           ButtonMode_help_down();
        break;
        case 'a':
           ButtonMode_help_left();
        break;
        case 'd':
          ButtonMode_help_right();
        break;      
        case 'q':      
          ButtonMode_help_quit();
        break;
        default:
        break;
      }
    }
  }
}

// oder die 
void ButtonMode_analog()
{
  ....
}
// falls du if abfragen benötigst

Zum einlesen des IR Signales benötigst du eine globale Variable die das Signal beinhaltet. Später dann einfach

//pseudocode (der ist so nicht lauffähig)
void ButtonMode_ir()
{
  if(g_ir_signal != NULL) 
  {
    if(CTR_timer(g_button_press_time, _BUTTON_press_time))
    {  
      if(g_ir_signal == "0011110100100101")
      { 
         ButtonMode_help_enter();
      }
      //...... 
      // mit den anderen Buttons genauso
       
      
    }
  }
}

Klasse erklärt, dass meinte ich genau so ... oft drücke ich mich ein bisschen wirr aus. Danke, dann versuch ich das heute Abend mal. Ich werde irgendwann die Nach berichten, oder dumme Fragen stellen.

Hallo zusammen,

ich glaub ich hab ein Brett vor dem Kopf ich bekommen bei meinem Code nur durch einfügen meiner IR-Receiver Abfragen einen völlig nichts sagenenden Fehlercode

Der Fehler lautet

LCDMenuLib:24: error: variable or field 'storeCode' declared void
LCDMenuLib:24: error: 'decode_results' was not declared in this scope
LCDMenuLib:24: error: 'results' was not declared in this scope
LCDMenuLib.ino: In function 'void IrAbfrage()':
LCDMenuLib:539: error: 'storeCode' was not declared in this scope

Ich habe keine Ahnung was hier schief läuft. Ich vermute, dass es im Hintergrund irgendwie mit der Lib aus dem Meü zu Kolisionen kommt. Beide Einzeln funktionieren wunderbar.

Bitte helft mir den Fehler zu finden.

Den Code hab ich zwecks 9500 Zeichengrenze als Zip im Anhang.

aqua4.zip (7.19 KB)

Hallo zusammen,

ich habe den Fehler meines letzten Posts gelöst. Nach einigem Suchen habe ich festgestellt, dass es sich allem Anschein nach um einen Fehler in der Deklaration der Prototypen beim Kompilieren handelt.
Ich habe dann in den Teil Prototypes folgende Zeile eingefügt. Dann lief es.

  void storeCode(decode_results *results);

Jetzt funktioniert mein Display mit den nachstehenden Code erstmal mit Menü und IR-Empfang.

void ButtonMode_analog()
{
  //uint16_t value = analogRead(_BUTTON_PIN); 
  
  if(CTR_timer(g_button_press_time, _BUTTON_press_time)) 
  {         
    //Select Button
    if(IrEingabe == "select") 
    {    
      ButtonMode_help_enter();        
    } 
    else if(IrEingabe == "up") 
    {
      ButtonMode_help_up();    
    } 
    else if(IrEingabe == "down") 
    {
      ButtonMode_help_down(); 
    } 
    else if(IrEingabe == "left") 
    {
      ButtonMode_help_left(); 
    } 
    else if(IrEingabe == "right") 
    {
       ButtonMode_help_right();
    }
    
    if(IrEingabe == "mute")
    {
      ButtonMode_help_quit();
    }
  }    
 }
 //##############################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) 
    {
      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();}
        } 
    }



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

void Abfrage()
{IrAbfrage();
delay(500);}

Die Herausforderung vor der ich jetzt stehe ist, dass bei jedem Klick auf meine Menütasten laut SerialMonitor nur einmal ein Befehl abgegeben wird, aber der Pfeil den Menübaum gleich vollständig durchscrollt. Es als wenn der Befehl endlos durchläuft.

Ich habe versucht Delays in die IR-Abfrage einzufügen, aber das ändert nichts. Es wird nur langsamer. Kann mir jemand einen Ansatz nennen, wie ich dies Phänomen nun noch eliminiere?

Eine idee wäre einen Status einzusetzen, nur hab ich noch keine Idee wo genau und wie genau.

Guten Morgen miteiander,

ich hab mein Problem gelöst. Der Fehler entstand, da keine Zeitbfrage mehr läuft wenn man mit der IR-Fernbedinung eingibt. Er erkennt einfach es ist einmal ein Signal gekommen und denkt es ist immer da. Damit ruft er immer wieder die Routinen zum letzten Signal (up, down und so weiter )auf.

Ich habe das ganze jetzt gefunden indem ich Step by Step mit dem Serial Monitor Statusmeldungen bei jeder Funktion ausgegeben habe, wenn Sie aktiviert wurde. Dabei fiel mir auf, dass es sich sofort um eine Endlosschleife handelte, sobald einmal die Fernbedienung aktiv war.

Die Lösung waren zwei Boolean und zwei If Schleifen. Ich habe zum als die Booleans im IR Eingangssignal eingebaut.

//Pseudocode
//...
// Funktion wird aufgeführt
 if (dstatus == false) {dstatus = true; lastdstatus = false;}
          else {dstatus = false; lastdstatus = true;}

Als nächstes habe ich die Prüfroutine eingebaut. Wenn einmal ausgelöst wurde, wird der lastdstatus dem status gleichgesetzt.

void loop()
{  
  Abfrage();
  if(g_function != 255)                                         //Überprüfen welche Funktion gerade läuft und gegebenfalls wieder aufrufen 
  {   
    LCDMenu_functions[obj_lcdmenulib.curfuncname]();            //Menüroutine starten
  }
    if (dstatus != lastdstatus)                                 //Prüfen, dass keine Endlosschleife der Fernbedienung
    {
    ButtonMode_analog();                                        //Eingaben ausführen 
    lastdstatus=dstatus;                                        // Status ändern    
  }   
}

Jetzt läuft es.

Ist doch schon super, einige Fehler findet man erst wenn man eine Nacht drüber schläft, oder eine längere Pause macht.

Ich hatte in einem Eintrag von dir weiter oben gesehen dass du ein delay(500); im Code hast. So etwas ist immer schlecht, da der Programmablauf dann für 500ms gestoppt wird und keine Hintergrundabläufe funktionieren.

Am besten könntest du so etwas ersetzen durch

// Globale Variable deklarieren am besten bei den anderen Timer Variablen 
unsigned long g_timer_2 = 0; 

// und dann der Code der alle 500 ms aufgerufen werden soll
if(CTR_timer(g_timer_2, 500)) {
  //hier dann der Code der nur alle 500 ms ausgeführt wird
}

Klappt das auch an der Stelle hier?

    String Uhrzeit =  String("Uhrzeit: ");
    // concatenating Time + Stunde + Minute
    if (hour() < 10)
       {Uhrzeit = Uhrzeit += "0"; 
        Uhrzeit = Uhrzeit += hour();}
      else
       {Uhrzeit = Uhrzeit += hour();}
    Uhrzeit = Uhrzeit += ":";
    if (minute() < 10)
       {Uhrzeit = Uhrzeit += "0";
        Uhrzeit = Uhrzeit += minute();}
      else
        {Uhrzeit = Uhrzeit + minute();}
    
    lcd.setCursor(0,1);
    lcd.print(Uhrzeit);

Ich will damit erreichen, dass die Uhrzeit nicht fortlaufend aktuallisiert wird, sondern wirklich nur alle 60 Sekunden aktullisiert wird auf dem Display. Der RTC läuft ja für die Alarme weiter

Hallo, also ich finde die Lib echt super jedoch würde ich die Eingabe lieber über die analog Eingänge meines Mega machen. Was müsste ich dafür ändern?