Arduino Forum

International => Deutsch => Topic started by: Jomelo on Sep 29, 2011, 01:36 pm

Title: Projekt: LCDMenuLib / LCDMenuLib2 ( LCDML ) - Menü mit mehreren Ebenen
Post by: Jomelo on Sep 29, 2011, 01:36 pm
Projekt: LCDMenuLib und LCDMenuLib2 (LCDML)

(https://github.com/Jomelo/LCDMenuLib2/blob/master/extras/img/20x4_3.jpg?raw=true)
Aktuellste Version
LCDMenuLib2 v1.1.0  Download (https://github.com/Jomelo/LCDMenuLib2/releases)

Alte Version
LCDMenuLib v2.3.4   Download (https://github.com/Jomelo/LCDMenuLib/releases) (keine neuen Updates mehr)

Einfache Installation über den Arduino Bibliotheksmanager möglich, einfach nach "LCDMenuLib" oder "LCDMenuLib2" suchen.

[Falls ihr Fragen habt, dass lest bitte nicht alle Seiten, nur die letzten 2 bis 5 Seiten sind interessant.]


Die Nachfolgende Beschreibung bezieht sich auf die LCDMenuLib2.

Beschreibung:
Mit der LCDMenuLib2 kann ein Menü mit mehreren Ebenen erstellt werden. Es können theoretisch maximal 254 Menüelemente angelegt werden, praktisch wird dies durch die Resourcen des Kontrollers begrenzt.
Die Menüelemente können in unterschiedlichen Ebenen angelegt werden, sodass sich grafisch eine Baumstruktur ergibt. Sprich es gibt einen Stamm, von dem verschiedene Äste (Sub Menüs) abgehen. Der Stamm des Menüs wird beim Anlegen der Lib generiert, alle Äste sind konfigurierbar.
Jedem Menüelement kann eine "Funktion", eine "Bedingung" zum Anzeigen, ein "Parameter" und spezielle Einstellungen zugewiesen werden. Diese Zuweisung werden dann je nach Einstellung abgearbeitet. Eine Funktion besteht aus einem Setup-Teil in dem Variablen initialisiert werden können. Das Setup wird beim schließen der Funktion zurückgesetzt und beim Öffnen erneut ausgeführt. Der Loop-Teil beinhaltet dann Ausgaben, die sich ständig ändern können. Der Close-Teil der Funktion wird immer dann aufgerufen, wenn die Funktion verlassen wird.
Der Inhalt einer Menüfunktion wird nur dann aktualisiert, wenn ein Aktion ausgeführt wird. Eine Aktion kann das Drucken eines Buttons sein oder aber ein Trigger der gesetzt wird. Trigger können auf eine feste Zeit konfiguriert werden, so dass die Menüfunktion in einem Intervall von XX Millisekunden aktualisiert wird.  In der Menüfunktion sollte wenn möglich nur der Inhalt für das Display stehen oder die Verarbeitung der Buttons stattfinden. Es sollte hier niemals die „delay(x)" Funktion verwendet werden.
Alle funktionell Abhängigen Funktion sind in Tabs thematisch getrennt.
Das Menü bietet möglichkeit einen Bildschirmschoner zu aktivieren. Dieser besteht aus einem Menüelement welches meistens versteckt angelegt wird.
Desweiteren kann nun in der LCDMenuLib2 eine Rollover funktion aktiviert werden. Hierbei springt der Kursor vom Ende zum Anfang oder umgekehrt insofern man versucht nach oben oder unten zu scrollen.  

Wichtiges vorweg:


1.1 Features




1.2 Bilder

(https://github.com/Jomelo/LCDMenuLib2/blob/master/extras/img/20x4_1.jpg?raw=true)

(https://github.com/Jomelo/LCDMenuLib2/blob/master/extras/img/20x4_2.jpg?raw=true)

(https://github.com/Jomelo/LCDMenuLib2/blob/master/extras/img/20x4_3.jpg?raw=true)

(https://github.com/Jomelo/LCDMenuLib2/blob/master/extras/img/20x4_4.jpg?raw=true)


Bilder ohne Display mit dem Menü in der Konsole

(https://github.com/Jomelo/LCDMenuLib2/blob/master/extras/img/console_1.png?raw=true)

(https://github.com/Jomelo/LCDMenuLib2/blob/master/extras/img/console_3.png?raw=true)

(https://github.com/Jomelo/LCDMenuLib2/blob/master/extras/img/console_2.png?raw=true)  


Bilder grafisches Display mit u8glib

(https://github.com/Jomelo/LCDMenuLib2/blob/master/extras/img/glcd_1.jpg?raw=true)

(https://github.com/Jomelo/LCDMenuLib2/blob/master/extras/img/glcd_2.jpg?raw=true)

(https://github.com/Jomelo/LCDMenuLib2/blob/master/extras/img/glcd_3.jpg?raw=true)

(https://github.com/Jomelo/LCDMenuLib2/blob/master/extras/img/glcd_4.jpg?raw=true)
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: Jomelo on Sep 29, 2011, 01:37 pm
Projekt: LCDMenuLib (LCDML) - Kapitel 2: Displayfunktionen
2.1 Inbetriebnahme des ersten Beispiels
Das Beispiel mit der Bezeichnung „LCDML_1_easy_01_first_test" soll zeigen wie ein einfaches Menü aussehen kann.
Vorweg kurz etwas zum Quellcode:
Alle Makros / Funktion die mit  LCDML_DISP_...  beginnen beziehen sich auf das Menü so wie die Funktionen die darin aufgerufen werden (Displaysystem). Alle weiteren Makros / Funktionen die mit LCDML_BACK_... anfangen beziehen sich auf Abläufe die im Hintergrundlaufen (Backendsystem)
Im Beispiel werden zuerst die benötigten Libraries eingebunden. Die Libs die benötigten werden hängen von der verwendeten Schnittstelle ab. Z.B. wird bei I2C noch die Wire.h benötigt, dazu später aber mehr.
Code: [Select]

// include libs
#include <LiquidCrystal.h>
#include <LCDMenuLib.h>

Nach den Libraries werden die Konstanten für das Menü angelegt. Beim oben genannten Beispiel sollte hier alles so belassen werden wie es ist. Später kann hier der Initscreen (Standby Screen) aktiviert werden oder die Buttonpresstime (für Buttons) eingestellt werden. Mit der Button Press Time werden die Buttons entprellt.
Nach der Lib Konfiguration werden die Einstellungen vom Display gesetzt. Es müssen die Reihen (row) und Spalten (cols) angegeben werden und die PINs an denen das Display angeschlossen ist. Falls ein Display verwendet wird, beidem die im Beispiel vorhandenen Konstanten nicht passen bitte in Kapitel 2.4 „Schnittstellen mit externen Libs" weiterlesen.
Das Beispiel „LCDML_1_easy_01_first_test" lässt sich der Einfachheit nur über die serielle Schnittstelle  bedienen.
Folgende Tasten haben eine Bedeutung im Menü:
e = Enter (In eine Ebene wechseln)
q = Quit   (Geht aus einer Ebene heraus)
u = Up      (Navigation nach oben im Menü)
d = Down (Navigation nach unten im Menü)
Die folgenden Tasten können aber auch in Funktionen verwendet werden:
e = Enter (Benutzerdefiniert  z.B. etwas setzen oder bestätigen)
q = Quit   (verlässt die Funktion und kehrt ins Menü zurück)
u = Up      (Benutzerdefiniert)
d = Down (Benutzerdefiniert)
l = Left      (Benutzerdefiniert)
r = Right   (Benutzerdefiniert)
Um das Menü mit Buttons oder Encodern steuern zu können ist das Kapitel 2.3 „Steuerungsmöglichkeiten" empfehlenswert.
Als nächstes wird im Beispiel das Menü angelegt. _LCDML_DISP_cnt  bekommt die ID des letzten Menüelementes, sprich dieser Wert wird gesetzt wenn man weiß wie das Menü aussieht. Wird dieser Wert zu groß gewählt entstehen Fehlermeldungen. Wenn der Wert zu klein ist wird nicht das volle Menü angezeigt.
Code: [Select]

#define _LCDML_DISP_cnt    11 //ID des letzten Menü elementes

  

Danach wird mit der letzten Menü Element ID viele Variablen angelegt. Da dies nicht von Hand gemacht werden muss gibt es das Makro „LCDML_DISP_init(_LCDML_DISP_cnt);. Anschließend
wird die Menüstruktur aufgebaut. Für die ersten drei Elemente sieht das wie folgt aus:
Code: [Select]

// LCDMenuLib_element(id, group, prev_layer_element, new_element_num, lang_char_array, callback_function)
LCDML_DISP_add      (0  , _LCDML_G1  , LCDML_root        , 1  , "Information"        , LCDML_FUNC_information);
LCDML_DISP_add      (1  , _LCDML_G1  , LCDML_root        , 2  , "Time info"          , LCDML_FUNC_timer_info);
LCDML_DISP_add      (2  , _LCDML_G1  , LCDML_root        , 3  , "Settings"           , LCDML_FUNC);


Der erste Wert im Makro ist die ID. Diese musst fortlaufend mit Null beginnend hochgezählt werden.
Als zweiter Wert folgt die Gruppe. Die Menüelemtne können in Gruppen eingeteilt werden. Die Gruppen können dann ausgeblendet werden z.B. um Funktion erst anzuzeigen nach dem eine Identifikation erfolgt ist oder für Funktionserweiterungen die erst später freigegeben werden sollen. In diesem Beispiel haben alle Element im Menü die Gleiche Gruppe.
Als drittes wird die Ebene in der sich das Element befinden soll angegeben. Mit LCDML_root ist die Hauptebene gemeint. Mit dem vierten Parameter wird die Reihenfolge in der zuvor angegeben Ebene festgelegt. Eine neue Untereben kann nur angelegt werden wenn zuvor das darüber liegende Element angelegt wurde. Z.B.
Code: [Select]

LCDML_DISP_add      (3  , _LCDML_G1  , LCDML_root_3      , 1  , "Change value"       , LCDML_FUNC);

Der Name der Ebene in der das „sub" Element angelegt wird setzt sich aus der Hauptebene und der Position des Elementes für das Ein Sub Element erzeugt werden soll zusammen.
Als fünften Parameter wird der Name der im Display für das Menüelement angezeigt wird angegeben. Hierbei muss beachtet werden, dass der Name zwei Zeichen kürzer sein muss als die Spalte im Display breit ist. Die Länge ist so definiert, dass vor dem Menüelement der Cursor gesetzt werden kann und hinter dem Namen der Scrollbalken Platz finden kann. Also bei einem 16x2 Display maximal 14 Zeichen und bei einem 20x4 maximal 18 Zeichen.
Der letzte Parameter gibt die Callback Funktion an. Dies ist die Funktion die ausgeführt wird, sobald das Menüelement Aufgerufen wird. Es macht keinen Sinn auf Menüs, die noch SubEbenen besitzen eine Funktion zu legen, diese würde nie ausgeführt werden. Für die Elemente, bei denen keine Funktion aufgerufen werden soll muss die Dummy-Funktion  „LCDML_FUNC" eingetragen werden. Wenn ein Funktionsname im Menü eingetragen ist muss dazu auch eine Funktion existieren die aufgerufen werden kann, ansonsten entstehen Fehlermeldungen beim übersetzen
Nach dem Anlegen der Menüelemente wird mit dem Makro „LCDML_DISP_createMenu(_LCDML_DISP_cnt);" das Menü angelegt.

Als nächstes folgt die Definition des Backend. An dieser Stelle will ich hier noch nicht drauf eingehen. Dieser Teil sollte erstmal unbeachtet bleiben. Dazu mehr im Kapitel 3 „Backendsystem„.
Im Setup wird die für dieses Beispiele benötigte Serielle Schnittstelle initialisiert. Darauf folgend wird die Gruppe 1, in der sich alle oben angelegten Menüelemente befinden aktiviert, sodass diese sichtbar ist. Danach werden die oben automatisch angelegten Variablen mit dem Makro „LCDML_setup(_LCDML_BACK_cnt);" anhand der zuvor eingestellten Menükonfiguration initialisiert.
In der Loop Schleife befindet sich nur die LCDML_run(_LCDML_priority);  Funktion, diese kümmert sich um den Aufruf der Funktion die im Backendsystem laufen. Dazu auch später mehr.
Das Beispiel beinhaltet drei Menüelemnte bei denen Funktionen hinterlegt sind:
LCDML_FUNC_information
Zeigt einfach nur eine Information an
LCDML_FUNC_timer_info
lässt einen Timer runter zählen
LCDML_FUNC_p2
Hier muss etwas mit Button gemacht werden
Um den Aufbau und das Anlegen von Menüfunktionen geht's im nächsten Beitrag.

Download (https://github.com/Jomelo/LCDMenuLib/releases)
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: Yeahuno on Sep 29, 2011, 02:26 pm
läuft mit ein paar Veränderungen  :D DANKE !!!!

Quote
// Einstellungen für das verwendete LCD (20x4)  
 #define _LCD_cols                          16
 #define _LCD_rows                          2

// Pin Belegung für das LCD
 #define _LCD_PIN_rs                        12
 #define _LCD_PIN_e                         11
 #define _LCD_PIN_dat4                      5
 #define _LCD_PIN_dat5                      4
 #define _LCD_PIN_dat6                      3
 #define _LCD_PIN_dat7                      2
 
// Der Button mode gibt an wie die Tastatur (Tastenfeld) angeschlossen werden sollen
// 0 = Keine Buttons verwenden (Steuerung über Serialmonitor)
//     (w = up, a = left, s = down, d = right, q = back, e = enter)
//    

// Der Button mode gibt an wie die Tastatur (Tastenfeld) angeschlossen werden sollen
// 0 = Keine Buttons verwenden (Steuerung über Serialmonitor)
//     (w = up, a = left, s = down, d = right, q = back, e = enter)
//     
// 1 = Einen Eingang und Auswertung über Bereiche
// 2 = Für jeden Button einen Eingang
  #define _BUTTON_MODE                       0



Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: kurti on Sep 29, 2011, 03:04 pm
Hallo Jomelo,
allerherzlichsten Dank für die Projektvorstellung.

Gruss
Kurti
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: helix1 on Mar 19, 2012, 06:18 pm
Hallo,

"WProgram.h" muss durch "arduino.h" ersetzt werden. Habe lange gesucht bevor ich als Neuling herausgefunden habe.
Gruss
helix1
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: Jomelo on Oct 15, 2012, 10:28 am
Update:
- Ich habe die Library auch für die Arduino Version 1.0.1 brauchbar gemacht.
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: michael_x on Oct 15, 2012, 12:11 pm
Super, Jomelo.

Eine Frage zum Verständnis:
Du erzeugst Objekte vom Typ Menu, arbeitest aber meist mit den char* auf deren Texte. Hat das einen Grund ?
Falls der gleiche Text in verschiedenen Menu Objekten (z.B. auf verschiedenen Ebenen oder in verschiedenen Zweigen) auftaucht, bist du sicher, dass die zwei #define Anweisungen zwei unterschiedliche char* adressieren?

Code: [Select]
#define _LANG_MENU_setting1_2                     "Einstellungen"
#define _LANG_MENU_setting3_2                     "Einstellungen"

Menu Item1_2    (_LANG_MENU_setting1_2);
Menu Item3_2    (_LANG_MENU_setting3_2);

char * tmp =  _LANG_MENU_setting1_2;  // z.B.

if (tmp  == _LANG_MENU_setting3_2 ) {
// eine sicher nicht gewollte eventuelle Optimierung des Compilers
// wenn man hier landet
}





Für Uno (oder noch kleinere Arduinos), oder wenn der Arduino neben der Menu System Bedienung nebenbei noch möglichst viele dynamische Daten zwischenspeichern soll und/oder einen ganzen SD card block im RAM halten soll, oder ...,

... wäre es noch superer, wenn die konstanten Menü-Texte aus dem Flash genommen würden ...

Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: Jomelo on Oct 15, 2012, 01:27 pm
Du erzeugst Objekte vom Typ Menu, arbeitest aber meist mit den char* auf deren Texte. Hat das einen Grund ?
Ich habe das damals so gewählt, da ich dann die einzelnen Menü Ebenen mir über die Serielle Schnittstelle auch direkt ausgeben lassen konnte.
Außerdem war es zum damaligen Zeitpunkt leichter texte miteinander zu vergleichen (vom Verständnis her).

Falls der gleiche Text in verschiedenen Menu Objekten (z.B. auf verschiedenen Ebenen oder in verschiedenen Zweigen) auftaucht, bist du sicher, dass die zwei #define Anweisungen zwei unterschiedliche char* adressieren?
So wie in deinem Beispiel funktioniert der Aufruf nicht. Ich nutze dazu einen array in dem jeweils der Name der nächst höheren Ebene steht. "funcname"

Beispiel:
Code: [Select]

#define _LANG_MENU_setting1_2                     "Einstellungen"
#define _LANG_MENU_setting3_2                     "Einstellungen"

Menu Item1_2    (_LANG_MENU_setting1_2);
Menu Item3_2    (_LANG_MENU_setting3_2);

char * tmp =  _LANG_MENU_setting1_2;  // z.B.

void BACK_SelectMenuFunction(void)
  {
    char *tmp;
      // Selbsthaltung der ausführenden Funktion falls gesetzt
      // HIER NICHTS ÄNDERN
      if(func_loop_name != NULL) {
        tmp = func_loop_name;
      } else {
        tmp = lcd_display.curfuncname;
      }         
       
      // AB HIER KÖNNEN ÄNDERUNGEN GEMACHT WERDEN
     
      //Nur Menupunkte die Ausgeführt werden können sollten hier drin stehen
      if(tmp == _LANG_MENU_setting1_2 && lcd_display.funcname[1] == "Ebene 1")
      {
               
      }
      else if(tmp == _LANG_MENU_setting3_2 && lcd_display.funcname[2] == "Ebene 2")
      {
               
      }

Die Bezeichnungen der Ebene stimmen zwar in dem Beispiel nicht, aber das Prinzip sollte deutlich werden.
Und zur Adressverwaltung vermute ich, dass die Inhalte nicht an der gleichen Stelle liegen, da sie auch in unterschiedlichen Objekten angelegt werden.

Die Erweiterung mit dem Flashspeicher ist eine gute Idee. Damit werde ich mich mal beschäftigen. Für mein damaliges Projekt reichte der Ram aus.


Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: offtopic on Nov 06, 2012, 03:32 pm
Hallo Jomelo,
erstamals Vielen Dank für deine tolle Arbeit :)
Bei mir zeigt es leider keine Pfeile nach oben und nach unten, nur die Ziffern 0 (Pfeil nach oben?) und 1 (Pfeil nach unten?),
habe schon versucht was zu machen, aber als Anfänger komme ich nicht weiter =(
Ist es auch möglich dass, erstmal zB. Datum und Zeit angezeigt werden und erst beim OK drücken spring es ins Menü?
Grüße
Jurek
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: Jomelo on Nov 06, 2012, 05:43 pm
Hi,

das die Pfeile nicht angezeigt werden, liegt vermutlich am verwendeten Display oder aber daran, dass schon zuviele Benutzerdefinierte Zeichen für das Display belegt sind.

Du kannst das Display im Programm immer löschen und für eigene Zwecke verwenden.
Sobald du "lcd_display.display(); "  aufrufst, sollte das Menü wieder erscheinen.

Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: offtopic on Nov 07, 2012, 04:45 pm
Hi,
leider komme ich nicht weiter...
Wenn ich über lcd.write() im loop die Pfeile anzeige funktioniert das, aber im Programm selbst nicht.
Ich habe ein UNO R3 und ein LCD Keypad shield von DFRobot. Mein IDE ist 1.0.1
Code: https://www.dropbox.com/s/ebh4pj9ou12608a/Kirys_menu.txt (https://www.dropbox.com/s/ebh4pj9ou12608a/Kirys_menu.txt)
An welche Stelle muss ich in meinem Beispiel die display_RTC() setzen?
Wenn ich das in loop mache überlappen sich der Zeit und das Menü  :~
Bitte um Hilfe
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: offtopic on Nov 13, 2012, 04:19 pm
Hallo,
gute Nachrichten  :)
dank den Tipp von Jamelo ist mir gelungen die Pfeile anzuzeigen.
Folgendes habe ich verändert:
in der Datei LCDMenu2.cpp
Zeilen von 199 bis 210, print auf write und die HEX weg
Code: [Select]

            if(curloc == 0) {
                lcd->setCursor((cols-1),(rows-1));
                lcd->write(arrow_down);
            }
            else if(curloc == j) {
                lcd->setCursor((cols-1),0);
                lcd->write(arrow_up);
            }
            else {
                lcd->setCursor((cols-1),0);
                lcd->write(arrow_up);

                lcd->setCursor((cols-1),(rows-1));
                lcd->write(arrow_down);

und in void setup()
Code: [Select]

lcd.createChar(0,arrow_up);
lcd.createChar(1,arrow_down);   


und dann funktioniert zumindest bei mir  ;)
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: offtopic on Nov 21, 2012, 04:35 pm
Ich verzweifle langsam, was ist an dem Code falsch :(
es funktionier einfach nicht
Code: [Select]

/* ===============================================
* SET DATE
* ===============================================
*/
void set_Date(char *func_name)
  {
    //CONTROL_refresh_button();
    t = rtc.getTime(); // Get data from the DS1307
    int tag, monat, jahr, pos;
    if (!CONTROL_set_func_active(func_name))
    {
      pos=0;
      tag=t.date;
      monat=t.mon;
      jahr=t.year;
      Serial.print(tag);
      Serial.print(monat);
      Serial.print(jahr);
      lcd.clear();
      lcd.setCursor(3,0);
      lcd.write("Set   date");
      lcd.setCursor(3,1);
      if (tag<10){lcd.print("0");}
      lcd.print(tag);
      lcd.write(".");
      if (monat<10){lcd.print("0");}
      lcd.print(monat);
      lcd.write(".");
      lcd.print(jahr);
    }
    if (menu_button_down == 1 && pos==0) //set tag-
      {
        if ((tag>1) && (tag<=31))
          {
            Serial.print(tag);
            Serial.print(" down ");
            delay(250);
            tag--;
            Serial.print(tag);
            menu_button_down=0;
            if (tag<10) {lcd.setCursor(3,1);lcd.print("0");lcd.print(tag);}
            else {lcd.setCursor(3,1);lcd.print(tag);}
            lcd.setCursor(3,1);
            lcd.blink();
          }
      }
    if (menu_button_up == 1 && pos==0)  //set tag+
      {
        if ((tag<31) && (tag>=1))
          {
            Serial.print(tag);
            Serial.print(" up ");
            delay(250);
            tag++;
            Serial.print(tag);
            menu_button_up=0;
            if (tag<10) {lcd.setCursor(3,1);lcd.print("0");lcd.print(tag);}
            else {lcd.setCursor(3,1);lcd.print(tag);}
            lcd.setCursor(3,1);
            lcd.blink();
          }
      }
    if (menu_button_up == 1 && pos==1)  //set monat+
      {
        if ((monat<12) && (monat>=1))
          {
            Serial.print(monat);
            Serial.print(" up ");
            delay(250);
            monat++;
            Serial.print(monat);
            menu_button_up=0;
            if (monat<10) {lcd.setCursor(6,1);lcd.print("0");lcd.print(monat);}
            else {lcd.setCursor(6,1);lcd.print(monat);}
            lcd.setCursor(6,1);
            lcd.blink();
          }
      }
    if (menu_button_down == 1 && pos==1)  //set monat-
      {
        if ((monat<=12) && (monat>1))
          {
            Serial.print(monat);
            Serial.print(" down ");
            delay(250);
            monat--;
            Serial.print(monat);
            menu_button_down=0;
            if (monat<10) {lcd.setCursor(6,1);lcd.print("0");lcd.print(monat);}
            else {lcd.setCursor(6,1);lcd.print(monat);}
            lcd.setCursor(6,1);
            lcd.blink();
          }
      }
    if (menu_button_up == 1 && pos==2)  //set jahr+
      {
        if (jahr<2100 && jahr>=2000)
          {
            Serial.print(jahr);
            Serial.print(" up ");
            delay(250);
            jahr++;
            Serial.print(jahr);
            menu_button_up=0;
            lcd.setCursor(9,1);
            lcd.blink();
            lcd.print(jahr);
          }
      }
    if (menu_button_down == 1 && pos==2)  //set jahr-
      {
        if ((jahr<=2100) && (jahr>2000))
          {
            Serial.print(jahr);
            Serial.print(" down ");
            delay(250);
            jahr--;
            Serial.print(jahr);
            menu_button_down=0;
            lcd.setCursor(6,1);
            lcd.blink();
            lcd.print(jahr);
          }
      }
    if (menu_button_right == 1)
    {
      pos++;
      if (pos>3)
      {
        pos=0;
      }
    }
    // CONTROL_func_end (direct, enter, up, down, left, right)
    CONTROL_set_func_end(0, 1, 0, 0, 0, 0);
  }
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: Jomelo on Nov 21, 2012, 06:23 pm
Was funktioniert denn genau nicht, und was hast du vor ?
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: offtopic on Nov 21, 2012, 09:15 pm
Es soll über LCD Display und  Keypad Shield Tasten das Datum einstellen.
Es fehlt noch am ende der Befehl
Code: [Select]

rtc.setDate(tag, monat, jahr);

ich wollte, sätzen des Datums mit enter bestätigen und auch beenden.
Wie etwa:
Code: [Select]

if (menu_button_enter == 1)
{
rtc.setDate(tag, monat, jahr);
CONTROL_set_func_end(0, 1, 0, 0, 0, 0);
}

Leider wenn ich diese Code ausführe passiert nichts, es werden keine tasten erfasst (außer back)
dafür habe ich mir die Ereignise im Serial anzeigen lassen. Es wird nichts angezeigt :(
Variable "pos" sagt ob ein Tag, Monat oder Jahr zu stellen ist (0 - Tag, 1 - Monat, 2 - Jahr) und dort soll auch der Blinkcursor stehen.
Tasten nach oben und nach unten sollen den jeweiligen Wert ändern.
Der Hauptcode kommt von deinem Beispiel, ich habe nur das Menü (läuft Prima) und die ausführende Funktionen verändert.
Gruß
offtopic
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: Jomelo on Nov 21, 2012, 11:26 pm
Solange ich nicht den ganzen Code sehen kann, kann ich nur Tipps geben.

Mikrocontroller haben die Eigenschaft schnell zu sein, da ich in deinem Code viele Delays (die Stoppen das Programm) sehen kann, vermute ich als erstes das es daran liegt.
Solange ein Delay aktive ist, wird kein Button erkannt. Es könnte nun sein, dass du im falschen Moment druckst, oder es kann sein das ein anderer Fehler vorliegt. Bitte poste mal den ganzen Code oder lad ihn irgendwo hoch.
Gruß
Jomelo
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: offtopic on Nov 22, 2012, 08:46 am
Hallo,
anbei der Code:
https://www.dropbox.com/s/k9ptqho9zbs2xpl/Kirys_menu1.txt (https://www.dropbox.com/s/k9ptqho9zbs2xpl/Kirys_menu1.txt)
Ich wollte auch den gleichen Code (nach Modifikationen) fürs Zeit einstellen verwenden.
Gruß
offtopic
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: offtopic on Nov 23, 2012, 10:47 pm
Fehler gefunden :)
das ist in void setup() gewandert:
Code: [Select]
t = rtc.getTime(); // Get data from the DS1307
dzien=t.date;
miesiac=t.mon;
rok=t.year;

und dzien, miesiac, rok sind jetzt globale Variable
Funktionscode ohne Fehler:
http://pastebin.com/aBd0b5GA (http://pastebin.com/aBd0b5GA)
Gruß
offtopic
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: skorpi080 on Mar 01, 2013, 09:14 pm
Wie kann man es denn hier mit umlaute benutzen?
Ich benutze im moment dieses hier:
Quote

void lcdPrint(char* buf)
{
  for(byte i=0;i<strlen(buf);i++)
  {
    switch (buf)
    {
    case 0xC2:
    case 0xC3:
    case 0xCE:
    case 0xCF: break; // filtering UTF-8 highbyte 
    case 'ä': lcd.print('\xE1');break; // translate UTF-8 lowbyte
    case 'ö': lcd.print('\xEF');break; // translate UTF-8 lowbyte
    case 'ü': lcd.print('\xF5');break; // translate UTF-8 lowbyte
    case '?': lcd.print('\xE0');break; // alpha
    case 'ß': lcd.print('\xE2');break; // beta, sz
    case 'µ': lcd.print('\xE4');break; // micro
    case '°': lcd.print('\xDF');break; // degree symbol
    case '?': lcd.print('\xF4');break; // omega
    case '?': lcd.print('\xE5');break; // sigma
    case '?': lcd.print('\xF6');break; // Sigma
    default: lcd.print(buf);
    }
  } 
}


Aber beim #define ist ja nix mit lcdprint
Title: Re: Projektvorstellung: LCDMenu2 Lib zur Generierung von Menüs mit mehreren Ebenen
Post by: jurs on Mar 02, 2013, 10:37 am

Aber beim #define ist ja nix mit lcdprint


Wenn Deine print-Befehle für das LCD-Display in einer Library stecken statt in Deinem Sketch, dann mußt Du meine Umwandlungsroutine natürlich erstmal in Deine Library einbauen, bevor Du sie aufrufen kannst.

Title: Re: LCDMenuLib zur Generierung von Menüs mit mehreren Ebenen
Post by: Jomelo on Apr 13, 2013, 12:49 pm
Hi, ich habe mal dieses Thema auf den neusten Stand gebracht.
Die Lib wurde aktualisiert und das Tutorial angepasst.

Mehr Informationen gibt es im ersten Beitrag:
http://arduino.cc/forum/index.php/topic,73816.0.html
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Rtdler on Apr 14, 2013, 09:45 am
Hallo,

erstmal danke für dieses gelugene Projekt. Ich konnte damit als Anfänger ein sehr komplexes Menü mit sauberer Steuerung und IR-Fernbedienung in wenigen Stunden realisieren. Die Steuerung und die Menüfunktionen als solches habe ich jetzt fertig.
Nuin stehe ich vor der Frage wo und wie ich permanent laufende Hintergrundprozesse integriere.

Ich bin dabei eine recht komplexe Steuerungseinheit aufzubauen. Dazu arbeite ich mit einer RTC und verschiedenen Alarmen. Prinzipiell sind es eine Vielzahl von Zeitschaltuhren, welche einen Schaltkreis grundsätzlich aktiven. Dazu kommen nach der Aktivierung verschiedene Prüfparameter durch Sensoren. Wenn alle Bedingungen erfüllt sind wird der jeweilige Pin HIGH oder ein PWM startet.

Die ganzen kleinen Subfunktionen werde einfach im Funktionsbereich als Subfunktionen aufbauen. Aber wo und wie integriere ich die Funktion die im Hintergrund immer läuft, sobald der Controller, sprich der Arduino, aktiv ist.

EDIT:
Ich glaube ich kann im loop auch Funktionen aus Menu_Func direkt aufrufen. Wenn dem so ist hab ich mein Problem gelöst. 

Danke vorab.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Apr 14, 2013, 09:55 am
Vermutlich in der Loop Funktion, ich bastel gleich mal ein Beispiel wie das dann aussehen könnte.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Rtdler on Apr 14, 2013, 12:13 pm
Ein kleinen Verbesseungsvorschlag:

Das Preogramm merkt nicht, wenn ich verschiedene Funktion am gleichen Eintrag habe. Wenn ich in der Itemdefinition zu Item 1 Funktion a und zum gleichen Item in der Funktionsobjektauflistung Funktion b hinschreibe wirds übersehen.

VG
Torsten
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Apr 14, 2013, 03:56 pm
Hi,

das kann das Programm auch nicht feststellen, daher muss man ja die Auflistung immer anpassen. Man müsste den Compiler anpassen um so einen Fehler abfangen zu können, das geht aber viel zu tief und ist keine Lösung.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: bekas on May 17, 2013, 10:10 am
Hallo,
ich bin wirklich begeistert von diesem Menü, vielen vielen Dank.
Nur habe ich noch ein Problem:
Ich möchte längere Texte anzeigen (über mehrere Zeilen), und brauche dafür also eine Scrollfunktion (nach unten). Natürlich könnte ich jede Zeile als eigenen Menüpunkt nehmen aber das wäre wohl nicht der richtige Weg. Außerdem würden die Pfeile in der ersten Spalte stören.
Wie kann ich eine solche Scrollfunktion realisieren?
Danke im Voraus
bekas
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on May 17, 2013, 08:14 pm
Das funktioniert genauso wie eine normale Scroll Funktion auf dem Display.
Da ich so etwas bisher noch nicht gebraucht habe, existiert dafür keine fertige Funktion.
Du könntest aber mit  if(CTR_check_button()) {
und   if(g_button_up > 0) {  und  if(g_button_down > 0) {  die Scroll Funktion steuern.

Vielleicht gibt es hier ja irgendwo schon eine Lib im Forum die sich mit dem Scrollen durch längere Texte beschäftigt.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Jun 18, 2013, 09:03 am
Hi, ich habe an der Lib gestern ein Update durchgeführt

Neu
Code: [Select]

//0 = kein Scrollbalken
//1 = komplexer Scrollbalken (neu)
//2 = alter einfacher Scrollbalken
#define _LCDMenuLib_cfg_scrollbar 1


Änderungen


Falls durch die vielen Änderungen Fehler entstanden sind, dann meldet diese bitte hier!
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: LutzB on Jul 19, 2013, 11:01 pm
Hallo zusammen!

Zuerst einmal einen riesen Danke für die Lib!
Ich konnte soweit mein Menü aufbauen wie ich mir das Vorgestellt habe. Leider komme ich jetzt nicht weiter.
Ich möchte eine Variable x vergrößern/verkleinern mit dem Up/Down Button.
Wenn ich jetzt aber den Up-Button drücke erhöht sich x nicht einmalig um +5 sondern kontinuierlich immer wieder um +5.
Wie kann ich das ändern?

Hier mein Codeausschnitt der Funktion:

Code: [Select]

void FUNC_startTL(void)
{
 /* --------- INIT ---------
  * Initialisierung dieser Funktion
  * wird nur einmal beim Start dieser Funktion ausgefuert
  * danach nur erneut, wenn die Menu Funktion verlassen wurde
  * wenn keine Variablen initialisiert werden müssen, kann diese
  * Funktion anstatt mit if(!CTR_init()) ....     mit
  * CTR_init();  aufgerufen werden    
  */
 if(!LCDML.FuncInit())
 {        
   /* Hier wird das Display einmalig gelöscht und Text
    * ausgegeben, der sich nicht ändert
    * Außerdem wird hier eine Variable mit dem Wert 10
    * initialisiert
    */
   lcd.clear();
   lcd.setCursor(1,0);
   lcd.print("TL Bel. Zeit");            
 }

 /* --------- LOOP ----------*/
 {
   lcd.setCursor(1,1);
   lcd.print(x);
   lcd.setCursor(5,1);
   lcd.print("SEKUNDEN");
   if (LCDML. g_button_up) {    
   x = x + 5;
   }
   else {
   }
   if (LCDML. g_button_down) {    
   x = x  5;
   }
   else {
   }
 }    

 /* --------- STOP  ---------      
  * CTR_func_end (direct, enter, up, down, left, right)
  * Fall in dieser Funktion keine Variablen zurückgesetzt werden
  * müssen, kann diese Funktion auch vereinfacht mit CTR_end(0, 1, 1, 1, 1, 1);
  * aufgerufen werden. Die Endbedingungen müssen durch die Zahlen >0 vorgegeben
  * werden
  * Wenn alles 0 ist, hängt das gesammte Programm in dieser Funktion fest
  *
  * In diesem Fall wird die Stop Funktion nur abgefragt, wenn die Bedingung
  * davor erfüllt ist
  */
 if(LCDML.g_button_back)
 {
   if(LCDML.FuncEnd(1, 0, 0, 0, 0, 0))
   {
     /* Falls noch Variablen zurückgesetzt werden müssen, bevor diese Funktion
      * verlassen wird, kann dies in dieser If Schleife geschehen
      */
   }
 }    
}


Danke schonmal für die Hilfe!

Gruß Lutz
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Jul 20, 2013, 04:14 pm
Hi,
du musst den Inhalt vom Button zurücksetzen nachdem du abgefragt hast, ob er gedrückt wurde.

Code: [Select]

LCDML. g_button_up = 0;


Besser könntest du es aber noch so machen, dass die Funktion nur aktualisiert wird, wenn ein Button betätigt wurde.

Code: [Select]

//....
/* --------- LOOP ----------*/
 

  if(LCDML.checkButtons()){
    lcd.setCursor(1,1);
    lcd.print(x);
    lcd.setCursor(5,1);
    lcd.print("SEKUNDEN");
    if (LCDML. g_button_up) {     
      if(x < dein_maximal_wert) {
        x += 5;
        LCDML. g_button_up = 0;
      }
    }
    else {
    }
    if (LCDML. g_button_down) {     
      if(x > dein_minimal_Wert) {
        x -= 5;
        LCDML. g_button_down = 0;
      }
    }
    else {
    }
  }


Du musst nur dein_minimal_wert und dein_maximal_wert noch einsetzen.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Gelegenheitsbastler on Aug 01, 2013, 04:15 pm
Ich habe die Datei entpackt und in das Library Verzeichnis kopiert. Danach Arduino 1.05 neu gestartet und das Beispiel aufgerufen. Beim Kompilieren erscheint folgender Fehler:

Code: [Select]
In Datei, eingefügt von a_menu_with_function.ino:16:
......./arduino-1.0.5/libraries/LCDMenuLib/LCDMenuLib.h:23:21: Fehler: arduino.h: Datei oder Verzeichnis nicht gefunden


Wie kann ich das Problem beheben?

Frank

Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 01, 2013, 04:24 pm
Habe auch 1.0.5 aufm Mac und funzt einwandfrei.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Gelegenheitsbastler on Aug 01, 2013, 05:36 pm
Es freut mich, dass es bei dir läuft. Nur leider hilft mir das nicht weiter.

Ich habe das Problem etwas unkonventionell gelöst. Ich habe das Verzeichnis, in dem IDE installiert ist, durchsucht und die Arduino.h gefunden. Diese habe ich in den Library-Ordner LCDMenuLib kopiert. Der Fehler blieb. Da ich Linux (Ubuntu) nutze, habe ich testweise aus Arduino.h ein arduino.h gemacht und siehe da - jetzt ist der Fehler weg.

@Jomelo: Kann es sein, dass du das mit Windows geschrieben hast? Windows ist es (glaube ich) egal, ob der Dateiname groß- oder kleingeschrieben ist. Sollte es das sein, könntest du vielleicht den Verweis auf die Arduino.h korrigieren?

Frank
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 01, 2013, 05:40 pm
Code: [Select]
//# Include
//# =======================
#include "arduino.h"
#include <avr/pgmspace.h>
#include <../LiquidCrystal/LiquidCrystal.h>


In der LCDMenu.h groß schreiben und funzt dann auch
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 01, 2013, 05:55 pm
Hi,
danke für den Hinweis ich werde das am Wochenende, spätestens Anfang nächster Woche beheben. Bisher bin ich davon ausgegangen das die Arduino Dateien alle klein geschrieben werden. Das die Arduino.h in wirklichkeit groß geschrieben wird, naja wer kann das schon ahnen ;-)

Ich habe die Lib nur unter Windows getestet.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 01, 2013, 05:59 pm
Macht nix Jomelo, ist verzeihlich :D
hast da was feines aufgebaut
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Gelegenheitsbastler on Aug 01, 2013, 06:17 pm

Ich habe die Lib nur unter Windows getestet.


Na da habe ich mit meiner Vermutung ja gar nicht so falsch gelegen ;)

Ich versuche mich grad an deinem Beispiel. Leider bekomme ich das nicht hin. Ich habe meine Displays beide per I²C angeschlossen. In meinem (funktionsfähigen) Sketch (zum Projekt: siehe Signatur) steht dazu folgendes:

Code: [Select]

// I²C Display

#define BACKLIGHT_PIN  7
#define En_pin  4
#define Rw_pin  5
#define Rs_pin  6
#define D4_pin  0
#define D5_pin  1
#define D6_pin  2
#define D7_pin  3
#define  LED_OFF  0
#define  LED_ON  1

#include <LCD.h>
#include <LiquidCrystal_I2C.h>

//Pins zuordnen
LiquidCrystal_I2C  lcd0(0x20,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
LiquidCrystal_I2C  lcd1(0x27,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

void setup() {

lcd0.begin (20,4);                                  // LCD0 Größe angeben
lcd0.setBacklightPin(BACKLIGHT_PIN,NEGATIVE);
lcd0.setBacklight(LED_ON);

lcd1.begin (20,4);                                  // LCD1 Größe angeben
lcd1.setBacklightPin(BACKLIGHT_PIN,NEGATIVE);
lcd1.setBacklight(LED_ON);
.
.
.
}

void loop() {
  lcd0.home();
  lcd0.backlight();  //Backlight ON if under program control
  lcd1.home();
  lcd1.backlight();  //Backlight ON if under program control



Ich hoffe ich habe beim kopieren jetzt alles erwischt, was zu den Displays gehört. Nun habe ich versucht, das in dein Beispiel zu kopieren und die entsprechenden Teile in deinem Beispiel zu ersetzen. Nur leider war das bisher erfolglos. Das liegt sicherlich an meinen nicht vorhandenen Programmierkenntnissen :(

Könntest du mir zeigen, wie ich das richtig machen muss?

Frank
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 02, 2013, 12:27 am
Hi,
im Moment ist die Lib nur für die normale Verwendung geeignet, also noch nicht für I2C.

Ich könnte am Sonntag gegen Abend die Lib auf die LiquidCrystal_I2C Lib umschreiben / anpassen, so dass beide Versionen möglich sind.
Da ich hier kein I2C Display habe müsste jemand von euch die Lib dann testen. Wenn du damit einverstanden bist, das dein LCD Menü am Wochenende noch nicht laufen wird, können wir das gerne machen.

Gruß
Nils
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Gelegenheitsbastler on Aug 02, 2013, 06:07 am
Guten Morgen!

Das ist überhaupt kein Problem. Das Projekt wird sich noch über Monate hinziehen, da kommt es auf ein paar Tage nicht an. Die notwendigen Tests mache ich gerne. Ist ja nicht ganz uneigennützig ;) Du kannst mir die Sachen per PN oder E-Mail schicken.

Frank

Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 04, 2013, 03:38 pm
Wer Lust hat, kann die I2C Version testen.
Vorraussetzung ist die LiquidCrystal_I2C  Lib.

Da ich selber kein I2C Display besitze, bitte ich euch um einen Status Bericht.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: zikke on Aug 06, 2013, 09:45 pm
ich habe mal dein Demo Projekt mit meinem I2C testeb wollen, aber:

sketch_aug06a:121: error: invalid conversion from 'int' to 't_backlighPol'
sketch_aug06a:121: error: initializing argument 3 of 'LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, t_backlighPol)'

eine Idee?
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 07, 2013, 08:00 am
Hi zikke,
kannst du mir ein paar mehr Informationen geben:
- Welche Arduino Version ?
- Welche LiquidCrystal_I2C Version ?
- Wie sieht der Code aus der diesen Fehler verursacht ?
- Hast du Versucht das Beispiel zu kompilieren ?

Der Fehler könnte darauf hinweisen das t_backlightPol falsch definiert ist. Wo kommt das her ?
Code: [Select]

LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, t_backlighPol)


Laut dem Header von LiquidCrystal_I2C darf nichts das mit dem Backlight zu tun hat übergeben werden:
Code: [Select]

LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows);


Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Gelegenheitsbastler on Aug 07, 2013, 07:53 pm
Hallo,

meine Fehlermeldung sah genau so aus.  Ich nutze die 1.0.5 mit deinem Beispiel. Der Fehler erscheint beim Kompilieren.

Anbei die von mir verwendete Lib.

Frank
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: zikke on Aug 07, 2013, 08:57 pm
Arduino ist die neueste und das ganze kommt beim compile deines Beispiels. Ich häng die Lib mal dran.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 07, 2013, 11:54 pm
Hä ?
Wer ist nun wer hier  und von wem kommt welche Datei ?
Die beiden Dateien beinhalten den gleichen Inhalt und haben nichts mit der LiquidCrystal_I2C Lib zu tun !?!

Wenn ihr mir eine PN schickt, dann schreibt nicht den gleichen Inhalt nochmal in diesen Thread, das bringt nur Verwirrung. (Bezogen auf die letzten zwei Einträge)

Ich kann nur mit der offizellen Lib arbeiten, ein Support/Hilfestellung für andere Libs, bei denen nicht einmal die Quelle genannt werden kann, kann ich nicht umsetzten.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 10, 2013, 12:04 am
Hallo zusammen,

ich habe gerade die LCDMenuLib ausprobiert. Das Beispiel funktioniert auch hervorragend, aber wie baue ich das Menu in ein eigenes viel größeres Projekt ein. Ich nutze in meinem Code bereits die LiquidCrystal Library extensiv. Leider bindet das Menu diese erneut ein und ich kann die LCDMenuLib so nicht verwenden.
Ist es zudem überhaupt möglich auf bereits vordefinierte Button-Objekte zuzugreifen? Das scheint ja alles schon sehr ineinander verwoben zu sein. Offensichtlich hätte man gleich mit der LCDMenuLib als Basis anfangen müssen. Sie später einfach als zusätzliche Menüfunktion für Konfigurationen zu implementieren scheint nicht mehr möglich... oder verstehe ich da was falsch.

Beste Grüße,
Jan
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 10, 2013, 12:08 am
Du siehst es genau richtig, ohne weiteres gehts nicht und macht auch kein sinn 2 Menüs zu haben.
Quote
Offensichtlich hätte man gleich mit der LCDMenuLib als Basis anfangen müssen.

Es lohnt sich aber umzubauen
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 10, 2013, 12:32 am
Hallo skorpi08,

Hmmm... hätte ich mal eher drauf stoßen müssen, da ich aber meinen bisherigen Code relativ modular gehalten habe sollte die Migration vielleicht doch kein allzu-großes Problem sein. Aber wie stelle ich es denn an, das mir das Menü erst nach einem Tastendruck angezeigt wird? Das Beispiel schmeißt einen ja direkt ins Menu sobald man das Board eingeschaltet hat. Ich bräuchte sowas wie einen 00-Menu Layer der immer angezeigt wird und erst nach dem drücken einer Taste soll das Menü aufgehen.
Mit bestem Dank im Vorraus. Ich fange dann jetzt mal das umbauen meines Codes an ;)


Beste Grüße,
Jan
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 10, 2013, 01:17 am
Man kann sich ein Menü namens INFO machen. Da hat man dann alles was angezeigt werden soll.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 11, 2013, 07:21 pm
Hallo zusammen,


wenn ich am Ende meiner Setup Routine folgenden Befehl schreibe:

LCDML.goMenu(Item_1);

würde ich erwarten das ich (vom Beispielprogram der LCDMenuLib ausgehend) im ersten Menüpunkt lande, d.h. die  "FUNC_information(void)" ausgeführt wird. Das passiert aber nicht. Statt dessen wird mir die Menüstruktur angezeigt.
Wie nutze ich den o.g. Befehl korrekt um direkt zu einem Menü (bzw. Unterpunkt) zu springen?

Beste Grüße,
Jan

Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 11, 2013, 08:02 pm
Hi,
ich habe die Diskussion hier aus dem Urlaub fleißig verfolgt, konnte von dort aber nicht antworten  :0

Du kannst im Menü wandern mit 
Code: [Select]

LCDML.Button_enter();   // eine Ebene tiefer
LCDML.Button_up();       //eine Ebene nach oben
LCDML.Button_down();   // Scrollen nach unten
LCDML.Button_left();     // Scrollen nach unten
LCDML.Button_right();
LCDML.Button_quit();


Um den ersten Button zu betätigen einfach LCDML.Button_enter();  ausführen und das Menü landet in der ersten Funktion.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 11, 2013, 08:09 pm
Ich denke es war so gemeint....

Im Setup steht LCDML.goMenu(INFO MENÜ); und ich erwarte dass der auch zum INFO MENÜ geht wenn der Arduino Strom bekommt
Wenn keine Tasten innerhalb von 5 sec gedrückt werden, soll der LCDML.goMenu(INFO MENÜ); ausführen.

Hatte mich damit noch nicht beschäftigt aber interessieren würde es
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 11, 2013, 08:35 pm
goMenu ist eher eine Interne Funktion die immer ausgeführt wird wenn  "Button Enter" betätigt wird. Ich bastel im Moment an der Lib rum, sodass diese auch mit I2C und mit der Ansteuerung über schiebe Register kompatible wird. Ich könnte auch eine Funktion einbinden mit der man direkt in einen Menu Punkt springen kann. Im Moment würde ich aber die Methode der Steuerung über die Button Funktionen wählen. Diese Funktionen können auch direkt hintereinander aufgerufen werden, so dass ein Sprung in einen anderen Punkt erfolgt.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 11, 2013, 08:38 pm
Jou, schieberegister hört sich 1A an!
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 11, 2013, 08:53 pm
Die aktuellste Version der LiquidCrystal Lib unterstützt Schieberegister bereits. Link: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads

Ich wollte die Lib so umschreiben, das diese mit all den neuen Schnittstellen kompatible ist.

An den Bezeichnungen der bisherigen Funktionen ändert sich nichts, sodass eine Abwärtskompatibilität gegeben ist. Gibt es noch wünsche für neue Funktionen
z.B: "Jump to Funktion xxx" ?
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 11, 2013, 09:13 pm
SimpleThread, Schieberegister, Jump to Funktion (nach 5 sec INFO anzeigen falls keine Taste gedrückt)

Sonst wüsste ich nichts, was mit einem Menü zu tun hat.
Wenn ne Zeitschaltuhr und OneWire (DS18B20) mit onboard wäre, hätt ich nix dagegen  ;)
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 11, 2013, 10:19 pm
Halo zusammen,

hmmm... witziger weise kann ich mit der Funktion

LCDML.goMenu(Item_4);

direkt in den Programmpunkt springen, d.h. da funktioniert diese Funktion exakt wie ich mir das vorgestellt habe, auch wenn sie nicht dafür gedacht war. Wenn eine zukünftige Version der Library das direkte hineinspringen in einen Memüpunkt unterstüzen würde fänd ich das Super.

Ich frage mich allerdings gerade ob ich die Bibliothek nicht vielleicht immernoch falsch verwende.
Folgendes will ich erreichen.

Zunächst wird das Arduino gestartet, eine Setuproutine wird ausgeführt während bereits Plausibilitätsprüfungen für angeschlossene Sensoren laufen. Während Dieser Zeit wird dem Nutzer bereits eine Anzeige auf dem Display präsentiert (Wartebalken) damit er weiß das im Hintergrund bereits gearbeitet wird.
Das LCD -Display soll nach dem abarbeiten des Setup permanent Messwerte anzeigen.
Drückt der User eine Taste (Enter bzw. Select) wird das Menü geöffnet und man kann Einstellungen an Umrechnungsfaktoren, LCD-Kontrast- und Helligkeitseinstellungen vornehmen und der Gleichen. Längeres Drücken der Menütaste lässt wieder die Messwerte auf dem Display erscheinen und verlässt das Menü.

Nun habe ich meine Messwertanzeige in eine Level 0 Menüfunktion integriert, und kann diese auch anzeigen lassen, nur direkt dothin springen kann ich nicht (nachdem die Setup-Routine fertig ist). Die Steuerung über die Buttons finde ich sehr umständlich, obwohl das wahrscheinlich funktioniert.

Wie baut ihr denn eure UI`s mit der LCDMenuLib auf? Zeigt ihr permanent das Menü an, und der User muss dann in den jeweiligen Unterpunkt wechseln? Auch wenn dieser Unterpunkt die Hauptfunktion des Gerätes beinhaltet (also z.B. anzeigen einer Uhrzeit oder eben Messwerte)?


Beste Grüße,
Jan
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 11, 2013, 10:25 pm
Ich nochmal,

mir ist gerade noch etwas anderes aufgefallen. Ich habe unabhängig von der LCDMenuLib einen "Custom Character" erstellt. Dummerweise wird dieser jetzt immer über dem, bzw. als unterer Teil des Scrollbalkens angezeigt. ich muss daher gerade davon ausgehen das die Anzahl zusätzlich definierbarer Charaktere erschöpft ist. Kann ich das irgendwie umgehen, oder muss ich einfach damit leben und ggf. den Scrollbalken im Menü abschallten?

Gruß,
Jan
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 11, 2013, 10:31 pm
Hi, in der LCDMenuLib befindet sich ein Config File (LCDMenuLib_config.h). Mit dem kannst du den Scrollbalken auf eine kleinere Version die nur zwei neue Zeichen verwendet minimieren, oder ganz deaktivieren.

Versuch mal den Wert auf "2" zu ändern, ich denke das löst dein Problem.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 11, 2013, 10:51 pm
Hallo Jomelo,

das behebt den Fehler leider nicht. Mein "Custom Charcter" erscheint jetzt nur an anderer Stelle im "Scrollbalken". Ausserdem ist der Scrollbalken bei meinem 16x2 Display auf Position 14. D.h. rechts neben dem "Pfeil nach unten" ist noch ein Zeichen frei. Dieses würde ich natürlich auch gerne nutzen. Wieviele "Custom Characters" implementiert denn die LCDMenuLib bisher? Wo kann ich die aufgelistet finden?

Vielen Dank und beste Grüße,
Jan
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 11, 2013, 11:02 pm
Hallo,

ich hab die "Custom Characters" gefunden. Aber warum "verbrätst" Du denn für den einfachen Scrollbalken 2 Characters? In jedem HD44780 kompatiblen Display sind bereits Pfeile für hoch und runter integriert.

Pfeil hoch

lcd.write(B00011000)

Pfeil runter

lcd.write(B00011001)

Hier das Datenblatt: https://www.adafruit.com/datasheets/HD44780.pdf

Soweit ich weiss implementieren sogar alle Derivate des HD44780 den selben Datensatz.
---------------------------------------------------------------------------------------------------
Nachtrag:
Hab meinen Fehler bzgl. der zusätzlich implementierten Symbole gefunden:

Scrollbalken Option 1 (die schönere Version) benutzt 5 (gezählt wird ab 0) zusätzliche custom characters, d.h. eigene Custom Characters können erst ab Byte 5 beginnen.

Scrollbalken Option 2 (die einfache Version) benutzt 2 zusätzliche Charactere (wobei dies, wie ich oben schon erwähnt unnötig ist), d.h. eigene Custom Characters können erst ab Byte 2 beginnen.

Im Allgemeinen können HD44780 basierte Displays 8 Custom Charaters speichern.

Beste Grüße,
Jan
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 11, 2013, 11:33 pm
Hi,
ich habe das gerade nochmal mit den Pfeilen nachgeschaut.
[edit]
Der normale  HD44780 Standard hat die Pfeile nicht. Der HD44780U Standard ergänzt die Pfeile. Die Displays die ich hier im Moment liegen haben nutzen noch den alten Standard, daher kann ich die Pfeile so nicht entfernen. Ich könnte in der nächsten Version den Standard im Config-File auswählbar bereitstellen. Als "default" bleibt dann die alte Variante eingebunden, die läuft auf jedem Display.
[/edit]

Den Bug, der die Pfeile nicht am ende der Zeile anzeigt habe ich nun behoben. Dieser ist bei einer Umstellung in der letzten Version leider eingefügt worden. Ich denke das ich gegen Ende nächster Woche eine neue Version bereitstellen kann.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Serenifly on Aug 11, 2013, 11:43 pm
@jabami
Viele - wenn nicht sogar die meisten - Displays die man hier zu kaufen bekommt haben aus irgendeinem Grund den japanischen A00 Zeichensatz
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 12, 2013, 12:05 am
Hallo Jomelo,

Super dank Dir.

Kleiner Tip. Da Du ja eh schon eine Scrollbalken Config hast könntest Du noch eine 3. Konfiguration hinzufügen welche die Symbole

Pfeil hoch
lcd.write(B00011110)

Pfeil runter
lcd.write(B00011111)

nutzt. Ggf. zusammen mit dem vollen Symbol

lcd.write(B11111111)

macht das dann wahrscheinlich auch eine ganz nette Scrollbalkenalternative die keine Custom Characters verwendet.
------------------------------------------------------------------------------------------------------
Nachtrag:
@Jomelo: Ich hab eben erst gesehen was Du meinst. Zuvor dachte ich immer die Tabelle wird einfach auf der nächsten Seite weiter geführt, aber Du hast recht, es handelt sich offensichtlich um 2 verschiedene Versionen des HD44780. Daher klappt die oben genannte Idee von mir mit der 3. alternativen Konfiguration wahrscheinlich nicht. Die Pfeile nicht zu entfernen ist daher wirklich die beste Idee um eine möglichst hohe Kompatibilität zu gewährleisten. Sorry, das war mir vorher nicht aufgefallen.
------------------------------------------------------------------------------------------------------
Achso und weil wir grad dabei sind, wäre es möglich einen zusätzlich zu konfigurierenden Splash-Screen zu implementieren? Quasi eine Anzeige die einem Level 00 entspricht und nicht im Menü (als separater Eintrag) auftaucht. Der Splash Screen wäre der erste Screen nach dem Setup, und könnte wenn man im Menü ist (Level 0) über den Back Button erreicht werden. Über die Konfiguration ließe sich die Verwendung dieses Splash-Screens an und aussschalten. Die Funktionen für den Splash Screen könnten weiterhin in der separaten Datei (Menu_functions -> aus dem Beispiel) programmiert werden. Das fänd ich ne tolle Sache.

@Serenifly: Ja eben, weil sie den gesamten Zeichensatz des Hitachi (jap. Firma) HD44780 Controllers implementieren. Siehe hierzu auch das zuvor verlinkte Datenblatt. In diesem Controller sind bereits sehr viele Zeichen vorinstalliert die man mit einem entsprechendenm Befehl ansprechen kann. Mit der LiquidCrystal library z.B. so:

lcd.write(B[upperByte][lowerByte])

[upperByte] und [lowerByte] muss man nur noch durch die entsprechenden Bitfolgen aus der Tabelle 4 des verlinkten Datenblattes ersetzen. Somit hat man schonmal eine recht gute Auswahl an Zeichen. Nur leider eben nicht alle. Siehe Scrollbalkensymbole von Jomelo bzw. einige mathematische Symbole.


Grüße,
Jan


Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 12, 2013, 12:16 am
Das mit den einfachen Pfeilen und dem HD44780U habe ich bereits ergänzt. Ich denk zum Scrollbalken mit mehreren CustomChars wird mir auch noch was einfallen.
Den Splash Screen kann ich installieren, wobei diesen könnte man nun auch umsetzen in dem die Funktion die als _setup gekennzeichnet ist, einfach etwas später einmalig aufgerufen wird.
Edit:
Oder direkt in eine Funktion springt, von der man dann mit Zurück wieder ins Menü kommt.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Serenifly on Aug 12, 2013, 12:24 am
Ich weiß wie das funktioniert :)

Ich hätte sagen soll "NUR den japanischen Zeichensatz". Die von dir erwähnten Pfeile sind nur im A02 Zeichensatz (der die ganzen Sonderzeichen und kyrillischen Buchstaben hat). Die Displays haben jeweils einen der Sätze, aber nicht beide. Wenn du eines mit dem europäischen Zeichensatz hast, sehr schön, aber das ist nicht immer der Fall. Was man so lesen kann, haben die meisten Leute nur den begrenzteren japanischen Zeichensatz.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 12, 2013, 12:32 am

Das mit den einfachen Pfeilen und dem HD44780U habe ich bereits ergänzt. Ich denk zum Scrollbalken mit mehreren CustomChars wird mir auch noch was einfallen.
Den Splash Screen kann ich installieren, wobei diesen könnte man nun auch umsetzen in dem die Funktion die als _setup gekennzeichnet ist, einfach etwas später einmalig aufgerufen wird.
Edit:
Oder direkt in eine Funktion springt, von der man dann mit Zurück wieder ins Menü kommt.


Das letzte hab ich jetzt nicht so richtig verstanden. Wie meinst Du das? Der Splash-Screen soll ja nicht nur einmalig ausgeführt werden, sondern eben genau immer dann wenn das Menü nicht genutzt wird, da das Menü ja nur für Einstellungen und Konfigurationen genutzt werden soll.
Wieso sollte die Funktion etwas "später" und warum nur "einmalig" ausgeführt werden?

@Serenifly: Sorry, diesen Fehler von mir hatte ich soeben beim nochmaligen anschauen des Datenblattes auch bemerkt. Ich dachte immer die Zeichentabellen im Datenblatt würden zusammen gehören. Tun sie aber nicht. Ich hatte Dich da in Deinem vorhergehenden Post definitiv missverstanden.  :smiley-red:
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Sijjim on Aug 12, 2013, 08:24 am
Moin,

Nutze die Lib auch seit ein paar Tagen, funktioniert annähernd perfekt.
Aber wenn wir schon bei "Wünsch dir was" sind.... wie wäre es, wenn man in der Config vorgeben kann, welches Item als erstes nach dem Start angezeigt wird? Am besten sogar ob den Menüeintrag oder die Funktion dahinter. Glaube zwar, das ihr das mit dem Splash-Screen meint, sicher war ich mir aber nicht, oder redet ihr auch aneinander vorbei?!  :P

Trotzdem, danke an den Lib-Ersteller, tolles Teil was du hier gezaubert hast.
Grüße
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 12, 2013, 10:40 am
Hallo Sijjim,

ich meinte exakt das Gleiche. Bis auf vielleicht den kleinen Unterschied, das der Splash-Screen keinen Eintrag im Menü selbst hätte. Den Splash-Screen würde man erreichen, wenn man das Menü "verlässt" , soll heissen wenn man in der Menüanzeige des Level 0 den back-button betätigt.

Gruss,
Jan
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 12, 2013, 06:27 pm
Hi Sijjim & jabami,

ich habe beide Funktionen getrennt voneinander umgesetzt. Ich habe die Lib unten angehängt. Im Moment ist es noch eine Beta, da ich bis zur nächsten Version noch I2C einbinden will.
Testet beide bitte die Beta Lib. Ihr könnt euren alten Code 1 zu 1 weiter verwenden. Die Änderungen sind abwärts kompatibel

@jabami
Füge mal in dem Tab in dem auch die anderen FUNC_ ... Funktionen liegen folgenden Code ein:
Code: [Select]

void FUNC_splash_screen(void)
{
 lcd.clear();

 // der weitere Code
}

Die Funktion kann mit "Quit/Back" aufgerufen werden, wenn das Menü in Ebene 0 ist. Das Beenden geht mit allen anderen Tasten außer Back/Quit. Es kann auch jeder Zeit aus jedem Menü Punkt der Screen direkt aktiviert werden mit:
Code: [Select]

LCDML.splashScreen = 1;

Um die Funktion zu deaktivieren muss einfach die Funktion "FUNC_splash_screen" gelöscht werden. Diese wird intern als Dummy mir leeren Inhalt angelegt und je nach Anwendung vom Benutzer überschrieben.


@Sijjim
Du musst dich damit abfinden, dass man im Moment noch mit der Element Nummer arbeiten muss. Leider kann man noch nicht direkt den Funktionsnamen übergeben.
Es ist aber möglich aus in jede ausführbare Funktion zu springen. Am Beispiel kann man das testen in dem man folgenden Code verwendet:
Code: [Select]

void setup()
{
 /* Setup for LcdMenuLib */
 
 LCDMenuLib_setup(_LCDMenuLib_cnt);
 //Serial.begin(9600);

 LCDML.jumpToElement(11); // Dreimal nach links drucken  
}

Anstatt 11 kann man auch zu 0 oder 1 springen. Ich experimentier noch, wie sich das umsetzen lässt mit  LCDML.jumpToElement(FUNC_p2). Ich denke zur nächsten Version wird das klappen.

Ansonsten kam mir noch die Idee, dass der Splash-Screen angezeigt wird, nachdem X Sekunden, z.B: 60  keine Aktivität ausgeführt wurde.



Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 12, 2013, 06:39 pm

Ansonsten kam mir noch die Idee, dass der Splash-Screen angezeigt wird, nachdem X Sekunden, z.B: 60  keine Aktivität ausgeführt wurde.



Dass wollt ich haben
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 12, 2013, 07:26 pm
Hallo Jomelo,

vielen herzlichen Dank für diese unglaublich schnelle Umsetzung. Es funktioniert soweit auch alles, nur das ich in meiner "FUNC_splash_screen" keine loops verwenden kann. Hier mein derzeitigr Code:
Code: [Select]

/* ==========================
* SPLASH-Screen
*
* Beschreibung:
* Diese Funktion zeigt die darzustellenden
* Messwerte an.
* ========================= */
 void FUNC_splash_screen(void)
 {  
   /* --------- INIT ---------
    * Initialisierung dieser Funktion
    * wird nur einmal beim Start dieser Funktion ausgefuert
    * danach nur erneut, wenn die Menu Funktion verlassen wurde
    * wenn keine Variablen initialisiert werden müssen, kann diese
    * Funktion anstatt mit if(!CTR_init()) ....     mit
    * CTR_init();  aufgerufen werden    
    */  
   if(!LCDML.FuncInit())
   {
     /* Init Function */            
     // Static Display 1st Row for m_dot
     lcd.clear();                   // Clear the LCD Display
     lcd.setCursor(0,0);            // set Cursor to initial position 1st Row
     lcd.print("m");            // print custom character 5 "dotted_m"
     lcd.print(" :");               //
     lcd.setCursor(12,0);           // set Cursor to position 12 in 1st Row
     lcd.print("kg/s");             //
     // Static Display 2nd Row for T
     lcd.setCursor(0,1);            // set Cursor to initial position 1st Row
     lcd.print("T :");              //
     lcd.setCursor(12,1);           // set Cursor to position 12 in 1st Row
     lcd.print('\xDF');             // print custom character 6 "°"
     lcd.print("C");                //    
   }
   /* --------- LOOP ----------
    * Hier sollte der Code stehen der ständig neu geladen wird
    * z.B. eine Uhrzeit oder änliches.
    */
    lcd.setCursor(3,0);            // set Cursor to position 3 in 1st Row
    lcd.print(millis()/1000);      // display seconds elapsed since power-up
    lcd.setCursor(3,1);            // set Cursor to position 3 in 1st Row
    lcd.print(millis()/1000);      // display seconds elapsed since power-up  
   
   /* --------- STOP  ---------      
    * CTR_func_end (direct, enter, up, down, left, right)
    * Fall in dieser Funktion keine Variablen zurückgesetzt werden
    * müssen, kann diese Funktion auch vereinfacht mit CTR_end(0, 1, 1, 1, 1, 1);
    * aufgerufen werden. Die Endbedingungen müssen durch die Zahlen >0 vorgegeben
    * werden
    * Wenn alles 0 ist, hängt das gesammte Programm in dieser Funktion fest
    */
   if(LCDML.FuncEnd(0, 1, 0, 0, 0, 0))
   {
     /* Falls noch Variablen zurückgesetzt werden müssen, bevor diese Funktion
      * verlassen wird, kann dies in dieser If Schleife geschehen
      */
   }    
 }


Und ich hätte noch eine Frage zur Verwendung der Functions generell. Wie kann ich eine globale Variable an eine Funktion übergeben? Ich wollte einen Konfigurationspunkt für die Hintergrundbeleuchtung hinzufügen und bin daran gescheitert, da ich meine Variablen für den anzusprechenden Pin und den Helligkeitswert nicht in die Funktion bekommen habe.

Beste Grüße,
Jan
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 12, 2013, 07:33 pm
Ok, die Splash Funktion ist anders aufgebaut wie die anderen Funktionen, die Init und End Funktion haben dort keine Wirkung.

Wenn du diese nicht verwendest läuft die Funktion auch in der Loop. Ich werde das mal noch anpassen ;-)
Um die Initialisierung muss man sich im Moment noch per Hand kümmern.

Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 12, 2013, 07:38 pm
Code: [Select]

in void setup()

brightness_index = 6;


Code: [Select]
//LCD Hintergrundbeleuchtung
  #define _PIN_BACKLIGHT 10
  unsigned char brightness_levels[7] = { 0, 20, 50, 90, 130, 190, 255 };
  unsigned char brightness_index;
 


Code: [Select]
 
/* ===================================================================================================
* SET BACKLIGHT
* ===================================================================================================
*/
 void  FUNC_helligkeit(void)
 {
   if(!LCDML.FuncInit())
   {    
     lcd.clear();
     lcd.print(F(" Helligkeit 1-6"));   
     lcd.setCursor(7,1);
     lcd.print(brightness_index);
   }
   
   /* --------- LOOP ---------- */
   if(LCDML.checkButtons())
   {
     if (LCDML.g_button_down >= 1 && brightness_index > 0 && brightness_index <=6) //fadeOut
     {      
        LCDML.g_button_down=0;
        brightness_index-1;          
     }
     else if (LCDML.g_button_up >= 1 && brightness_index < 6 && brightness_index >=0)  //fadeIn
     {
        LCDML.g_button_up=0;      
        brightness_index+1;
     }
     
     lcd.setCursor(7,1);
     lcd.print(brightness_index);
     analogWrite(_PIN_BACKLIGHT, brightness_levels[brightness_index]);
   }
   
    /* --------- STOP  ---------*/
   if(LCDML.FuncEnd(0, 1, 0, 0, 0, 0))
   {
   
   }
 }
 
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 12, 2013, 09:43 pm
Danke skorpi08 für das Backlightbeispiel.

Meine Implementierung sieht nun so aus:

Code: [Select]

void FUNC_LCD_Backlight(void)
 {
   /* --------- INIT ---------
    * Initialisierung dieser Funktion
    * wird nur einmal beim Start dieser Funktion ausgefuert
    * danach nur erneut, wenn die Menu Funktion verlassen wurde
    * wenn keine Variablen initialisiert werden müssen, kann diese
    * Funktion anstatt mit if(!CTR_init()) ....     mit
    * CTR_init();  aufgerufen werden    
    */  
   if(!LCDML.FuncInit())
   {    
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print(F("LCD Helligkeit :"));
   }
   
   /* --------- LOOP ----------
    * Hier wird nur ein Ereignis ausgelöst, sobald ein Button gedrückt
    * wurde. Die Funktion CTR_check_button liefert true, wenn ein Button
    * seit dem letztem durchlauf betätigt wurde, ansonsten false.    
    */
   for (int i=0;i<=(brightness_index*2)-1; i++){
        lcd.setCursor(i,1);
        lcd.write(B11111111);  
     }
   lcd.setCursor(12,1);
   lcd.print(brightness_levels[brightness_index]*100/255);
   lcd.print("%");
     
   if (LCDML.checkButtons()) {      
     if (LCDML.g_button_left >= 1 && brightness_index > 0 && brightness_index <=6) //fadeOut
     {      
        LCDML.g_button_left=0;
        brightness_index-1;          
     }
     else if (LCDML.g_button_right >= 1 && brightness_index < 6 && brightness_index >=0)  //fadeIn
     {
        LCDML.g_button_right=0;      
        brightness_index+1;
     }
     
     analogWrite(_PIN_BACKLIGHT, brightness_levels[brightness_index]);
   }    
   
   /* --------- STOP  ---------      
    * CTR_func_end (direct, enter, up, down, left, right)
    * Fall in dieser Funktion keine Variablen zurückgesetzt werden
    * müssen, kann diese Funktion auch vereinfacht mit CTR_end(0, 1, 1, 1, 1, 1);
    * aufgerufen werden. Die Endbedingungen müssen durch die Zahlen >0 vorgegeben
    * werden
    * Wenn alles 0 ist, hängt das gesammte Programm in dieser Funktion fest
    */
   if(LCDML.FuncEnd(0, 1, 0, 0, 0, 0))
   {
     /* Falls noch Variablen zurückgesetzt werden müssen, bevor diese Funktion
      * verlassen wird, kann dies in dieser If Schleife geschehen
      */
   }      
 }


Leider funktioniert das noch nicht so wie ich mir das vorstelle. Wo genau in Deinem Code hast Du denn diesen Teil hier untergebracht:

Code: [Select]

//LCD Hintergrundbeleuchtung
  #define _PIN_BACKLIGHT 10
  unsigned char brightness_levels[7] = { 0, 20, 50, 90, 130, 190, 255 };
  unsigned char brightness_index;


Bei mir steht der in einem Tab der nur die LCD Steuerung übernimmt. Das scheint an dieser STelle aber nicht zu funktionieren. Ich bastel noch ein wenig. Werd schon ne Lösung finden.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 12, 2013, 09:45 pm
Code: [Select]

/* ===============================================
* Example: LCDMenuLib (german doku)
* ===============================================
* Autor:     Nils Feldkämper
* Email:     nilsfeld@gmail.com
* License:   all Free
* Last edit: 14.07.2013
*/
  #include <LiquidCrystal.h>
  #include <LCDMenuLib.h>
  #include <Time.h>
  #include <OneWire.h>
  #include <simpleThread.h>

/*
* ===============================================
* Defines
* ===============================================
*/   
//LCD Hintergrundbeleuchtung
   #define _PIN_BACKLIGHT 20
   unsigned char brightness_levels[7] = { 0, 20, 50, 90, 130, 190, 255 };
   unsigned char brightness_index;
   
 


Direkt unter den includes
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: xpix on Aug 14, 2013, 11:08 am
Hallo,

ich war schon lange nicht mehr in dem Forum, wollte aber für mein XLCD Projekt ein I2C LCD mit menu und Rotary Encoder nutzen. Nun bin ich auf dieses sehr interessante Projekt gestoßen und möchte es gerne soweit unterstützen, das wir das LCDMenuLib_I2C zum laufen bekommen. Also werfe ich mal meinen Hut in den Ring :)

Zuerst habe ich die LCDMenuLib_I2C runtergeladen und an meinem LCD ausprobiert, da kam folgeder Fehler:

lcdmenulib_i2c:118: error: invalid conversion from 'int' to 't_backlighPol'
lcdmenulib_i2c:118: error: initializing argument 3 of 'LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, t_backlighPol)'


Das liegt wohl an meiner Speziellen LiquidCrystal_I2C lib. Schaut man in die Definitionen, sieht man folgendes:

Code: [Select]

// Created by Francisco Malpartida on 20/08/11.
...
  LiquidCrystal_I2C (uint8_t lcd_Addr);
  // Constructor with backlight control
  LiquidCrystal_I2C (uint8_t lcd_Addr, uint8_t backlighPin, t_backlighPol pol);
...
   @param      lcd_Addr[in] I2C address of the IO expansion module. For I2CLCDextraIO,
   the address can be configured using the on board jumpers.
   @param      En[in] LCD En (Enable) pin connected to the IO extender module
   @param      Rw[in] LCD Rw (Read/write) pin connected to the IO extender module
   @param      Rs[in] LCD Rs (Reset) pin connected to the IO extender module
   */
  LiquidCrystal_I2C( uint8_t lcd_Addr, uint8_t En, uint8_t Rw, uint8_t Rs);
  // Constructor with backlight control
  LiquidCrystal_I2C(uint8_t lcd_Addr, uint8_t En, uint8_t Rw, uint8_t Rs,
                    uint8_t backlighPin, t_backlighPol pol);  
...
  LiquidCrystal_I2C(uint8_t lcd_Addr, uint8_t En, uint8_t Rw, uint8_t Rs,
                    uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7 );
  // Constructor with backlight control
  LiquidCrystal_I2C(uint8_t lcd_Addr, uint8_t En, uint8_t Rw, uint8_t Rs,
                    uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
                    uint8_t backlighPin, t_backlighPol pol);


Man sieht also, an diese lib kann man nicht die Anzahl der Zeilen und Spalten übergeben. Deswegen auch das copyright in der ersten zeile. Scheinbar scheinen LEIDER mehrere Libraries mit dem selben namen im Netz rumzuschwirren:

http://arduino-info.wikispaces.com/LCD-Blue-I2C

Gut, also der (für mich) normale Weg sieht so aus:

Code: [Select]

 #include <LiquidCrystal_I2C.h>   // LCD over I2C
 // Set the pins on the I2C chip used for LCD connections:
 //                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
 LiquidCrystal_I2C myLCD(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
 myLCD.begin(16,4);
 myLCD.clear();
 myLCD.setCursor(0, 0);
 myLCD.print("XLCD 0.1");


Vielleicht hilft dir das weiter und ich kann auf eine I2C Lösung hoffen. Achso, wenn ich die cols und rows in der LCDMenuLib_I2C_h nicht übergebe, kommt folgender Fehler:

Code: [Select]

In file included from C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C\LCDMenuLib_I2C.cpp:16:
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C/LCDMenuLib_I2C.h:70: error: ISO C++ forbids declaration of 'LiquidCrystal_I2C' with no type
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C/LCDMenuLib_I2C.h:70: error: expected ';' before '*' token
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C/LCDMenuLib_I2C.h:109: error: 'LiquidCrystal_I2C' has not been declared
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C\LCDMenuLib_I2C.cpp:19: error: 'LiquidCrystal_I2C' has not been declared
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C\LCDMenuLib_I2C.cpp: In constructor 'LcdMenuLib_I2C::LcdMenuLib_I2C(LCDMenu&, int&, const char**, uint8_t, uint8_t)':
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C\LCDMenuLib_I2C.cpp:24: error: 'lcd' was not declared in this scope
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C\LCDMenuLib_I2C.cpp: In member function 'void LcdMenuLib_I2C::setCursor()':
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C\LCDMenuLib_I2C.cpp:77: error: 'lcd' was not declared in this scope
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C\LCDMenuLib_I2C.cpp:81: error: 'lcd' was not declared in this scope
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C\LCDMenuLib_I2C.cpp:88: error: 'lcd' was not declared in this scope
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C\LCDMenuLib_I2C.cpp: In member function 'void LcdMenuLib_I2C::display()':
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C\LCDMenuLib_I2C.cpp:254: error: 'lcd' was not declared in this scope
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C\LCDMenuLib_I2C.cpp: In member function 'void LcdMenuLib_I2C::Button_quit()':
C:\Users\xxxxxxxx\Dropbox\arduino-1.0.5\libraries\LCDMenuLib_I2C\LCDMenuLib_I2C.cpp:391: error: 'lcd' was not declared in this scope


vielleicht hilft es dir weiter ...

cu
Frank
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 14, 2013, 11:36 am
Hi, an der I2C Umsetzung bastel ich noch.

Von der Beta Version gibt es nun ein neues Update:
- "Splash-Screen" in "Init-Screen" umbenannt
- Init-Screen kann nun nach x Sekunden aktiviert werden. Das Menü geht dann in den "root" Zustand zurück.
- Die Wartezeit wird durch einen Tastendruck zurückgesetzt
- Init-Screen kann weiter aus Ebene 0 mit Quit/Back gestartet werden
- Die FUNC_init_screen Funktion arbeitet nun mit  LCDML.FuncInit und LCDML.FuncEnd zusammen. (Schaut euch das Beispiel an)
- Init-Screen benötigt zwei neue defines im Hauptprogramm
Code: [Select]

#define _LCDMenuLib_ENABLE_INIT_SCREEN            1 //
#define _LCDMenuLib_INIT_SCREEN_TIME              10000 //0=zeit deaktivieren, >0 Wartezeit in ms

- Der Init-Screen kann im config File komplett deaktiviert werden
- Springen zwischen Funktionen ist nun mit dem Makro "LCDMenuLib_jumpToFunc(FUNC_p2);" möglich. Hier wird der Funktionsname übergeben

Die neuen Funktionen belegen etwas mehr Speicher. Hier bin ich noch am optimieren.
Falls ihr Fehler findet meldet euch bitte.
Als nächstes mach ich mich an die I2C Schnittstelle der LiquidCrystal Lib (LiquidCrystal_New (https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home) => kompatible zur LiquidCrystal Lib die in der Arduino Version eingebunden ist | belegt 600 Bytes mehr Flashspeicher als die Orginal Lib).

Bekannte Fehler:
- komplexer Scrollbalken wird nicht immer richtig dargestellt

 
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: xpix on Aug 14, 2013, 01:15 pm
Hi, ich habe versucht die letzte Version im Arduino IDE 1.0.5 zu kompilieren und erhalte folgende Fehlermeldung:

Code: [Select]

In file included from C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib\LCDMenuLib.cpp:16:
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib/LCDMenuLib.h:80: error: ISO C++ forbids declaration of 'LiquidCrystal' with no type
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib/LCDMenuLib.h:80: error: expected ';' before '*' token
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib/LCDMenuLib.h:133: error: 'LiquidCrystal' has not been declared
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib\LCDMenuLib.cpp:19: error: 'LiquidCrystal' has not been declared
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib\LCDMenuLib.cpp: In constructor 'LcdMenuLib___LCDML_lcd_type::LcdMenuLib___LCDML_lcd_type(LCDMenu&, int&, const char**, uint8_t, uint8_t)':
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib\LCDMenuLib.cpp:24: error: 'lcd' was not declared in this scope
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib\LCDMenuLib.cpp: In member function 'void LcdMenuLib___LCDML_lcd_type::setCursor()':
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib\LCDMenuLib.cpp:154: error: 'lcd' was not declared in this scope
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib\LCDMenuLib.cpp:158: error: 'lcd' was not declared in this scope
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib\LCDMenuLib.cpp:165: error: 'lcd' was not declared in this scope
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib\LCDMenuLib.cpp: In member function 'void LcdMenuLib___LCDML_lcd_type::display()':
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib\LCDMenuLib.cpp:332: error: 'lcd' was not declared in this scope
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib\LCDMenuLib.cpp: In member function 'void LcdMenuLib___LCDML_lcd_type::Button_quit(uint8_t)':
C:\Users\c5125630\Dropbox\arduino-1.0.5\libraries\LCDMenuLib\LCDMenuLib.cpp:500: error: 'lcd' was not declared in this scope


Liegt das vielleicht an meiner LiquidCrystal lib?

Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 14, 2013, 01:39 pm
Hi, nein daher kommen die Fehler nicht.
Ich habe gerade mal die orginal LiquidCrystal Lib eingebunden, da treten keine Fehler auf.
Welches Betriebssystem hast du ?

Der Fehler stammt vom "durcheinander", da ich im Moment dabei bin I2C einzubinden, aber ich weiß nicht wieso er beim kompilieren bei dir auftritt, bei mir aber nicht. Können das Problem noch andere feststellen ?
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: xpix on Aug 14, 2013, 01:47 pm

Hi, nein daher kommen die Fehler nicht.
Ich habe gerade mal die orginal LiquidCrystal Lib eingebunden, da treten keine Fehler auf.
Welches Betriebssystem hast du ?


Windows 7

Also, ich habe jetzt die originale LiquidCrystal benutzt und da kompiliert er durch. Es scheint da ein problem mit der neuen lib zu geben: https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home

Da liegt wohl der Hase im Pfeffer :)

Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 14, 2013, 01:50 pm
Ok, dann werde ich das nochmal testen. Ich nutze auch die 1.05, dazu dann Windows 8. Bei mir bekomme ich weder mit der alten noch mit der neuen einen Fehler ausgegeben.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 14, 2013, 02:43 pm
Hallo Jomelo,

vielen Dank für die neue Version. Folgendes konnte ich feststellen.

Ich habe nun bemerkt das ich für einen Digitalen-Pin nicht die Funktion analogWrite(10, 127) innerhalb der Menu Funktionsschleife verwenden kann. Meine Menüfunktion zur Steuerung der Hintergrundbeleuchtung sieht wie folgt aus:

Code: [Select]

/* ==========================
* LCD Backlight
*
* Desription:
* This Function provides means of configuration for the LCD Backlight.
* ========================= */

/* Globale Variablen für diese Funktion */
 
  void FUNC_LCD_Backlight(void)
  {
    /* --------- INIT ---------
     * Initialisierung dieser Funktion
     * wird nur einmal beim Start dieser Funktion ausgefuert
     * danach nur erneut, wenn die Menu Funktion verlassen wurde
     * wenn keine Variablen initialisiert werden müssen, kann diese
     * Funktion anstatt mit if(!CTR_init()) ....     mit
     * CTR_init();  aufgerufen werden     
     */ 
    if(!LCDML.FuncInit())
    {   
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(F("LCD Helligkeit :"));
    }
   
    /* --------- LOOP ----------
     * Hier wird nur ein Ereignis ausgelöst, sobald ein Button gedrückt
     * wurde. Die Funktion CTR_check_button liefert true, wenn ein Button
     * seit dem letztem durchlauf betätigt wurde, ansonsten false.     
     */
    for (int i=0;i<=(brightness_index*2)-1; i++){
         lcd.setCursor(i,1);
         lcd.write(B11111111);   
    }
    lcd.setCursor(12,1);
    lcd.print(brightness_levels[brightness_index]*100/255);
    lcd.print("%");
     
    if(LCDML.checkButtons())
    {
      if (LCDML.g_button_left >= 1 && brightness_index > 0 && brightness_index <=6) //fadeOut
      {       
         LCDML.g_button_left=0;
         --brightness_index;       
      }
      else if (LCDML.g_button_right >= 1 && brightness_index < 6 && brightness_index >=0)  //fadeIn
      {
         LCDML.g_button_right=0;       
         ++brightness_index;
      }
      lcd.setCursor(0,1);             // set Cursor to initial position in 2nd row and
      lcd.print("                ");  // delete content of this row
      analogWrite(_PIN_BACKLIGHT, brightness_levels[brightness_index]);
    }

    /* --------- STOP  ---------     
     * CTR_func_end (direct, enter, up, down, left, right)
     * Fall in dieser Funktion keine Variablen zurückgesetzt werden
     * müssen, kann diese Funktion auch vereinfacht mit CTR_end(0, 1, 1, 1, 1, 1);
     * aufgerufen werden. Die Endbedingungen müssen durch die Zahlen >0 vorgegeben
     * werden
     * Wenn alles 0 ist, hängt das gesammte Programm in dieser Funktion fest
     */
    if(LCDML.FuncEnd(0, 1, 0, 0, 0, 0))
    {
      /* Falls noch Variablen zurückgesetzt werden müssen, bevor diese Funktion
       * verlassen wird, kann dies in dieser If Schleife geschehen
       */
    }     
  }


Eine einfache Version dessen, was ich versuche mit der Hintergrundbeleuchtung umzusetzen ist dies hier:
Code: [Select]

//Sample using LiquidCrystal library
#include <LiquidCrystal.h>

/*******************************************************

This program will test the LCD panel and the buttons of
the DFRobot LCD Keypad Shield for Arduino
Product code : RB-Dfr-07
http://www.robotshop.com/dfrobot-lcd-keypad-shield-arduino-1.html

Note cct error identified by Arduino forum discussion at:
http://arduino.cc/forum/index.php/topic,96747.0.html
which advises insertion of a Germanium 1n34a or a Schotky 1N5819
diode between pin 10 and the base of Q1 (K to pin 10).

sample code originally by Mark Bramwell, July 2010
modifications by Dion Weston, March 2012



********************************************************/

// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// define some values used by the panel and buttons
int backLight   = 10;    // LCD Panel Backlight LED connected to digital pin 10
int lightLevel  = 255;   // Initialise light full on
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// read the buttons
int read_LCD_buttons()
{
adc_key_in = analogRead(0);      // read the value from the sensor
// my [Mark Bramwell's] buttons when read are centered at these valies: 0, 144, 329, 504, 741
// we add approx 50 to those values and check to see if we are close
if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
if (adc_key_in < 50)   return btnRIGHT; 
if (adc_key_in < 195)  return btnUP;
if (adc_key_in < 380)  return btnDOWN;
if (adc_key_in < 555)  return btnLEFT;
if (adc_key_in < 790)  return btnSELECT;   
return btnNONE;  // when all others fail, return this...
}

void setup()
{
lcd.begin(16, 2);              // start the LCD library
lcd.setCursor(0,0);            // move cursor to beginning of line "0"
lcd.print("Backlight adjust"); // print a simple message

}

void loop()
{
analogWrite(backLight, lightLevel);
lcd.setCursor(13,1);            // move to position 13 on the second line
lcd.print(lightLevel);

lcd.setCursor(0,1);            // move to the begining of the second line
lcd_key = read_LCD_buttons();  // read the buttons

switch (lcd_key)               // depending on which button was pushed, we perform an action
{
   case btnRIGHT:
     {
     lcd.print("LED On          ");
     lightLevel = 255;
     break;
     }
   case btnLEFT:
     {
     lcd.print("LED Off         ");
     lightLevel = 1;
     break;
     }
   case btnUP:
     {
     lcd.print("LED Fade Up     ");
     if (lightLevel < 255) lightLevel += 1;
     break;
     }
   case btnDOWN:
     {
     lcd.print("LED Fade Down   ");
     if (lightLevel > 1) lightLevel -= 1;
     break;
     }
   case btnSELECT:
     {
     lcd.print("Select          ");
     break;
     }
     case btnNONE:
     {
     lcd.print("                ");
     break;
     }
}

}


In diesem Codebeispiel funktioniert die analogWrite(.., ..) -Funktion für einen Digitalen-Pin problemlos.

Beste Grüße,
Jan
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: xpix on Aug 14, 2013, 03:02 pm
Ich muss leider auch noch einmal nachfragen. Sobald ich das extra module 'MENU_FUNCTION' in das directory lege, bekomme ich folgende Fehlermeldung:

Code: [Select]

Arduino: 1.0.5 (Windows 7), Board: "Arduino Duemilanove w/ ATmega328"
MENU_FUNCTION:1: error: stray '\' in program
serialspy:92: error: 'ufeffvoid' does not name a type
MENU_FUNCTION:1: error: 'ufeffvoid' does not name a type


Ich habe aber nirgendwo ein '\' stehen:

Code: [Select]

?void FUNC_init_screen(void)
{
   if(!LCDML.FuncInit()) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Init Screen");     
   } 

   if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1)) {
      int i = 0;
   }
}


Ist Euch solch ein Fehler mal über den Weg gelaufen?
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 14, 2013, 03:08 pm
Mal ne frage zur LiqudCeystal Lib...
Welche soll ich nehmen, die (https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads) oder die (http://playground.arduino.cc//Main/LiquidCrystal)?

Mit der letzten MenuLib funktionieren die Tasten nicht. Welche einstellungen habt ihr?
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: xpix on Aug 14, 2013, 03:32 pm

Ist Euch solch ein Fehler mal über den Weg gelaufen?


Ok, man sollte die alte Lib auch wirklich weglöschen und nicht nur den ordner umbenennen. :) Geht jetzt ...
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 14, 2013, 03:48 pm
@xpix
Der Fehler hängt damit zusammen das #defines doppelt auftreten.
Wenn man mit einem #define nicht nur eine Variable setzt, sondern eine Funktion generiert, dann nennt man es Makro. Wenn ein Makro dann über mehrere Zeilen gehen soll, muss man die Zeile mit einem \  abschließen. Daher stammt dann auch die Fehlermeldung.

Die anderen Dinge muss ich nun erst untersuchen bevor ich dazu etwas sagen kann. Das analogWrite nicht funktioniert kommt mir Merkwürdig vor.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 14, 2013, 04:50 pm

Ok, man sollte die alte Lib auch wirklich weglöschen und nicht nur den ordner umbenennen. :) Geht jetzt ...


Das App sucht nicht nach dem Ordner Namen, sondern nach Name.h
Da 2 verschiedene Ordner in denen Datei mit dem gleichen namen (Name.h) drin sind, gibts halt fehler wenn das falsche von der IDE genommen wird.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 14, 2013, 05:49 pm

Mal ne frage zur LiqudCeystal Lib...
Welche soll ich nehmen, die (https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads) oder die (http://playground.arduino.cc//Main/LiquidCrystal)?

Mit der letzten MenuLib funktionieren die Tasten nicht. Welche einstellungen habt ihr?


Fehler mit der Lib von https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads

Quote
In file included from /Users/johanneswolter/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.cpp:16:
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.h:80: error: ISO C++ forbids declaration of 'LiquidCrystal' with no type
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.h:80: error: expected ';' before '*' token
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.h:133: error: 'LiquidCrystal' has not been declared
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.cpp:19: error: 'LiquidCrystal' has not been declared
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.cpp: In constructor 'LcdMenuLib___LCDML_lcd_type::LcdMenuLib___LCDML_lcd_type(LCDMenu&, int&, const char**, uint8_t, uint8_t)':
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.cpp:24: error: 'lcd' was not declared in this scope
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.cpp: In member function 'void LcdMenuLib___LCDML_lcd_type::setCursor()':
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.cpp:154: error: 'lcd' was not declared in this scope
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.cpp:158: error: 'lcd' was not declared in this scope
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.cpp:165: error: 'lcd' was not declared in this scope
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.cpp: In member function 'void LcdMenuLib___LCDML_lcd_type::display()':
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.cpp:332: error: 'lcd' was not declared in this scope
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.cpp: In member function 'void LcdMenuLib___LCDML_lcd_type::Button_quit(uint8_t)':
/Users/johann/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.cpp:500: error: 'lcd' was not declared in this scope



Fehler mit der Lib  von http://playground.arduino.cc/Main/LiquidCrystal

Quote
/Applications/Arduino.app/Contents/Resources/Java/libraries/LiquidCrystal/LiquidCrystal.cpp: In member function 'void LiquidCrystal::initSPI(uint8_t)':
/Applications/Arduino.app/Contents/Resources/Java/libraries/LiquidCrystal/LiquidCrystal.cpp:117: error: 'SPI' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/LiquidCrystal/LiquidCrystal.cpp:120: error: 'SPI_CLOCK_DIV2' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/LiquidCrystal/LiquidCrystal.cpp:124: error: 'SPI_MODE0' was not declared in this scope
/Applications/Arduino.app/Contents/Resources/Java/libraries/LiquidCrystal/LiquidCrystal.cpp: In member function 'void LiquidCrystal::spiSendOut()':
/Applications/Arduino.app/Contents/Resources/Java/libraries/LiquidCrystal/LiquidCrystal.cpp:403: error: 'SPI' was not declared in this scope


Nur mit der Lib die in der Arduino.app 1.0.5 standardmäßig dabei ist, funktioniert es
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 14, 2013, 05:49 pm
Hmm, wenn man nach LiquidCrystal Lib sucht gibt es echt viele verschiedene Autoren und alles läuft unter dem gleichem Namen. ...
Ich würde nun diese einbinden: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads damit I2C funktionieren kann.

Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 14, 2013, 06:10 pm
Könnt ihr einmal diese Version testen mit der im letzten Thread angegebenen Lib und der Orginal Lib ?
Ich habe bei dieser Version den I2C Ansatz entfern.

Bezüglich der Tasten: Ist in der Loop "LCDMenuLib_ButtonSerial();" vielleicht noch nicht auskommentiert und "LCDMenuLib_ButtonAnalog();" einkommentiert ?
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 14, 2013, 06:19 pm
Mit originalen geht.
Von arduino.cc derselbe Fehler.
Mit der von dir angegebenen, solche Fehler wenns im libraries ordner liegt
Quote
Documents/Arduino/libraries/LiquidCrystal_V121/I2CIO.cpp:61: error: 'Wire' was not declared in this scope


und wenns in der Arduino.app liegt

Quote
/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.cpp:500: error: 'lcd' was not declared in this scope


Jap, das wars, bezüglich der Tasten.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 14, 2013, 06:22 pm
Ich finde es merkwürdig, unter Windows 8 bekomme ich keine Fehler weder bei der letzten Version noch bei dieser.
Ich muss mal schauen wie ich das reproduzieren kann, ansonsten kann ich den Fehler nicht finden.

Ansonsten nutzt die Lib erstmal mit der orginal LiquidCrystal Lib. Sind euch sonst noch Fehler aufgefallen ? Funktionieren die Taster wieder ? 
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: xpix on Aug 14, 2013, 06:42 pm
Hi, also ich habe mich erst einmal mit deiner lib im ersten Artikel beschäftigt. Da scheint über die serielle Konsole alles zu gehen, da ich aber nur ein 16x4 Display habe ... rückt er die Menüpunkte Einstellung und Programme in der 3. und 4. Zeile ein. Also mein LCD sieht zur zeit so aus:

Code: [Select]

Info
Zeit
   Einstellung
  >Programme


Ist das ein Feature oder ein Bug? Kann das an meinen 16 Zeichen Display liegen?

Wenn ich in Programme wechsel, sehe ich ein angedeutetes Scrollbar, aber nur in den ersten 2 Zeilen
Code: [Select]

Programm Mix   ||
Programm Hemde||
   Programm Sc
  >Einstellung


Nochwas, gibt es eigentlich ein GitHub oder Subversion Repository von deinem Werk?
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 14, 2013, 08:31 pm
Hi,
nein die gibt es noch nicht. Könnte ich mal anlegen wenn ich mich damit auseinander setze. Den einrück Bug habe ich bisher noch nie gesehen. Hast du die Defines an dein Display angepasst, also von 20x4 auf 16x2 ?
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Aug 14, 2013, 11:17 pm

... Sind euch sonst noch Fehler aufgefallen ? ...


Hallo Jomelo,

wie ich bereits schrieb, funktioniert bei mir ein analogwrite(...,...); innerhalb einer Menüfunktion nicht korrekt. Es wird, egal welcher Wert eingetragen ist, immer ein logisches HIGH oder LOW ausgegeben. Gemäss der benutzen Funktion sollten jedoch zwischenwerte möglich sein. In dem zuvor von mir benannnten Beispiel funktioniert das auch problemlos auf der selben Hardware.

Gruß,
Jan
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: xpix on Aug 15, 2013, 09:00 am

Hi, nein die gibt es noch nicht. Könnte ich mal anlegen wenn ich mich damit auseinander setze.


Ok, ich leg dann erstmal mein menü auf Eis und werde mich mit den simpleThreads mehr auseinander setzen. Du solltest wirklich darüber nachdenken etwas mit github oder svn zu machen, bei den vielen Attachments in diesemn thread weiss man nie welches das stabile und welches das beta ist.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 15, 2013, 01:08 pm
Die alten Anhänge entferne ich immer. Stabil ist immer nur das welches im ersten Thread verlinkt ist. Alle anderen sind Beta Versionen.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: xpix on Aug 21, 2013, 01:48 pm
Hallo jomelo,

also erstmal klasse Arbeit bei den simpleThreads, diese setze ich in meinem Projekt erfolgreich ein und lassen sich super handeln. Nun wende ich mich dem LCDMenu zu und fand heraus, das mein LiquidCrystal Treiber fehlerhaft war. Nun wollte ich einen Treiber einsetzen der funktioniert, leider hat dieser einen anderen namen LiquidCrystalFast. Problem dabei, du lässt dem user nicht das Teil initialisieren, sondern machst das in deinem modul?!

Problem dabei, ich will auch eigene Ausgaben neben dem Menü machen und muss dann rätseln wie das lcd object intern bei dir heisst ... kannst man das ändern?

Code: [Select]

   LiquidCrystalFast myLCD(12, 11, 4, 5, 6, 7);
   LCDMenuLib_init(&myLCD, _LCDMenuLib_cnt);


Gruss xpix
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 21, 2013, 02:39 pm
Die Lib ist bisher nur mit Liquid Crystal einsetzbar. Ich bin noch am umschreiben der Funktionen so das es auch anders geht. Prinzipiell ist es das gleiche Problem wie bei LiquidCrystal_I2C, da hier auch eine andere Lib verwendet wird.

Im Moment ist es aber sehr stressig, daher wird es vor nächster Woche keine neuen Version geben. Zudem kommt noch das Problem, dass einige Libs Merkwürdige Fehler verursachen die unter Windows 8 beim kompilieren nicht auftreten. (Sprich, ich muss mir ein virtuelle Maschine aufsetzen in der Windows 7 läuft)
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: xpix on Aug 21, 2013, 03:15 pm

Zudem kommt noch das Problem, dass einige Libs Merkwürdige Fehler verursachen die unter Windows 8 beim kompilieren nicht auftreten. (Sprich, ich muss mir ein virtuelle Maschine aufsetzen in der Windows 7 läuft)


Ich kann mir nicht vorstellen das es an Windows 7 liegt, ich habe hier deine Module alle durch kompilieren können. Auch nach meinen Änderungen nach LQFast, kompiliert er sauber durch ... ich habe einfach nach allen Vorkommen von LQ gesucht und umbenannt ... scheint zu gehen :)
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 21, 2013, 04:42 pm
So ist das klar, also wenn man alle Dinge umbenennt, aber es gibt ja auch die Möglichkeit die Schnittstelle so zu gestalten das verschiedene Klassen unterstützt werden können.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: thkl on Aug 22, 2013, 08:28 pm
Hallo,

danke erstmal für die Arbeit mit der Lib. Ich hätte da mal eine Anfängerfrage.

Kann ich der Callback Funktion eines MenuItems auch einen oder mehrere Parameter mitgeben ?

Also Bsp.:

LCDMenuLib_element(0  , Item         , Item_1        , "Information 1"        , FUNC_SETTING_G(1) );

In der MENU_FUNTION hab ich das auch entsprechend angepasst:

void FUNC_SETTING_G(int nr)
{
....


Aber das compiliert natürlich nicht ;(

B_Arduino:112: error: variable or field 'FUNC_SETTING_G' declared void
B_Arduino.ino: In function 'void LCDMenuLib_7_function()':
B_Arduino:112: error: void value not ignored as it ought to be

Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 22, 2013, 09:43 pm
Hi,
nein das geht nicht. Du kannst du mit globalen Variablen arbeiten. Die Funktionen werden automatisch durch die Lib aufgerufen und aktivier. Da die Lib aber nicht weiß welche Variablen übergeben werden sollen, dürfen einfach keine Übergeben werden, da ansonsten die Lib für jeden einzeln angepasst werden müsste.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: thkl on Aug 22, 2013, 10:01 pm
Sowas dachte ich mir.
Anderer Ansatz: bekomme ich innerhalb der Callback Funktion die ID des
Menüpunktes herraus aus dem diese aufgerufen wurde ? Das würde ja dann auch das Problem lösen. 
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 22, 2013, 11:10 pm
Hi, ja das geht:
Code: [Select]

LCDML.getFunction()


Die Funktion sollte dir die ID des Menüpunktes liefern.

Es wird wohl mal Zeit, das ich die Dokumentation anpasse an alle Änderungen/Möglichkeiten ;-)

Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: thkl on Aug 23, 2013, 06:09 pm
Funktioniert , vielen Dank
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Arkon on Aug 23, 2013, 10:32 pm
Nabend,

zuerst einmal vielen Dank und großes Lob für diese tolle Lib. Sie ist (fast) genau passend für mein aktuelles Projekt.

Das fast oben bezieht sich auf mein kleines Problem:

Da mir die Pins auszugehen drohen habe ich mir eine I2C-Platine für mein LCD bestellt. Dieses nutzt eine erweiterte Version der LiquidCrystal-Lib, die du ja auch in Deiner benutzt. Die Befehle sind kompatibel, aber die Initialisierung macht mir Probleme. Bisher habe ich folgendes geändert:

- include der LiquidCrystal_I2C.h anstatt LiquidCrystal.h in allen Dateien
- include der Wire.h in der Hauptdatei
- Ersetzen von LiquidCrystal lcd(_LCDMenuLib_PIN........) durch LiquidCrystal_I2C (0x20) //Adresse des Displays.

Aber trotzdem wirft er mit Fehlermeldungen um sich.

Leider bin ich noch nicht wirklich fit im Programmieren. Würde mich daher freuen, wenn du mal versuchen könntest die modifizierte LCD-Lib in dein Menü einzubauen oder zumindest ein kurzes Workaround tippen, was ich an deiner Lib ändern muss, um ein LCD über I2C anzusprechen.

Beste Grüße
Christopher
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 24, 2013, 12:15 am
Die Lib ist noch nicht zu I2C kompatibel, ich arbeite im Moment daran, aber es dauert ein wenig, da sonst auch viel zu tun ist. Beim Umschreiben kann ich keine Hilfestellung geben, da jeder sonst mit eigenen Wünschen kommt. ;-) Ich werde das innerhalb der nächsten zwei Wochen nochmals mit I2C testen und die Beta Lib dann hier zum testen zur Verfügung stellen.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 24, 2013, 06:12 pm
Hi, ging doch schneller als gedacht.
Ich habe eine neue Beta Version. In dieser befinden sich nun zwei Beispiele. Das erste ist auch das alte mit der normalen LiquidCrystal Lib. Das zweite arbeitet mit der LiquidCrystal_I2C Lib (LiquidCrystal_New (https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home)).

Falls ihr I2C verwenden solltet, müsst ihr in der LCDMenuLib_config.h  die Variabel LCDMenuLib_cfg_lcd_type auf das verwendete LCD anpassen. I2C fängt mit den Werten ab 10 an. Die Beschreibung der Zahlenwerte steht oberhalb der Variable. Standardmäßig ist der Wert auf 0 gesetzt. Dies entspricht der normalen LiquidCrystal Lib im 4Bit Modus.

Wenn ihr das Anpassen der Variable vergessen habt, bekommt ihr eine Fehlermeldung die sagt, dass einige Konstanten nicht definiert sind.

Bitte testet mal die Version.

Bekannte Probleme:
- Scollbalken wird Fehlerhaft dargestellt.  
- - Der Bug ist in der nächsten Version behoben, zudem belegt die nächste Version etwas weniger RAM und ca 400KB weniger Flash Speicher.

Edit:
- Lib erneut hochgeladen
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Arkon on Aug 24, 2013, 09:41 pm
Hi,

klasse, dass du dich so schnell um die I2C-Einbindung gekümmert hast.

Leider finde ich weder die Variable LCDMenuLib_cfg_lcd_type noch das zweite Beispiel das du in der Beta aus deinem letzten Post.

Beste Grüße
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 24, 2013, 10:01 pm
Ops, ich habe die alte Lib nochmal hochgeladen. Die Datei ist nun aktualisiert.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Arkon on Aug 25, 2013, 09:08 am
Ah jetzt ja. :) Besten Dank für die schnelle Antwort. Ich spiele mal ein bisschen mit deiner Lib rum.

Dankö!
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: thkl on Aug 26, 2013, 05:29 pm
Guten Abend,

gibt es die Möglichkeit, das die CallBack Funktion noch mal aufgerufen wird, wenn ein Menüpunkt abgebrochen wird.
Zur Erklärung: Ich möchte einen automatischen Messzyklus unterbrechen sobald der User über das Menü  Einstellungen an den Parametern vornimmt.
Das löse ich derzeit über eine Variable die gesetzt wird, sobald das Einstellungsmenü aufgerufen wird. Jetzt möchte ich diese ja wieder löschen.

LCDML.FuncEnd(... wird ja nicht beim Backbutton aufgerufen ...
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 26, 2013, 06:09 pm
Hi, nein die gibt es so nicht, da ansonsten der Menüpunkt wieder angezeigt werden würde.

Ich würde es so machen, dass in der Variable die du schon verwendest einen Zeitwert mit millis() abspeichert wirt. Solange der Menüpunkt aktive ist wird in diesem die Variable immer mit dem aktuellen Zeitwert + einem Puffer von 500 ms überschrieben. Der Variable Typ sollte "long" sein.
Code: [Select]

//im Menü
variable = millis()+500;


in der Loop Schleife kannst du dann abfragen, ob der Wert noch aktualisiert wird.
Code: [Select]

void loop()
{
  // ... Initialisierung menü und so ..
  //..
  //
  if(variable < millis()) {
    // messung läuft
  } else {
    // messung steht
  }  
}

Das ganze ist nur Pseudo-Code, also so nicht lauffähig, soll aber darstellen wie es funktionieren könnte.

Spätestens nach 500 ms läuft dann deine Messung wieder.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 26, 2013, 06:17 pm
Mit der Lib 1.2.1 funzt weder das eine noch das andere Beispiel.

Bei l2c gibts dass:
Code: [Select]
'_LCDMenuLib_LCD_dat3' was not declared in this scope
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 26, 2013, 06:20 pm
Hmm, irgendwie ist das Verrückt und Merkwürdig. Ich kann beide Beispiel kompilieren und das ohne I2C auch testen. Was hast du denn in der Config eingestellt ?

In der I2C Version gibt es kein _LCDMenuLib_lcd_dat 3.  Wenn der Fehler kommt wurde die LCDMenuLib_config.h nicht angepasst. Hast du den Wert:  _LCDMenuLib_cfg_lcd_type    richtig eingestellt ?
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Aug 26, 2013, 06:26 pm
Was für konfig? Ich hab die neue LCD Lib eingefügt und die beiden Beispiele geöffnet.  Beim kompilieren gibts dann die Fehler.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 26, 2013, 07:21 pm
Geh mal in das Lib Verzeichnis und öffne die Config Datei. Im Moment ist es leider noch so, aber anders kann ich die Includes nicht einbinden.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Rudi1995 on Aug 29, 2013, 11:18 am
Hey Jamelo ich habe entdeckt dass du an einer kicker Geschwindigkeitsmessung gearbeitet hast. Ich habe das selbe Projekt vor. habe auch schon viel Zeit reingesteckt allerdings ist das als arduino Neuling nicht sehr einfach. Deshalb wollte ich dich fragen ob du mir helfen könntest. Eventuell mit dem Programmtext :)
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Aug 29, 2013, 01:20 pm
Hi,
hast du dir diesen Thread schon angeschaut und auch die PDF Dokumente durchgelesen ?
Projektvorstellung: Geschwindigkeitsanzeige am Kicker / Tischfussball (http://forum.arduino.cc/index.php?topic=73751.0)
Damit solltest du beginnen und dann können wir die Diskussion auch in dem Thread weiterführen, da hier ein anderes Thema besprochen wird. Die Software zu der Hausarbeit befindet sich im "rar" Archiv.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Arkon on Sep 02, 2013, 08:38 pm
HeyHo,

ich tüftel fleißig mit deiner Lib in meinem Projekt. Bin in Sachen Programmierung aber noch am Anfang meiner Reise.

Nachdem ich meine erste Funktion außerhalb des Menüs wie gewünscht zum laufen bekommen habe, wollte ich sie jetzt über das Menü aufrufen und ausführen lassen. Dabei kommt es zum (ersten, mal sehen was noch so folgt :D ) Problem:

Ich steuere das Menü über die Spannungsteiler-Tasten-Variante. In der Funktion möchte ich ebenfalls mit den Tastern arbeiten. Da ich die Funktion diskret aufgebaut und getestet habe, habe ich mir eine eigene Routine zum Auslesen der Tasten geschrieben. Diese wird jetzt, da die Funktion über das Menü aufgerufen wird, aber scheinbar unterdrückt bzw. funktioniert nicht.

Hiermit frage ich die Buttons in der Funktion ab:
Code: [Select]

  readButtons();
  if((buttonUp == HIGH) && (attribute < 4))
    attribute++;
  if((buttonDown == HIGH) && (attribute >1))
    attribute--;


Und hier die readButtons();
Code: [Select]

void readButtons()
{
  int value = 0;
  buttonUp = LOW;
  buttonDown = LOW;

 
  value = analogRead(_BUTTON_PIN);
  if(LCDML.Timer(g_button_press_time, _BUTTON_press_time))
  {
    if((value >= _BUTTON_up_min) && (value <= _BUTTON_up_max))
      {
        buttonUp = HIGH;
        selection = 0;
      }
    if((value >= _BUTTON_down_min) && (value <= _BUTTON_down_max))
      {
        buttonDown = HIGH;
        selection = 0;
      }   
  }
}


Die Variablen buttonUp und buttonDown werden global initialisiert.

Es dürfte doch auch möglich sein, auf die Routinen deiner Menü-Lib zurück zu greifen um per Taster Hoch/Runter die Variable amount zu in- bzw. decrementieren oder?



Ansonsten scheint die I2C-Variante stabil zu laufen. Das Menü ruft bisher zwar nur eine Funktion auf, aber durch die einzelnen Ebenen kann ich problemlos durchnavigieren. Auch ich kann die Beispiele ohne Probleme kompilieren. Das Problem von skorpi08 tritt bei mir nicht auf.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Sep 02, 2013, 11:36 pm
Hi, das ist möglich.
Code: [Select]

if(LCDML.g_button_up > 0) {
  LCDML.g_button_up = 0;
  //hier der code
}


An dem Aufruf der Funktion änder sich aber in der nächsten Version noch ein bischen etwas. Dadurch wird dann Speicher eingespart.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Arkon on Sep 04, 2013, 12:24 pm
Ja, das funktioniert super :) Danke für die schnelle Antwort.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Arkon on Sep 07, 2013, 10:26 pm
Wenn ich einen Wunsch für die nächste (oder übernächste) Version äußern dürfte:

Ich springe beim Navigieren durch das Menu ab und an mal eine Stufe zu weit, da ich den Taster zu lange gedrückt halte. Eine Einstellungsmöglichkeit wie lange ich einen Taster gedrückt halten muss bis der Befehl wiederholt wird. So könnte man das Tasterverhalten auf seine persönlichen Fingerfertigkeiten anpassen :)

Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: skorpi080 on Sep 07, 2013, 11:03 pm
Diese Funktion gibts schon
Code: [Select]
/* Button press time gibt den puffer an nach welcher zeit der nächste
* Tastendruck gültig ist.
*/
#define _BUTTON_press_time                 200 //ms
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Sep 08, 2013, 07:16 pm
Hi,
so langsam komme ich einer stabilen Version näher.
Folgende Änderungen befinden sich in der Beta Version gegenüber der letzten stabilen Version

- Init Screen eingefügt, dieser kann in der Root-Ebene über den Quit Button erreicht werden
- Der Init Screen kann auch nach einer Zeit von X ms eingestellt werden
- Nachdem der Initscreen beendet wird, befindet sich das Menü auf der Grundebene
- Einen neuen Tab für die Kontrollmöglichkeiten eingebunden (analog, seriell, ...)
- Die Kontrollfunktionen "up", "down", "left" und "right" befinden sich nun in einer Funktion.
- Die Konfiguration von der Steuerung über einen analog Pin befindet sich im neuen Tab
- Abfrage der Buttons verändert; die neue Funktionen sehen etwas anders aus.
- mehr Konfigurationsmöglichkeiten geschaffen
- Umbenennung der Kontroll-/Steuerfunktionen
- Die Function "FuncEnd" akzeptiert keine Zahlenwerte größer 1.
- I2C eingebunden: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads Version 1.2.1
- Falls die I2C Schnittstelle aktiviert werden soll, muss die Datei LCDMenuLib___config.h bearbeitet werden.
- I2C Beispiel eingefügt, bitte den Punkt hierdrüber beachten, ansonsten treten Fehler auf.
- LiquidCrystal_SR eingebunden: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads Version 1.2.1
 SR => shiftRegister
- alle Konstanten einheitlich benannt
- Möglichkeit direkt zu einem Menüpunkt zu springen
- Möglichkeit zur Root-Eben zurück zu gehen
- mehr Kommentare in der Lib eingefügt



Beispiel - neue Abfrage der Buttons:
Code: [Select]

if(LCDML.checkButtons()) {
 //Irgend ein Button wurde betätigt
 if(LCDMenuLib_checkButtonLeft()) {
   // Der Linke Button wurde betätigt
   LCDMenuLib_resetButtonLeft();
       // Mach irgendetwas
   }
}


Beispiel - neue Steuerungsfunktionen
Code: [Select]

/* **************************************************** */
/* LCDMenuLib_control_serial     */
/* **************************************************** */
void LCDMenuLib_control_serial()
{
 if(Serial.available()) {
   if(LCDML.Timer(g_button_press_time, _BUTTON_press_time)) {
     switch(Serial.read()) {
       case 'e': LCDML.Button_enter(); break;
       case 'w': LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); break;
       case 's': LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); break;
       case 'a': LCDML.Button_up_down_left_right(_LCDMenuLib_button_left); break;
       case 'd': LCDML.Button_up_down_left_right(_LCDMenuLib_button_right); break;      
       case 'q': LCDML.Button_quit(); break;
       default: break;
     }
   }
 }
}


Beispiel - neue Konfigurationsmöglichkeiten (außerhalb der Konfigurationsdatei)
Code: [Select]

// Lib Config
#define _LCDMenuLib_cfg_initscreen                1    // 0=disable, 1=enable
#define _LCDMenuLib_cfg_initscreen_time         5000 // 0=time disabled, >0 waittime in ms
#define _LCDMenuLib_cfg_scrollbar 1    // 0=kein Scrollbalken 1=komplexer Scrollbalken 2=einfacher Scrollbalken
#define _LCDMenuLib_cfg_lcd_standard 0    // 0=HD44780 / 1=HD44780U


Beispiel - Direkt zu einem Menüpunkt springen:
Code: [Select]

LCDMenuLib_jumpToFunc(FUNC_p2);  //Springe zur Funktion "FUNC_p2"


Beispiel - Zurück zur Grund Ebene:
Code: [Select]

LCDML.goRoot()


Beispiel - neue Rückgabe Funktionen
Code: [Select]

LCDML.getFunction(); //liefert die id des aktiven Menüpunktes
LCDML.getLayer();  //Liefert die Ebene in der sich das Menü im Moment befindet
LCDML.getInitScreenActive(); // Liefert den Status des InitScreens


Beispiel - Zurück Button im Menü einbauen, falls kein Taster frei ist:
Code: [Select]

void FUNC_back(void)
 {      
   if(!LCDML.FuncInit()) {
     // Eine Ebene zurück gehen
     LCDML.Button_quit();        
   }    
   LCDML.FuncEnd(1, 0, 0, 0, 0, 0);            
 }


Insofern die gröbsten Fehler behoben sind/keine Fehler auftreten wird dies die nächste stabile Version.

Datei mit allen Änderungen befindet sich im ersten Beitrag.
Title: Re: Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Arkon on Sep 08, 2013, 07:57 pm

Diese Funktion gibts schon
Code: [Select]
/* Button press time gibt den puffer an nach welcher zeit der nächste
* Tastendruck gültig ist.
*/
#define _BUTTON_press_time                 200 //ms



oh,.... Danke!

Das kommt davon, wenn man die Kommentare nur überfliegt und nicht ins eigene Projekt übernimmt. Ich hatte die Funktion so im Gedächtnis, dass mit dem Wert angegeben wird, wie lange ein Taster gedrückt werden muss bevor es als Tastendruck erkannt wird...

Schande über mein Haupt ;)
Title: Re: Projekt: LCD Menu Lib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Sep 10, 2013, 11:50 pm
Hallo Jomelo,

danke für die neue  Version der Bibliothek. Es funktioniert soweit auch alles ganz fantastisch. Konnte bisher noch keine Fehler feststellen.

Es gibt noch eine Kleinigkeit die ich störend finde, aber mit der kann ich ach leben. Aber falls Du Zeit und Lust haben solltest:

Derzeit wird die "_LCDMenuLib_cfg_initscreen_time " immer dann abgewartet bevor der Init-Screen angezeigt wird, egal "von wo ich komme". Soll heissen, egal ob der Init-Screen aus dem Setup, oder als timeout aus dem level0 aufgerufen wird, es wird immer besagte Zeit gewartet. sobald ich mich in irgendeinem Menü (Level0 oder Level1 etc.) befinde, ist das ja auch ganz gut so, aber wenn ich den Init-Screen direkt nach dem Setup aufrufe würde ich gern auf dieses zwangsweise Warten verzichten. Ergo: Wäre es möglich die initscreen_time so zu implementieren das sie nur dann greift, wenn der timeout aus einem Menü heraus in den Init-Screen springt?

Ansonsten Super-Arbeit, und vielen Dank dafür.

Beste Grüße,
Jan
Title: Re: Projekt: LCD Menu Lib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Sep 11, 2013, 03:16 pm
Das ist gut, das alles funktioniert, ich bereite dann mal eine stabile Version vor.

Wenn das Menü direkt im InitScreen starten soll ist das bereits möglich. Füge einfach folgende Zeile unterhalb der Initialisierung aus:
Code: [Select]

void setup()
{   
  LCDMenuLib_setup(_LCDMenuLib_cnt);  /* Setup for LcdMenuLib */
 
  LCDML.Button_quit();   // diese Zeile einfügen
 
  Serial.begin(9600);                 /* start serial */ 
}

Title: Re: Projekt: LCD Menu Lib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: jabami on Sep 11, 2013, 11:14 pm
Hi Jomelo,

stimmt so geht es natürlich auch  :) . Vielen Dank für den Hinweis. Ich hab an meinem LCDKeypadShield gar keinen "Quit" Button, daher war mir dessen Funktion nicht so richtig geläufig. Wie auch immer, jetzt läuft alles soweit ganz wunderbar.

Eine Frage noch, hast Du eine Idee wie man eine Menufunktion beenden kann, und gleich danach eine neue aufrufen (siehe STOP Condition in unterem Beispiel)? Und das programmatisch? Das hier funktioniert leider nicht:

Code: [Select]

/* ==========================
* KALIBRIERUNG
*
* Description:
* This function allows for the
* calibration of the hot-gas temperature
* sensor (Temp1).
* ========================= */

/* Global variables for this function */
byte calibration = 0;
 
 void FUNC_PT100Calibration(void)
 {  
 /* --------- INIT ---------
    * Initialization of this function
    * is only being done once at the start of the function
    * after that only, if the menu has been exited
    * and if no variables have to be initialized, this function  
    * can be started with if(!LCDML.FuncInit()) .... with
    * LCDML.FuncInit();
    */  
   if(!LCDML.FuncInit())
   {
     /* Init Function */            
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print(F("Kalibrierung ?:"));
     lcd.setCursor(3,1);
     lcd.print(F("Ja"));
     lcd.setCursor(9,1);
     lcd.print(F("Nein"));
     lcd.setCursor(8,1);
     lcd.write(B10100101);
     lcd.setCursor(2,1);
     lcd.write(B11111110);
     calibration = 0;
   }

   /* --------- LOOP ----------
    * This is the place for code which is going to be repeated constantly
    * e.g. a time-diplay or the like.
    */
    if(LCDML.checkButtons()) {
     if(LCDMenuLib_checkButtonLeft()) {
       LCDMenuLib_resetButtonLeft();
        lcd.setCursor(2,1);
        lcd.write(B10100101);
        lcd.setCursor(8,1);
        lcd.write(B11111110);
        calibration = 1;
      }
      else if(LCDMenuLib_checkButtonRight()) {
       LCDMenuLib_resetButtonRight();
        lcd.setCursor(8,1);
        lcd.write(B10100101);
        lcd.setCursor(2,1);
        lcd.write(B11111110);
        calibration = 0;
      }
    }
   
   /* --------- STOP  ---------      
    * LCDML.FuncEnd (direct, enter, up, down, left, right)
    * If there´s no variable which has to be reset, than this
    * function can be simply called by CTR_end(0, 1, 1, 1, 1, 1);
    * The end conditions need to be declared by numbers >0
    * If all entries are 0, the program will be hanging within that function.
    */
   if(LCDML.FuncEnd(0, 1, 0, 0, 0, 0))
   {
     /* If there are any variables which need to be reset this can be done within
      * this IF-loop.
      */
      if (calibration == 1){LCDMenuLib_jumpToFunc(FUNC_CalibrationRoutine);}
   }    
 }


Vielen Dank,
Jan  
Title: Re: Projekt: LCD Menu Lib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set )
Post by: Jomelo on Sep 12, 2013, 07:25 am
Guten Morgen,
so etwas habe ich noch nie getestet.

Eventuell mit einer globalen Variable die du in der End Bedingung setzt und in der Loop Schleife führst du dann folgendes aus:

if(Variable_...== 1) { Variable_...=0; JumpTo(...)}
Title: Re: Projekt: LCDMenuLib - Arduino - Menü mit mehreren Ebenen - 4Bit - I2C - ShiftReg
Post by: jabami on Sep 13, 2013, 01:54 am
Hallo Jomelo,

ich wollt nur kurz bescheid geben, das mein weiter oben eingefügter Code jetzt funktioniert. Letztendlich setzt er ja fast genau das um was Du vorgeschlagen hast. Wie auch immer, einen kleinen Bug konnte ich entdecken. Die "LCDMenuLib_jumpToFunc(FUNC_SOMETHING);" funktioniert nur dann wenn sich "FUNC_SOMETHING" im selben Level befindet wie die aufrufende Funktion. Ergo, ich kann den Befehl nicht nutzen um in eine beliebige Funktion in einer beliebigen Menutiefe zu springen. Jedenfalls funktioniert das bei mir nicht.

Beste Grüße,
Jan
Title: Re: Projekt: LCDMenuLib - Arduino - Menü mit mehreren Ebenen - 4Bit - I2C - ShiftReg
Post by: Jomelo on Sep 13, 2013, 07:39 am
Danke für den Hinweis, ich werde das heute Nachmittag beheben. Die Änderung befindet sich dann in der Version die im ersten Beitrag verlinkt ist. Die Beschreibung/Dokumentation wird noch überarbeitet.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Sep 13, 2013, 04:17 pm
Das Problem ist nun behoben. Die stabile Version ist im ersten Beitrag verlinkt.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: jabami on Sep 18, 2013, 12:36 am
Hallo Jomelo,

ich bins nochmal. Hab mein Problem lösen können. Ich habe herausgefunden das folgendes dazu führt das ich für meinen Fall in eine beliebige Menüfunktion springen kann:

Code: [Select]

            LCDML.goRoot(); // first go to root-level..
            LCDMenuLib_jumpToFunc(FUNC_CalibrationRoutine); //...then jump to calibration routine

Sieht komisch aus, is aber so.

Da kommt auch schon gleich das nächste Problem daher. Ich finde die "_LCDMenuLib_cfg_initscreen_time " eine wirklich tolle Sache, aber beim kalibrieren meiner Sensoren müsst ich sie programmatisch abschalten und beim verlassen der Funktion wieder zuschalten können.  Geht das bereits mit Deiner Lib? Wenn ja, wie könnt ich das machen?
Derzeit wird mein Kalibriervorgang, der knappe 20 sec. dauert, durch die "_LCDMenuLib_cfg_initscreen_time" gekillt.

Danke schonmal im vorraus für irgendwelche Ideen.

Beste Grüße,
Jan
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Sep 18, 2013, 08:46 am
Hi,
du könntest die Zeit für den InitScreen zwischen deinen Kalibrierungsschritten wieder hochsetzen.


Code: [Select]

//Zeit zurücksetzen/hochsetzen:
g_LCDMenuLib_cfg_initscreen_time = millis()+(_LCDMenuLib_cfg_initscreen_time);

//InitScreen direkt Starten
g_LCDMenuLib_cfg_initscreen_time = 0;


Man könnte diese Funktionalität auch in ein Makros legen
Code: [Select]

#define LCDMenuLib_initscreenRestartTime()     g_LCDMenuLib_cfg_initscreen_time = millis()+(_LCDMenuLib_cfg_initscreen_time);
#define LCDMenuLib_initscreenStart()               g_LCDMenuLib_cfg_initscreen_time = 0;

//Aufruf dann mit
LCDMenuLib_initscreenRestartTime();
//oder
LCDMenuLib_initscreenStart();


In der nächsten Version heißen die Funktionen dann
LCDMenuLib_IS_reStartTime() und LCDMenuLib_IS_startDirect()
Diese lade ich aber erst hoch, sobald mehrere Änderungen vorhanden sind.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: cookieofbliss on Sep 19, 2013, 06:46 pm
Danke für deine Arbeit.

Doch wie kann man das (gesamte) Menü wieder beenden? Ich würde gerne im rootMenu mit dem Back-Knopf das Menü verlassen.

Welche Variable beschreibt denn dass wir uns im rootMenu (Also in der "obersten" Ebene) befinden? Ich habe es bereits mit if (curMenu == rootMenu)... versucht, scheint jedoch nicht zu klappen.

lg,

Code: [Select]
void LCDMenuLib::exitmenu()
{
if (curMenu == rootMenu) {
g_button_back_boolean = true;
}
}

// Funktion wird aufgerufen in Funktion Button_quit()
// g_button_back_boolean ist definiert und sollte auch funktionieren.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Sep 19, 2013, 07:05 pm
Ein Verlassen des Menüs ist bisher nicht möglich, da man es eigentlich auch nicht braucht.
Die Menü Funktionen laufen alle in Schleifen ab, so dass diese immer erneut wieder aufgerufen werden.

Alternative könnte man im Hintergrund Funktionen aufrufen die Aufgaben erledigen. Mehr dazu steht hier:
http://forum.arduino.cc/index.php?topic=165552.0

Man könnte es ausblenden mit lcd.clear() und wieder anzeigen lassen mit LCDML.display(), aber ein komplettes verlassen der Struktur ist nicht möglich.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: jabami on Sep 28, 2013, 06:26 pm
Hallo Jomelo,

gibt es eine Möglichkeit einen Menüpkt. aus dem Menü auszublenden? Ich habe eine Funktion, die als LCDM_Function realisiert ist, diese soll aber keinen Menüeintrag bekommen, sonder sie soll ausschließlich über den Befehl "LCDMenuLib_jumpToFunc" erreichbar sein. Derzeit funktioniert das leider nur wenn ich diese Funktion auch in LCDM_Menu aufgeführt ist, sie also im Menü sichtbar ist. Hast Du eine Idee was ich da machen könnte?

DAnke und beste Grüße,
Jan
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Sep 29, 2013, 01:02 pm
Hi,
das ist so nicht möglich und da wird auch nicht integriert werden.

schau dir mal diese Lib an:
http://forum.arduino.cc/index.php?topic=165552.0

mit dieser könnte man das Problem lösen.
Erstell einen Thread der am Anfang nicht läuft.

Anstatt jumpTo XX machst du dann  Thread xx Start.

Sobald der Thread dann beendet werden soll kann man dieses mit Thread stop machen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: cookieofbliss on Sep 29, 2013, 04:16 pm
Hallo.

Habe das neue Update gemacht.
Ich habe die Uhrzeit in der Funktion "init_screen".
Leider startet der "Init Screen" nicht zu Beginn, sondern erst nach der vorgegeben Zeit.
"InitScreen aktivierbar, dieser wird nach X Sekunden und/oder zu Beginn angezeigt"
Wo kann ich einstellen, dass es auch zu Beginn angezeigt wird?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Sep 29, 2013, 05:17 pm
Das ist noch schlecht dokumentiert.

Entweder mit
Code: [Select]

void setup()
{
  // Initialisierung
  //..
  //.. LCDMenuSetup ...
  //..

  // init screen aktivieren: Funktioniert nur auf Ebene 0
  LCDML.Button_quit();
}


oder

Code: [Select]

void setup()
{
  // Initialisierung
  //..
  //.. LCDMenuSetup ...

  //InitScreen direkt Starten: Funktioniert immer
  g_LCDMenuLib_cfg_initscreen_time = 0;
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Sep 30, 2013, 09:01 am
Antwort auf die folgende Fragestellung in diesem Thread, da ansonsten zu viel gesprungen wird und die Themen sich komplett vermischen:
http://forum.arduino.cc/index.php?topic=165552.msg1410421#msg1410421


Ich glaub du verstehst einige Dinge noch nicht so richtig ;-).

Also bei dieser simpleThread Lib ist der Hintergedanke, dass deine Funktion / Thread nur alle xxx Millisekunden aufgerufen wird, daher benötigst du auch kein Delay. Die simpleThreads sollen einem dabei Helfen den Millis-Timer nicht immer selbst per Hand neu schreiben zu müssen.
Ich befürchte dass ich dir den falschen Tipp gegeben habe, da du ausgaben auf dem LCD in dieser Funktion benötigst, macht es keinen Sinn diese Lib einzusetzen.

So nun noch etwas zum allgemeinen, die simpleThread Lib ist eigentlich dafür gedacht keine LCD Ausgaben zu beinhalten, falls auch die LCDMenuLib eingebunden ist. Es könnte passieren das die eine Funktion in der einen Lib andere Inhalte im Menü einfach überschreibt. Wieso willst du denn eigentlich im Menü eine Funktion haben die nicht angezeigt wird, aber aufgerufen wird.

Bau den Inhalt dieser Funktion doch in dem aktuellen Menüpunkt ein in dem du dich gerade befindest mit:

Code: [Select]

FUNC_xyz .....
{
    //func_setup ....

    // anstatt jumptoXYZ
    // setze variable xyz
    if(xyz == 1) {
      //zeige deinen code an
    }
}


Ich nutze die Timer Funktion bei mir so, dass ich das Display minimal jede Sekunde aktualisiere, aber nur dann wenn Änderungen vorhanden sind. Also:
Code: [Select]

long g_timer_display_refresh = 0;
boolean g_display_refresh = 0;

void FUNC_dummy(void)
  {   
    /* --------- INIT ---------
     * Initialisierung dieser Funktion
     * wird nur einmal beim Start dieser Funktion ausgefuert
     * danach nur erneut, wenn die Menu Funktion verlassen wurde
     * wenn keine Variablen initialisiert werden müssen, kann diese
     * Funktion anstatt mit if(!LCDML.FuncInit()) ....     mit
     * LCDML.FuncInit();  aufgerufen werden     
     */   
    if(!LCDML.FuncInit())
    {
      /* Init Function */           
    }
    /* --------- LOOP ----------
     * Hier sollte der Code stehen der ständig neu geladen wird
     * z.B. eine Uhrzeit oder änliches.
     */
    if(LCDML.checkButtons()) {
       //Änderung am Button erkannt, Display soll aktualisiert werden
       g_display_refresh = 1;
    }


    if(LCDML.Timer(g_timer_display_refrech, 1000) && g_display_refresh == 1)
    {
      g_display_refresh = 0;
      lcd.clear();
      //...

      // Führe eine Änderung am Display aus.
   }
   
   
    /* --------- STOP  ---------     
     * LCDML.FuncEnd(direct, enter, up, down, left, right)
     * Falls in dieser Funktion keine Variablen zurückgesetzt werden
     * müssen, kann diese Funktion auch vereinfacht mit LCDML.FuncEnd(0, 1, 1, 1, 1, 1);
     * aufgerufen werden. Die Endbedingungen können durch 1 aktiviert oder 0 deaktiviert 
     * werden
     * Wenn alles 0 ist, hängt das gesammte Programm in dieser Funktion fest
     */
    if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1))
    {
    /* Bei allen Parameter gilt bei '0': nichts machen.
      * Parameter 'direct':
      * Die Funktion wird direkt beendet ohne auf weitere Ereignisse zu warten
      * Parameter 'enter', 'up', 'down', 'left', 'right':
      *   Wenn z.B. 'enter' = 1 ist, muss einmal die Enter Taste gedrückt werden,
      *   damit die Funktion beendet wird.
      *   Wenn z.B. 'enter' = 2 ist, muss zweimal die Enter Taste gedrückt werden,
      *   damit die Funktion beendet wird.
      * Dieses gilt bei den anderen Buttons 'up', 'down', ... genauso.
      */

      /* Falls noch Variablen zurückgesetzt werden müssen, bevor diese Funktion
       * verlassen wird, kann dies in dieser If Schleife geschehen
       */
    }     
  }
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Alexikon on Oct 03, 2013, 05:30 pm
Hallo,
ich versuche momentan noch das i2c Beispiel in Gang zu bekommen.
Erstmal eine super Idee und genau das was ich suche.
Leider erhalte ich folgende Meldung beim überprüfen des Codes:

Code: [Select]

lcdml_i2c:56: error: invalid conversion from 'int' to 't_backlighPol'
lcdml_i2c:56: error: initializing argument 3 of 'LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, t_backlighPol)'


Ich habe beide Libs von der ersten Seite hinterlegt und frühere LCD_Libs vorsichtshalber entfernt.
Die LCDMenuLib___config habe ich wie folgt angepasst:

Code: [Select]

#ifndef LCDMenuLib___config_h

//backlight
#define _LCDMenuLib_LCD_backlight 0
#define _LCDMenuLib_LCD_backlight_pol 0
//i2c address
#define _LCDMenuLib_LCD_addr 0x27


# define LCDMenuLib___config_h
//
// ====================================================================================================
// 0:10  LiquidCrystal (orginal) or LiquidCrystal_new Version 1.2.1 (normal)
// ====================================================================================================
//# define _LCDMenuLib_cfg_lcd_type 0 // 4Bit (tested)
//# define _LCDMenuLib_cfg_lcd_type 1 // 4Bit with rw (tested)
//# define _LCDMenuLib_cfg_lcd_type 2 // 4Bit with backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 3 // 4Bit with rw,backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 4 // 8Bit (tested)
//# define _LCDMenuLib_cfg_lcd_type 5 // 8Bit with rw (tested)
//# define _LCDMenuLib_cfg_lcd_type 6 // 8Bit with backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 7 // 8Bit with rw,backlight (tested)
// ====================================================================================================
// 10:20  LiquidCrystal_I2C from LiquidCrystal_new Version 1.2.1 (I2C)
// ====================================================================================================
//# define _LCDMenuLib_cfg_lcd_type 10 // I2C (tested)
# define _LCDMenuLib_cfg_lcd_type 11 // I2C with backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 12 // I2C with e,rw,rs
//# define _LCDMenuLib_cfg_lcd_type 13 // I2C with e,rw,rs,backlight
//# define _LCDMenuLib_cfg_lcd_type 14 // I2C with e,rw,rs,dat0,dat1,dat2,dat3
//# define _LCDMenuLib_cfg_lcd_type 15 // I2C with e,rw,rs,dat0,dat1,dat2,dat3,backlight
// ====================================================================================================
// 20:30 LiquidCrystal_SR from LiquidCrystal_new Version 1.2.1 (ShiftRegister)
// ====================================================================================================
//# define _LCDMenuLib_cfg_lcd_type 20 // SR
#endif


Hat jemand eine Idee wo das Problem liegt?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Oct 03, 2013, 05:38 pm
Lies mal etwas hier: http://arduino-info.wikispaces.com/LCD-Blue-I2C

Da steht sowas wie:
Code: [Select]
//                                 addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


Also in POSITIVE ändern und es sollte laufen. Standardmäßig steht da 0
EDIT: In dem Sketch muss es geändert werden, nicht config
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 03, 2013, 05:47 pm
Eventuell fehlen die Backlight defines. Schau mal im ersten Beitrag unter Punkt vier nach.

Im Beispiel werden nicht alle defines festgelegt, da die je nach Konfiguration nicht verwendet werden.

//backlight
#define _LCDMenuLib_LCD_backlight                 0
#define _LCDMenuLib_LCD_backlight_pol             0

Vielleicht muss auch die backlight_pol auf positiv gesetzt werden, wobei das auch nur ein Zahlenwert ist.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Oct 03, 2013, 05:53 pm
Moin Jomelo.
Wollte nur mal bescheid geben dass die Lib nachdem ich die config angepasst hab funktioniert, MAC OS X 10.9 (hackintosh) und Arduino 1.0.5
Allerdings wird nix auf dem LCD angezeigt, liegt nicht an deiner Lib.
Habe so ein l2C gekauft und mal an das Keypad Shield dran gehalten, ohne zu löten. Den Kontrast kann ich nur ändern, sonst zeigt nix.
Habe diese Beispiele ( http://arduino-info.wikispaces.com/LCD-Blue-I2C ) getestet, zeigt auch nix an.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: jabami on Oct 05, 2013, 03:36 pm
Hi Jomelo,

... Wieso willst du denn eigentlich im Menü eine Funktion haben die nicht angezeigt wird, aber aufgerufen wird.
Bau den Inhalt dieser Funktion doch in dem aktuellen Menüpunkt ein in dem du dich gerade befindest.....

Ich brauche eine Funktion (MIT SETUP!) die ich ausführen kann nachdem der Benutzer im Menü bestätigt hat das er diese Funktion auch tatsächlich ausführen will.
Problematisch dabei ist, dass ich für die im Hintergrund zu laufende, und vom User aufzurufende Funktion ein Setup benötige das ich erst im dem Moment ausführen möchte in welchem sich der User dazu entschieden hat o.g. Funktion auszuführen. Das Setup soll natürlich nur einmal ausgeführt werden. Anschließend soll die loop funktion alle benötigten Aufgaben übernehmen. Alles eigentlich bereits in der LCDMenuLib enthalten, nur das ich keine Funktion verstecken kann. Alle Funktionen in der LCDMenuLib müssen auch im Menü auftauchen (aber genau das möchte ich für besagte Funktion nicht).
Mit der simpleThreads Library kann ich zwar nun Threads, also quasi Funktionen, kreieren die eventbasiert (nach Userbestätigung) ausgeführt werden, aber gmäß Deiner Aussage kann ich keine LCD Ausgaben für Funktionen dieser Library nutzen. Zudem habe ich nach wie vor das Problem, dass wenn ich eine simpleThread Funktion aus einer LCDMenuLib Funktion heraus aufrufe, das Setup für die simpleThread-Funktion nicht ausgeführt wird. Ich muss das Setup explizit mit "simpleThread_call_setup(THREAD_Function)" aufrufen um es auszuführen. Ein Aufruf mit "simpleThread_start(THREAD_Function)" startet nur den Loop-Teil (" boolean simpleThread_loop(THREAD_Function)").

Da mir die simpleThread Library gefällt, und ich weitere Funktionen mit dieser realisieren möchte, wäre es toll wenn ich das oben genannte Problem gelöst bekäme. Und wie gesagt ich benötige eine setup routine um während der Laufzeit entstandene Einstellungen an Sensoren zu übergeben.


Mein minimal Beispiel würde so aussehen:
Code: [Select]

void FUNC_LCDMenuFunction(void)

  /* --------- INIT ---------*/
    if(!LCDML.FuncInit())
    {
          lcd.print(F("FunctionInit"));
    }
  /* --------- LOOP---------*/
    if(LCDML.checkButtons())
    {
    if(LCDMenuLib_checkButtonEnter())
           {
            LCDML.FuncEnd(1,0,0,0,0,0); // quit this Function
            simpleThread_start(THREAD_Function); //  jump to new Thread 
            }
    }



Beste Grüße,
Jan
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 06, 2013, 09:33 am
Hi,
ich musste gerade erst selbst suchen, bis es mir wieder eingefallen ist.

Mit  simpleThread_start kannst du einen Thread starten. Wenn dieser noch nie zuvor ausgeführt wurde wird auch das Setup ausgeführt. Sobald dieser Thread mit Stop beendet wird, kann dieser mit Start erneut gestartet werden, aber die setup Funktion wird nicht aufgerufen.

Wenn du die Funktion  simpleThread_restart verwendest verhält diese sich sehr ähnlich, nur das der Thread zurückgesetzt wird und das Setup erneut aufgerufen wird.

Ich denke das behebt dein erstes Problem.

Du kannst natürlich wenn du willst auch lcd Ausgaben in der simpleThread machen, nur ist es nicht möglich das Menü zu beenden, sprich du müsstest dir einen Thread basteln der die LCDMenuLoop beinhaltet und z.B: Thread_lcdRefresh heißt und alle 500 ms aufgerufen wird.

Nun könntest du von deinem aktuellen Thread den Menü Thread Stoppen, sprich das Menü wird nicht mehr angezeigt. Nun ist es möglich mit lcd.clear das Menü mit eigenen Inhalten zu füllen. Sobald dann wieder das Menü angezeigt werden soll, kannst du mit Thread_start ... den Menü Thread wieder ausführen. Eventuell ist noch ein LCDML.display() vor dem Thread start nötig, damit alles angezeigt wird.

Da du nun aber Ausgaben auf dem Display in Threads und im Menü hast wird es schnell wieder unübersichtlich.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Alexikon on Oct 07, 2013, 07:20 pm
Hallo,

skorpi08.... das wars. Hat funktioniert. Vielen Dank für den Hinweis.

Hat denn schon jemand Erfahrungen gesammelt mit Drehgebern als Bedienelement?
Ich möchte am Ende mit dem Drehgeber die Menüpunkte durchlaufen und mit dem integrierten Taster die zugeordnete Funktion ausführen.

Hat da schon jemand ein Beispiel?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 07, 2013, 10:35 pm
Hi, wenn du weißt wie du den Drehgeber auslesen kannst, ist das kein Problem. Das Menü unterstützt folgende Steuerfunktionen:
Code: [Select]

LCDML.Button_enter();
LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);
LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);
LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);
LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);     
LCDML.Button_quit();


Die Buttons left, right, und quit sind Optional und lassen sich auch durch Funktionen im Menü ersetzen. Irgendwo in diesem Thema habe ich mal gezeigt wie der Quit Button ersetzt werden kann.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Cherubim on Oct 15, 2013, 04:25 pm
Hi,

erstmal danke für die tolle Library. Ich habe ein Problem mit der LCDML.getFunction():
Wenn der Init Screen aktiv ist zeigt sie noch immer die vorherige Funktion an.
Beispiel: Ich gehe in Funktion ID 2, warte bis der Init Screen aktiv wird -> LCDML.getFunction() gibt mir noch immer 2 zurück.
Das finde ich ein wenig komisch vom Verhalten.

Klar könnte ich noch zusätzlich LCDML.getInitScreenActive() abfragen, aber ist das wirklich so gewollt?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 15, 2013, 06:49 pm
Hi,
ich würde sagen, das ist ein Bug.
Ursprünglich war es so, dass wenn der init Screen beendet wird, die Funktion aus der der Screen aufgerufen wurde wieder aktive ist. Mit einem der letzten Updates habe ich es so geändert, das man dann auf der Root Ebene landet. Anscheinend wird hier der Funktionsmerker noch nicht zurückgesetzt.

Danke für den Hinweis, in der nächsten Version ist es behoben.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Cherubim on Oct 15, 2013, 08:17 pm
Freut mich wenn ich helfen kann :)
Ich finde es auch besser so wenn man nach dem Init Screen wieder im Root Menü landet.
Kannst du mir nen Tipp geben wo ich den Funktionsmerker zurücksetzen kann?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 15, 2013, 08:34 pm
Ich habe im Moment keinen Aubau hier um die Änderung zu testen, aber probier mal folgendes:

Geh ins LCDMenuLib Verzeichnis und öffne die LCDMenuLib.cpp

in Zeile 125 befindet sich die Funktion  LCDMenuLib::goRoot() { ...

Änder die Funktion mal wie folgt um und füg die fehlende Zeile ein:
Code: [Select]

void LCDMenuLib::goRoot()
{
button = 0;
while(layer > 0) { Button_quit(2); }
Button_quit(2);
while(cursor_pos > 0) { Button_up_down_left_right(_LCDMenuLib_button_up); }
       g_function = _LCDMenuLib_NO_FUNC; // diese Zeile neu einfügen
}


Ich hoffe das löst dein Problem.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Cherubim on Oct 16, 2013, 11:27 am
Hi,

das hat leider keinen Effekt gehabt. Ich habe mir das Verhalten auch nochmal genau angeschaut: Die getFunction() scheint generell nen Bug zu haben, denn auch wenn ich aus einer Funktion rausgehe behält sie den alten Wert bei. Erst wenn ich eine andere Funktion aufrufe wird der Wert aktualisiert.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 16, 2013, 12:47 pm
Dann kümmer ich mich da mal demnächst in Ruhe drum. Im Moment habe ich leider nur sehr begrenzt Zeit.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 16, 2013, 07:15 pm
Ich habe gerade nochmal ein wenig Zeit investiert und verschiedene Varianten ausprobiert.

Also ursprünglich war die Funktion in der Klasse als Private deklariert und öffentlich nicht verfügbar. Nachdem einige hier nachgefragt hatten habe ich die Funktion verschoben. Intern hängen von der Funktion aber viele Werte ab und mir ist bisher noch keine Möglichkeit bekannt, direkt die Funktions ID auszugeben außer diese mit einer if Abfrage zu verknüpfen.

Also im Moment gibt es keine andere Lösung wie die, die du bisher herausgefunden hast. Alternative müsste ich größere Teile der Lib verändert um die Funktionalität zu gewährleisten oder eine neue Variable die wieder ein Byte belegt hinzufügen, damit die Id getrennt gespeichert wird.

Die If Abfrage kann man auch schön in einer Makro Funktion verstecken. Diese müsste in der LCDMenuLib_makros.h eingefügt werden.
Code: [Select]

...
#ifndef LCDMenuLib_macros_h
#define LCDMenuLib_macros_h
...
// hier irgendwo einfügen wo platz ist
#define LCDMenuLib_getActiveFuncId() ((bitRead(LCDML.control,_LCDMenuLib_control_funcsetup) == 1)?LCDML.getFunction():_LCDMenuLib_NO_FUNC)

...


Sobald du nun das Makro im Programm aufrufst, liefert dir dies die Funktion ID, nur wenn die Funktion aktive ist.
Beispiel:
Code: [Select]

void loop()
{  
 //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
 //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
 LCDMenuLib_control_serial();        /* lcd menu control */  
 LCDMenuLib_loop();                  /* lcd function call */

 //other function ... for example simple threads ..
 // Ausgabe der Funktions ID, 255 => keine Funktion aktiv.
 Serial.println(LCDMenuLib_getActiveFuncId());  
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Cherubim on Oct 17, 2013, 12:12 pm
Funktioniert super  8)

Danke für deine Hilfe!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: jabami on Oct 18, 2013, 01:06 am
Hallo Jomelo,

mein Projekt neigt sich so langsam dem Ende zu. Alles funktioniert hervorragend. Danke nochmal für die LCDMenuLib und deine simpleThreads Bibliothek. Jetzt bin ich dabei noch zwei drei Sachen aufzuhübschen. Daher nur ganz kurz die Frage ob man eigens definierte custom LCD Characters auch in einer Menübezeicnung verwenden kann? Ich habe konkret das Problem das ich ein m-Punkt (also einen Massenstrom) in einer Menübezeichnung bräuchte. Hab dafür einen custom LCD Character implementiert den ich bereits an anderer Stelle nutze.

Beste Grüße,
Jan
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 18, 2013, 02:52 pm
Hi,
das geht so nicht. Die String Texte die man eingibt werden im Flash Speicher abgelegt. Ich wüsste nicht wie man dort noch in einem String ein Custom Char integrieren könnte.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Cherubim on Oct 18, 2013, 03:54 pm
Eventuell gehts über die Steuercodes des Diplays.
Ich schreibe z.B. "zurück" so: "zur" "\xF5" "ck" weil ich ein Display mit japanischem Zeichensatz habe. Wenn du das Zeichen eh schon geladen hast könntest du es evtl. so auch im Menü anzeigen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: jabami on Oct 18, 2013, 10:01 pm
Hallo Cherubim,

vielen Dank, genau das wars. Man kann jeweils mit

\x00
\x01
\x02
... bis
\x07 [-> HD44780 erlauben 8 Custom Characters]

die selbst definierten Custom characters im Menü aufrufen. Mein Menüpunkt sieht demzufolge jetzt so aus:
Code: [Select]

  LCDMenuLib_element(9  , Item_4       , Item_4_6      , "\x05""-Hysterese"     , FUNC);


Is genau das was ich wollte. Nochmals Danke.

Beste Grüße,
Jan
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Oct 18, 2013, 10:03 pm

Hallo Cherubim,

vielen Dank, genau das wars.
......
. Nochmals Danke.



Funktioniert auch über den Karma Button  8)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 19, 2013, 02:22 am
Hi, netter Trick, den kannte ich auch noch nicht ;-)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Cherubim on Oct 22, 2013, 02:22 pm

.....
Die If Abfrage kann man auch schön in einer Makro Funktion verstecken. Diese müsste in der LCDMenuLib_makros.h eingefügt werden.
Code: [Select]

...
#ifndef LCDMenuLib_macros_h
#define LCDMenuLib_macros_h
...
// hier irgendwo einfügen wo platz ist
#define LCDMenuLib_getActiveFuncId() ((bitRead(LCDML.control,_LCDMenuLib_control_funcsetup) == 1)?LCDML.getFunction():_LCDMenuLib_NO_FUNC)

...

....



Ich habe das alles nochmal durchgespielt und da fehlt noch ne Bedingung im Makro. Der Initscreen muss auch geprüft werden, also müsste die Zeile lauten:
Code: [Select]

#define LCDMenuLib_getActiveFuncId() ((bitRead(LCDML.control,_LCDMenuLib_control_funcsetup) == 1 && LCDML.getInitScreenActive() == false)?LCDML.getFunction():_LCDMenuLib_NO_FUNC)

Ansonsten wird die Variable wieder nicht zurückgesetzt wenn der Init Screen durch einen Timeout gestartet wird.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Skysurfer on Nov 04, 2013, 10:26 pm
Hallo Jomelo,
die Lib hat mir bei meinem aktuellen Projekt sehr geholfen. Was ich jedoch noch brauche, ist die Funktionalität, dass man sich z.B. mit der Left-Taste in der Menüstruktur aufwärts bewegen kann. Konkret ist es bei meinem Projekt so, dass ich ein Menüeintrag "Einstellungen" mit mehreren Unterpunkten habe und ich diesen Menüpunkt wieder ins Hauptmenü verlassen will.

Ist diese Funktionalität vorgesehen oder gibt es einen Workaround?

Viele Grüße Skysurfer
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 04, 2013, 11:44 pm
Hi, das kannst du beliebig anpassen. Schau dir mal in den ersten zwei Beiträgen den Punkt 9 (Steuerungsmöglichkeiten) an. Die Anpassungen kannst du dann im LCDML_control Tab anpassen, falls du den Namen des Tabs so belassen hast.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: auqareinz on Nov 10, 2013, 05:44 pm
Hallo Jomelo,
Ist es möglich die Element ID auszulesen die aktuell angewählt ist?
Ich hab es mit LCDML.getFunction ( ) versucht aber sobald eine Funktion hinter dem Element steht wir nichts mehr ausgegeben.

Beste Grüße
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 10, 2013, 06:55 pm
Ja, schau mal drei Beiträge weiter oben nach, da steht es erklärt:
http://forum.arduino.cc/index.php?topic=73816.msg1437935#msg1437935

Die Funktion "LCDML.getFunction ( )" funktioniert zwar so wie sie soll, aber die Namensgebung ist dumm gewählt. In der nächsten Version werde ich den Namen der Funktion verändert und die oben im Link genannte Funktion an diese Stelle setzen.

Füge einfach in die LCDMenuLib_makros.h  unterhalb von diesem Quelltext:
Code: [Select]

//...
#ifndef LCDMenuLib_macros_h
#define LCDMenuLib_macros_h
//..

// Diese Zeile neu ein:
#define LCDMenuLib_getActiveFuncId() ((bitRead(LCDML.control,_LCDMenuLib_control_funcsetup) == 1 && LCDML.getInitScreenActive() == false)?LCDML.getFunction():_LCDMenuLib_NO_FUNC)


In deinem Programm kannst du dann mit:
Code: [Select]

if(LCDMenuLib_getActiveFuncId() ==  XXXX) {


Die Funktion verwenden / abfragen. Der Rückgabewert ist 8Bit groß und vom Datentype: uint8_t  oder unsigned char
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: auqareinz on Nov 10, 2013, 10:30 pm
Danke für die schnelle Hilfe klappt einwandfrei  :)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Nov 20, 2013, 11:15 pm
TOP Arbeit, vielen Dank  XD
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Lena on Nov 21, 2013, 11:39 am
Hey Jomelo,

zunächst einmal Respekt und herzlichen Dank für diese super Arbeit - sowas hat wirklich gefehlt.
Nur bin ich leider zu blöd meine Tasten richtig zu konfigurieren.
Dein Beispiel (analog) wird sauber kompiliert, mein selbst gebasteltes 16*2 Display und meine ebenfalls selbst gebastelte 5-Tasten Tastatur funktionieren nach Anpassung der Pins und Analogwerte soweit auch einwandfrei.
Ich scheitere nur daran, mit der Links-Taste im Menü eine Ebene zurück zu gehen, was ja ohne Back/Quit-Taste intuitiv sinnvoll wäre.
Das die Links-Taste als solche erkannt wird, schließe ich daraus, daß die Bedingung "3 mal Links drücken" wie erwartet funktioniert.
In Deinem zweiten Beitrag schreibst Du zwar "kann konfiguriert werden", doch genau an dem Punkt habe ich einen Knoten zwischen den Ohren.
Hilf mir doch mal bitte einer von Euch auf die Sprünge.

Vielen Dank

Lena
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 21, 2013, 11:51 am
Hi,
im Tab LCDML_control befinden sich die Funktionen zur Ansteuerung:

z.B.:
Code: [Select]

#define _BUTTON_analog_enter_min     850     // Button Enter
  #define _BUTTON_analog_enter_max     920 
  #define _BUTTON_analog_up_min        520     // Button Up
  #define _BUTTON_analog_up_max        590   
  #define _BUTTON_analog_down_min      700     // Button Down
  #define _BUTTON_analog_down_max      770   
  //optional if menu element "back" exists, look at FUNC_back in functions tab
  #define _BUTTON_analog_enable_quit   1
  #define _BUTTON_analog_back_min      950     // Button Back
  #define _BUTTON_analog_back_max      1020   
  //optional if needed
  #define _BUTTON_analog_enable_lr     1
  #define _BUTTON_analog_left_min      430     // Button Left
  #define _BUTTON_analog_left_max      500   
  #define _BUTTON_analog_right_min     610     // Button Right
  #define _BUTTON_analog_right_max     680   

if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) {
    if(value >= _BUTTON_analog_enter_min && value <= _BUTTON_analog_enter_max) {        // control enter
      LCDML.Button_enter();
    } 
    else if(value >= _BUTTON_analog_up_min && value <= _BUTTON_analog_up_max) {      // control up
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);
    }
    else if(value >= _BUTTON_analog_down_min && value <= _BUTTON_analog_down_max) {   // control down
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);
    }   
    else if(value >= _BUTTON_analog_left_min && value <= _BUTTON_analog_left_max && _BUTTON_analog_enable_lr == 1) {   // control left
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);
    }
    else if(value >= _BUTTON_analog_right_min && value <= _BUTTON_analog_right_max && _BUTTON_analog_enable_lr == 1) { // control right
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);
    }
       
    if(value >= _BUTTON_analog_back_min && value <= _BUTTON_analog_back_max && _BUTTON_analog_enable_quit == 1) {          // control quit
      LCDML.Button_quit();
    }


Entweder trägst du deine Zahlenwerte vom Button Left einfach beim Button Back/Quit ein oder du ersetzt die Button_left Funktion durch die Button_quit Funktion wie folgt:

Code: [Select]

if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) {
    if(value >= _BUTTON_analog_enter_min && value <= _BUTTON_analog_enter_max) {        // control enter
      LCDML.Button_enter();
    } 
    else if(value >= _BUTTON_analog_up_min && value <= _BUTTON_analog_up_max) {      // control up
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);
    }
    else if(value >= _BUTTON_analog_down_min && value <= _BUTTON_analog_down_max) {   // control down
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);
    }   
    else if(value >= _BUTTON_analog_left_min && value <= _BUTTON_analog_left_max && _BUTTON_analog_enable_lr == 1) {

//--> Änderung ab hier
  // control old left new quit
      //LCDML.Button_up_down_left_right(_LCDMenuLib_button_left); // Button left wird nun nicht mehr aktiviert

      LCDML.Button_quit(); // Hier wird nun "quit" ausgefüht anstatt "left"
//--> Änderung ende

    }
    else if(value >= _BUTTON_analog_right_min && value <= _BUTTON_analog_right_max && _BUTTON_analog_enable_lr == 1) { // control right
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);
    }
       
    if(value >= _BUTTON_analog_back_min && value <= _BUTTON_analog_back_max && _BUTTON_analog_enable_quit == 1) {          // control quit
      LCDML.Button_quit();
    }



Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Nov 21, 2013, 12:00 pm
Das Ganze geht ja auch zum testen über den SerialMonitor.

Die Tasten sind wie folgt:
Code: [Select]

#define _BUTTON_analog_enter_min     850       // Button Enter                   E
 #define _BUTTON_analog_enter_max     920  
 #define _BUTTON_analog_up_min        520     // Button Up                      W
 #define _BUTTON_analog_up_max        590  
 #define _BUTTON_analog_down_min      700     // Button Down                    S
 #define _BUTTON_analog_down_max      770  
 //optional if menu element "back" exists, look at FUNC_back in functions tab
 #define _BUTTON_analog_enable_quit   1
 #define _BUTTON_analog_back_min      950     // Button Back                    Q
 #define _BUTTON_analog_back_max      1020  
 //optional if needed
 #define _BUTTON_analog_enable_lr     1
 #define _BUTTON_analog_left_min      430     // Button Left                    A
 #define _BUTTON_analog_left_max      500  
 #define _BUTTON_analog_right_min     610     // Button Right                   D
 #define _BUTTON_analog_right_max     680  
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Lena on Nov 21, 2013, 12:09 pm
Das mit den Analogwerten hatte ich schon mal probiert und das funktioniert auch, nur das dann halt die "Rückkehrbedingung 3xLinks drücken" nicht mehr funktioniert - logisch.
Einfach dem ButtonLeft die Funktion Quit zuzuordnen hätte ich natürlich auch selbst drauf kommen können und die "Abbruchbedingung" ist ja auch nur als Beispiel zu verstehen und entsprechend anzupassen.
OK, manchmal habe ich halt ein Brett vorm Kopf :-(
Dann kann ja heute Abend weiter mit Deiner genialen Lib rumgespielt werden - das eröffnet ganz neue Horizonte!

Besten Dank

Lena

P.S.: Ich habe nur eingeschränkte Monitor Möglichkeiten, da das Metaboard nur über ein zusätzliches USB/TTL-Seriell-Kabel via serial.print() kommunizieren kann. Ja, ja ich weiß, ich bin sehr puristisch ;-)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Lena on Nov 21, 2013, 07:08 pm
So, dank eurer Tips läuft nun alles bestens und auch die Ausgabe von Sonderzeichen  klappt jetzt dank oktal Kodierung (\xF5 für "ü" ist "out of range" \365 dagegen funktioniert - merkwürdig).
Nur eine kleine Verständnisfrage bleibt mir noch: was hat es mit dem "analogWrite(10, 55)" in der FUNC_p2 auf sich?
Verstehe ich nicht und Pin 10 wird bei mir vom LCD benutzt.

LG Lena
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 21, 2013, 10:00 pm
Einfach wegdenken, das gehört da nicht hin, ich nimm das mal raus in der nächsten Version ;-)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Lena on Nov 21, 2013, 10:51 pm
Ok, einfach weg denken - ähh was denn ;-)
Schau mir gerade Deine SimpleThreads an - ist schon verdammt cooler Stoff, den Du da in die Gemeinde streust - Respekt!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 22, 2013, 09:02 am
Quote

Ok, einfach weg denken - ähh was denn ;-)


analogWrite(10, 55)

Quote

Schau mir gerade Deine SimpleThreads an - ist schon verdammt cooler Stoff, den Du da in die Gemeinde streust - Respekt!

Danke, so etwas hört man immer gerne. 

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 22, 2013, 10:07 am
Update 22.11.2013:
 
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HeOse on Nov 24, 2013, 09:48 pm
Hallo Jomelo,

... Dein Projekt scheint genau für mich zu passen  :) Gefällt mir wirklich sehr gut! Habe da vermutlich wohl ein kleines Verständnis Problem: Ich versuche verzweifelt im "init Screen" (oder auch einer anderen Funktion) einen sich ändernden Wert anzuzeigen.

Code: [Select]

/* =============================================== */
/* Example 2: LCD Menu with LiquidCrystal_I2C      */
/* =============================================== */

/* init screen */
/* this functions is called if: */
/* -> _LCDMenuLib_cfg_initscreen is enable and */
/* ---> quit/back button is called in layer 0 */
/* ---> or _LCDMenuLib_cfg_initscreen_time is larger then 0  */
void FUNC_init_screen(void)
{
  /* setup function */
  if(!LCDML.FuncInit())
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Init Screen");     
    lcd.setCursor(0,1);
    lcd.print(g_second); 
   
    Serial.print(g_second);
   
    //printDate();
  }
 
  /* end function for callback */
  if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1)) /* (direct, up, down, left, right) */ 
  {
    /* do something bevor this function is closed */     
  }     
}


Ich versuche die (Globale Variable) "g_second" anzuzeigen, jedoch wird der Wert der Variable leider nur einmal angezeigt (wie mir auch " Serial.print(g_second);" bestätigt). Was muss ich unternehmen, dass die Variable aufdatiert wird?

Besten Dank für reply,
HeOse
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Lena on Nov 25, 2013, 10:09 am
Den Effekt habe ich auch beobachtet.
Habe mal aus Spaß den Code in den Setup-Teil der FUNC_xxx gesetzt und seihe da, oh Wunder - es funktionierte.
Wollte auch schon fragen, wie das zu erklären ist.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 25, 2013, 04:18 pm
Der Setup Teil jeder Funktion wird nur einmal beim starten der Funktions aufgerufen. Danach müsste der Menupunkt geschlossen werden um das Setup erneut aufrufen zu können. Der Name Setup soll an das Setup des Arduinos erinnern, welches auch nur einmalig ausgeführt wird, außer man startet den Kontroller neu.

Schaut euch doch mal die Beispiele an dort ändern sich auch werte ohne das die Funktion geschlossen wird

Code:  z.B.:
Code: [Select]

/* =============================================== */
/* Example 2: LCD Menu with LiquidCrystal_I2C      */
/* =============================================== */

/* init screen */
/* this functions is called if: */
/* -> _LCDMenuLib_cfg_initscreen is enable and */
/* ---> quit/back button is called in layer 0 */
/* ---> or _LCDMenuLib_cfg_initscreen_time is larger then 0  */
void FUNC_init_screen(void)
{
 /* setup function */
 if(!LCDML.FuncInit())
 {
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Init Screen");      
   lcd.setCursor(0,1);
   lcd.print(g_second);  
   
   Serial.print(g_second);
   
   //printDate();
 }

 //loop, dieser code wird öfters aufgerufen
   Serial.print(g_second);


 
 /* end function for callback */
 if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1)) /* (direct, up, down, left, right) */  
 {
   /* do something bevor this function is closed */      
 }    
}


Oder mit Verzögerung:

Code: [Select]

unsigned long g_timer_xxBezeichnung = 0;

/* =============================================== */
/* Example 2: LCD Menu with LiquidCrystal_I2C      */
/* =============================================== */

/* init screen */
/* this functions is called if: */
/* -> _LCDMenuLib_cfg_initscreen is enable and */
/* ---> quit/back button is called in layer 0 */
/* ---> or _LCDMenuLib_cfg_initscreen_time is larger then 0  */
void FUNC_init_screen(void)
{
 /* setup function */
 if(!LCDML.FuncInit())
 {
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Init Screen");      
   lcd.setCursor(0,1);
   lcd.print(g_second);  
   
   Serial.print(g_second);
   
   //printDate();
 }

 //loop, dieser code wird öfters aufgerufen
 if(LCDML.Timer(g_timer_xxBezeichnung, 500)) {    
    Serial.print(g_second); // wird nun alle 500 ms angezeigt
 }


 
 /* end function for callback */
 if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1)) /* (direct, up, down, left, right) */  
 {
   /* do something bevor this function is closed */      
 }    
}


Oder Schaut euch den Beispielcode oben in diesem Beitrag an, dort steht es auch nochmal in den Kommentaren erklärt:
http://forum.arduino.cc/index.php?topic=73816.msg555253#msg555253

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HeOse on Nov 25, 2013, 07:11 pm
Hallo Jomelo,
besten Dank für die turbo-schnelle Antwort! Jau, hab's verstanden! Funktioniert prima!
nur so zur Info: Wg. mangelnder I/O habe ich für die Key's ein PCF8574 Interface angekoppelt - Anbindung an LCD-Menü ohne Probleme - läuft Prima!  :)
Alles Gute,
HeOse
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Nov 26, 2013, 04:43 pm
Hoi Jomelo,
ich benutze diesen Sketch zum Abfragen einer Folientastatur 4x4 (nur 1 Pin am Arduino):
Code: [Select]
String keys="123A456B789C*0#D";
int key;
boolean key_lockout=false;

void setup(){
  Serial.begin(9600);
}

void loop(){
 key=getKeypad();
 if(key!=-1)
     Serial.println(keys[key]);
  delay(10);
}

int getKeypad(){
 int ret=-1;
 boolean reset_lockout=false;
 if(analogRead(A0)==0)
   key_lockout=false;
   else if(!key_lockout){
     delay(20);
    ret=15-(log((analogRead(A0)-186.9)/59.74)/0.2623)+0.4;
    key_lockout=true;
 }
 return ret;
}


Wie kann man das Abfrageergebnis (ret) mit Deiner Lib abfragen ?
Auf dem SerialMonitor wird die jeweils gedrückte Taste angezeigt.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Nov 26, 2013, 06:44 pm
Mal vom Thema ablenken....
Gratuliere zum meist gelesenen Thread!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 26, 2013, 08:48 pm
@skorpi08
Danke, hab ich letztes auch gedacht ;-)

@A.R.Ty
vielleicht kannst du es so versuchen:

Code: [Select]

//...

void LCDMenuLib_control_KeyPad()
{
  uint8_t key = getKeypad();

  if(key != -1) {
    switch(key) {
      case '2': // up ....
          LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);
      break;

      case '4': // left ....
        LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);
      break;
     
      // ...
      default:
           // ... alle anderen Buttons haben hier keine Funktion
      break;
      }
    }
}

void loop(){
  //..
  LCDMenuLib_control_KeyPad();
  //..
}


In dem Switcht Case kannst du die Buttons so wie unter Punkt 9 auf der ersten Seite beschrieben einbringen. Mit welcher Zahl/Buchstaben du nun welchen Button belegst weiß ich nicht, aber das sollte funktionieren.

PS: Der code oben ist nur Pseudo Code ich kann den so nicht testen da ich das Keypad nicht besitze. Bei Fehler musst du diese einfach beheben. ;-)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Nov 26, 2013, 08:59 pm
Hab das mal so umgesetzt:
Code: [Select]
void LCDMenuLib_control_KeyPad()
{
 uint8_t key = getKeypad();

 if(key != -1) {
   switch(key) {
     case '2': // up ....
         LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);
     break;

     case '4': // left ....
       LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);
     break;

     case '8': // down ....
       LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);
     break;

     case '6': // down ....
       LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);
     break;

 
     // ...
     default:
          // ... alle anderen Buttons haben hier keine Funktion
     break;
     }
   }
}


...und in den Tab LCDML_control  plaziert.
LCD zeigt an, welche Taste gedrückt wird, Cursor wandert aber nicht bei z.B. 8 (down)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 26, 2013, 11:00 pm
Prinzipell sollte das funktionieren.

Kannst du das Menü denn mit den Seriellen Kommandos so wie in den Beispielen Steuern ?
Ist die Einbindung der Funktion vielleicht an der falschen Stelle ?
Wie werden die Buttons entprellt ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Nov 26, 2013, 11:09 pm
Die Eingabe über Monitor geht ohne Probleme.
Buttons habe ich gar keine angeschlossen.

Die Stelle im Sketch erscheint mir eigentlich logisch und OK.

Was macht diese u_int... genau ?

P.S.: habe auch mal dies erfolglos getestet
Code: [Select]
switch(key=getKeypad()) {

sowie dies:
Code: [Select]
  //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
  LCDMenuLib_control_serial();        /* lcd menu control */ 
  LCDMenuLib_loop();                  /* lcd function call */
  LCDMenuLib_control_KeyPad(); 
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Nov 26, 2013, 11:50 pm
Manchmal ist man auch einfach zu dämlich  :smiley-red:

Habe mir die AnalogControl mal angesehen und die Zahlen entsprechend geändert - läuft wunderbar  XD
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Nov 27, 2013, 11:49 am
Quote
Manchmal ist man auch einfach zu dämlich  smiley-red

Genau, nämlich wenn man denkt man hätte es (so einfach).

Die Min/Max-Werte machen da doch Probleme.
Wenn ich bei beiden die selbe Zahl angebe z.B.
Code: [Select]

 #define _BUTTON_analog_enter_min     9 //850     // Button Enter                   E
 #define _BUTTON_analog_enter_max     9 //920  
 #define _BUTTON_analog_up_min        2     // Button Up                      W
 #define _BUTTON_analog_up_max        2  
 #define _BUTTON_analog_down_min      8 //700     // Button Down                    S
 #define _BUTTON_analog_down_max      8 //770
 

passiert gar nichts mehr.

Wenn ich nur dies
Code: [Select]

 #define _BUTTON_analog_down_min      8 //700     // Button Down                    S

 #define _BUTTON_analog_down_max      770 //770
ändere, geht es - aber logischerweise nur die jeweilige Taste als Einzige....

Der Versuch mit
Code: [Select]

 #define _BUTTON_analog_down_min      8 //700
 #define _BUTTON_analog_down_max      0 //770


brachte es auch nicht.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 27, 2013, 12:17 pm
Die Defines sind nicht dafür gemacht einen Wertebereich von 1 abzufragen, dafür gibt es andere Möglichkeiten

z.B.
Code: [Select]

int wert = getKeypad();

if(wert == 20) {
 // mache x
} else if(wert == 19) {
 // mache y
} else if(wert == 18) {
 // mache z
} else if(..........



Ich kann dir aber so dabei nicht helfen, da ich nicht weiß welche Werte aus deinem "getKeypad" herauskommen. Zudem gibt es die Möglichkeit das Problem mit "if" Abfragen oder mit "switch case" Schleifen zu lösen. Du kannst auf jeden fall nicht einfach die analog Funktion so verwenden wie sie vorgegeben ist, da diese nicht für deinen Funktionsumfang gedacht ist.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Nov 27, 2013, 01:31 pm
Jepp, deswegen funktioniert das hier:
Code: [Select]
void LCDMenuLib_control_KeyPaddy()
{
  int key = getKeypad();
  if(key == 2) {
     LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);}
  else if(key == 4) {
    LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);}
  else if(key == 8) {       
    LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);}
  else if(key == 6) {
    LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);}
  else if(key == 9) {
    LCDML.Button_quit();}
  else if(key == 5) {
    LCDML.Button_enter();}
}



XD
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Lena on Nov 27, 2013, 07:47 pm

Hallo Jomelo,

... Dein Projekt scheint genau für mich zu passen  :) Gefällt mir wirklich sehr gut! Habe da vermutlich wohl ein kleines Verständnis Problem: Ich versuche verzweifelt im "init Screen" (oder auch einer anderen Funktion) einen sich ändernden Wert anzuzeigen.

Code: [Select]

/* =============================================== */
/* Example 2: LCD Menu with LiquidCrystal_I2C      */
/* =============================================== */

/* init screen */
/* this functions is called if: */
/* -> _LCDMenuLib_cfg_initscreen is enable and */
/* ---> quit/back button is called in layer 0 */
/* ---> or _LCDMenuLib_cfg_initscreen_time is larger then 0  */
void FUNC_init_screen(void)
{
  /* setup function */
  if(!LCDML.FuncInit())
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Init Screen");     
    lcd.setCursor(0,1);
    lcd.print(g_second); 
   
    Serial.print(g_second);
   
    //printDate();
  }
 
  /* end function for callback */
  if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1)) /* (direct, up, down, left, right) */ 
  {
    /* do something bevor this function is closed */     
  }     
}


Ich versuche die (Globale Variable) "g_second" anzuzeigen, jedoch wird der Wert der Variable leider nur einmal angezeigt (wie mir auch " Serial.print(g_second);" bestätigt). Was muss ich unternehmen, dass die Variable aufdatiert wird?

Besten Dank für reply,
HeOse




Ich wuste doch, das mir das auch schon mal vorgekommen ist und Ihr habt beide recht.
In "normalen" Menufunktionen funktioniert alles wie erwartet, aber bei der Init_Screen ist es sonderbarer Weise genau umgekehrt.
Code: [Select]

void FUNC_init_screen(void)
{
/* setup function */
lcd.setCursor(0,1);
lcd.print(g_counter);
if(!LCDML.FuncInit())
{
simpleThread_restart(InitScreen_Thread);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(F("Servotester"));
}

/* end function for callback */
if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1)) /* (direct, up, down, left, right) */
{
simpleThread_stop(InitScreen_Thread);
/* do something bevor this function is closed */
}
}

Code: [Select]

//new setup for InitScreen
void simpleThread_setup(InitScreen_Thread)
{
g_counter = 0;
}
// new loop function for thread InitScreen
boolean simpleThread_loop(InitScreen_Thread)
{
g_counter++;

return false;
}

funktioniert so einwandfrei - umgekehrt wird nur die "Momentaufname" angezeigt.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 27, 2013, 08:06 pm
Oberhalb der  LCDML.FuncInit()  sollte kein Code eingefügt werden.

Kannst du die Funktion mal wie folgt testen:
Code: [Select]

void FUNC_init_screen(void)
{
/* setup function */
if(!LCDML.FuncInit())
{
simpleThread_restart(InitScreen_Thread);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(F("Servotester"));
}

        // Loop Code
        lcd.setCursor(0,1);
lcd.print(g_counter);

/* end function for callback */
if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1)) /* (direct, up, down, left, right) */
{
simpleThread_stop(InitScreen_Thread);
/* do something bevor this function is closed */
}
}


So sollte es eigentlich aussehen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Lena on Nov 27, 2013, 08:18 pm
Ah, jetzt habe ich es begriffen.
Da sowohl in Deiner Antwort, als auch in meinem Beispiel der zu wiederholende Teil ausserhalb des If-Blockes steht ist es meist egal ob darüber oder darunter.
Ich habe mich da schlicht durch die Kommentarzeile "/* setup function */" in die Irre führen lassen.
Nun sind aber alle Klarheiten beseitigt ;-)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 27, 2013, 08:20 pm
Vielleicht lass ich mir nochmal was einfallen, sodass der nicht Setup Code in einer "Loop-IF-Abfrage" steht ;-)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Wampo on Nov 27, 2013, 09:28 pm
Hy Jomelo,

ich hab nach 4std endlich den code ohne fehler kompilieren können, jedoch nicht so das mein I2c Display läuft, habe die lib geändert usw aber es will nich macht keinen mukks die s**!

hab n 16x4 LCD2004 von Sainsmart dran hängen mit ner Sainsmart I2c Schnittstelle.

Das hier ist die geänderte LIB wie du es ja auch beschrieben hast
Code: [Select]
====================================================================================================
//Liquidcrystal 4Bit Mode   
#define _LCDMenuLib_LCD_rs                        0
#define _LCDMenuLib_LCD_e                         2
#define _LCDMenuLib_LCD_dat0                      0
#define _LCDMenuLib_LCD_dat1                      0
#define _LCDMenuLib_LCD_dat2                      0
#define _LCDMenuLib_LCD_dat3                      0
//read write
#define _LCDMenuLib_LCD_rw                        1
//8bit mode
#define _LCDMenuLib_LCD_dat4                      4   
#define _LCDMenuLib_LCD_dat5                      5   
#define _LCDMenuLib_LCD_dat6                      6     
#define _LCDMenuLib_LCD_dat7                      7
//backlight
#define _LCDMenuLib_LCD_backlight                 3
#define _LCDMenuLib_LCD_backlight_pol             POSITIVE
//i2c address
#define _LCDMenuLib_LCD_addr                      0x3F ====================================================================================================
// 20:30 LiquidCrystal_SR from LiquidCrystal_new Version


hab ich irgendwas vergessen? oder warum geht bei mir gar nix vom display her....

tastaturbefehle empfängt der ardu also heisst das des prog läuft.

greez wampo

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Nov 27, 2013, 09:37 pm
Hoi,
läuft das Display denn mit einem anderen I2C LCD-Sketch ?
In Englisch läuft da gerade iene diskussion über die Backplane boards - da gibt es wohl einige die nicht "normal" belegt sind.
Es gibt einen I2CLCDguesser sketch, damit kannst Du die Einstellung automatisch finden lassen:
http://forum.arduino.cc/index.php?action=dlattach;topic=157817.0;attach=60554 (http://forum.arduino.cc/index.php?action=dlattach;topic=157817.0;attach=60554)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Wampo on Nov 27, 2013, 09:43 pm
Ja übers Display läuft ja meine Wetterstation auch einwandfrei, ich kann zwar keine selbstgemachten Chars abbilden aber alle anderen funktionen laufen tip top.

Ich benutze sogar die LiquidCrystal_I2C lib die in dem code auch mit drinen ist.

Meine Vermutung liegt bei der Config das da vielleicht was falsch ist.

Das hier is meine Wetterstation....EP und läuft  :smiley-yell:
Code: [Select]

/*

// Allgemeine Variablen
#include <avr/io.h>
#include <avr/interrupt.h>

//int runtime;
float tautemp;
float tau, maxtau, mintau;

#define led 5 // test led

// Variablen für Windgeschwindigkeitsmessung
const int windgeschwindigkeitPin = 3;          // anschluss des reedkontaktes
const float windFactor = 1.2;   // umrechnungsfaktor von umdrehungen in geschwindigkeit
const int measureTime = 10;      // messzeitraum in sekunden
volatile unsigned int windCounter = 0;  //interner zaehler fŸr umdrehungen
unsigned long time = 0;
float windgeschwindigkeit, maxwind, minwind;
int beaufort = 0;

//LDR Sensor
#define analogA1 A1
double percent;

//LCD Out
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//Temp & Humid
#include <DHT.h>
#define DHTTYPE DHT22
#define DHT1PIN 7        
#define DHT2PIN 6        
DHT DHT1(DHT1PIN, DHTTYPE);
DHT DHT2(DHT2PIN, DHTTYPE);
float a = 17.271; // für Taupunkt Formel
float b = 237.7; // für Taupunkt Formel

//Druck und Temp
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp = Adafruit_BMP085(10085);
float temperature;
float temp, maxtemp, mintemp;
float h,h1, maxh, minh;
float t,t1;
float druck, maxdruck, mindruck;


void setup()

{
 time = millis();
 pinMode(analogA1, INPUT);
 pinMode(led, OUTPUT);
 pinMode(windgeschwindigkeitPin, INPUT); // Pin als Eingang
 digitalWrite(windgeschwindigkeitPin, HIGH); // aktiviere internen Pullup
 DHT1.begin();
 DHT2.begin();
 bmp.begin();
 lcd.begin (20,4);
 lcd.backlight();
 screentest();

 // initialize Timer1
   cli();          // disable global interrupts
   TCCR1A = 0;     // set entire TCCR1A register to 0
   TCCR1B = 0;     // same for TCCR1B
   // set compare match register to desired timer count:
   OCR1A = 15624; //15624
   // turn on CTC mode, set CS10 and CS12 bits for 1024 prescaler
   TCCR1B |= (1 << WGM12)|(1 << CS10)|(1 << CS12);
   // enable timer compare interrupt:
   TIMSK1 |= (1 << OCIE1A);
   // enable global interrupts:
   sei();
}
   
ISR(TIMER1_COMPA_vect)
{
 //digitalWrite(led, !digitalRead(led));
 for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
   // sets the value (range from 0 to 255):
   analogWrite(led, fadeValue);        
   // wait for 30 milliseconds to see the dimming effect    
   delay(30);                            
 }

 // fade out from max to min in increments of 5 points:
 for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
   // sets the value (range from 0 to 255):
   analogWrite(led, fadeValue);        
   // wait for 30 milliseconds to see the dimming effect    
   delay(30);                            
 }
}

void loop()
{
 //runtime =(millis()/1000)/60;
     
     Windgeschwindigkeit(); // Windgeschwindigkeit holen    
     get_sensor();
     minmax();
     ausgabe(); // Ausgabe auf LCD
    //abfrage(); // Abfrage der Sensoren und Bedingung für ein ereignis z.b. LED An
   
}
 
void get_sensor(){
     ldr(); // Helligkeit holen
     dht0(); // INNEN Feuchtigkeit und Temp holen
     dht1(); // AUSSEN Feuchtigkeit und Temp holen
     bmp085(); // Druck und Temp holen
     temp = (t + temperature) / 2; //Durchschnitt aus beiden Temperatursensoren (DHT1 & BMP)
     taupunkt(); // Taupunktberechnung holen
}
 
         
void countWind() {
  windCounter ++;
}


void Windgeschwindigkeit()
{  
 windCounter = 0;
 time = millis();
 //zaehl-interrupt aktivieren
 attachInterrupt(1,countWind,RISING);
 //abwarten des messzeitraums
 delay(1000 * measureTime);
 //zaehl-interrupt deaktivieren
 detachInterrupt(1);
 //zeit bestimmen
 time = (millis() - time) / 1000;
 windgeschwindigkeit = (float)windCounter / (float)measureTime * windFactor;
 

  // ermitteln der Windstärke in Beaufort
 /*    if (windgeschwindigkeit >= 0 && windgeschwindigkeit <= 2)    { beaufort = 0; }
  else if (windgeschwindigkeit > 2 && windgeschwindigkeit <= 5)     { beaufort = 1; }
  else if (windgeschwindigkeit > 5 && windgeschwindigkeit <= 11)    { beaufort = 2; }
  else if (windgeschwindigkeit > 11 && windgeschwindigkeit <= 19)   { beaufort = 3; }
  else if (windgeschwindigkeit > 19 && windgeschwindigkeit <= 28)   { beaufort = 4; }
  else if (windgeschwindigkeit > 28 && windgeschwindigkeit <= 38)   { beaufort = 5; }
  else if (windgeschwindigkeit > 38 && windgeschwindigkeit <= 49)   { beaufort = 6; }
  else if (windgeschwindigkeit > 49 && windgeschwindigkeit <= 61)   { beaufort = 7; }
  else if (windgeschwindigkeit > 61 && windgeschwindigkeit <= 74)   { beaufort = 8; }
  else if (windgeschwindigkeit > 74 && windgeschwindigkeit <= 88)   { beaufort = 9; }
  else if (windgeschwindigkeit > 89 && windgeschwindigkeit <= 102)  { beaufort = 10; }
  else if (windgeschwindigkeit > 102 && windgeschwindigkeit <= 117) { beaufort = 11; }
  else                                                             { beaufort = 12; }*/
  }
 

void taupunkt()
 {
 tautemp = (a * t1) / (b + temp) + log(h1 / 100);
 tau = (b * tautemp) / (a - tautemp);
 }
 

void bmp085()
 {
 sensors_event_t event;
 bmp.getEvent(&event);  // BMP085 Luftruck ziehen
 druck = event.pressure  + ( 465 / 8.5 );
 bmp.getTemperature(&temperature);//BMP085 Temperatur ziehen
 }
 
 
void dht0()
 {
 h = DHT1.readHumidity();  //DHT22 Feuchtigkeit ziehen
 t = DHT1.readTemperature();  //DHT22 Temperatur ziehen
 }
 
 
void dht1()
 {
 h1 = DHT2.readHumidity();  //DHT22 Feuchtigkeit ziehen
 t1 = DHT2.readTemperature();  //DHT22 Temperatur ziehen
 }
 
 
void ldr()
 {
 //Prozentrechnung LDR
 int valueA1 = analogRead(analogA1);
 percent = (valueA1/1023.0) * 100.0;
 }
 
 
void minmax()
{
if (windgeschwindigkeit > maxwind ) maxwind = windgeschwindigkeit;
/*if (windgeschwindigkeit < minwind ) minwind = windgeschwindigkeit;
if (temp > maxtemp) maxtemp = temp;
if (temp < mintemp) mintemp = temp;
if (h > maxh) maxh = h;
if (h < minh) minh = h;
if (druck > maxdruck) maxdruck = druck;
if (druck < mindruck) mindruck = druck;
if (tau > maxtau) maxtau = tau;
if (tau < mintau) mintau = tau; */
}


void screentest()
 {
   //Screentest
 for(int i = 0; i< 3; i++)
 {
   lcd.backlight();
   delay(50);
   lcd.noBacklight();
   delay(50);
 }
 lcd.backlight();
 lcd.print("Weather Station V3.4");
 lcd.setCursor ( 0, 1 );
 lcd.print("********************");
 lcd.setCursor ( 0, 2 );
 lcd.print("Prog by Daniel Agocs");
 lcd.setCursor ( 0, 3 );
 lcd.print("   STARTE MESSUNG   ");
 }
 
 
void ausgabe()
 {
   lcd.clear();
     
   lcd.setCursor ( 0, 0 );
   lcd.print("I: ");
   lcd.print(temp,1);
   lcd.write(223);
   lcd.print("C -~ ");
   lcd.print(h,1);
   lcd.print("%");
   
   lcd.setCursor ( 0, 1 );
   lcd.print("O: ");
   lcd.print(t1,1);
   lcd.write(223);
   lcd.print("C -~ ");
   lcd.print(h1,1);
   lcd.print("%");
   
   lcd.setCursor ( 0, 2 );
   lcd.print("W: ");
   lcd.print(windgeschwindigkeit,0);
   lcd.print("km/h");
   
   lcd.setCursor( 11, 2 );
   lcd.print("Max: ");  
   lcd.print(maxwind,0);
   
   
   lcd.setCursor ( 11, 3);
   lcd.print(druck,1); //440 = Aktuelle höhe über NN, diese ändern und anpassen bei anderen Orten
   lcd.print("hPa");
   
   lcd.setCursor (0, 3 );
   lcd.print("T: ");
   lcd.print(tau,1);
   lcd.write(223);
   lcd.print("C");
 
 }

 /*lcd.setCursor(13 , 1 );
   lcd.print("L: ");
   lcd.print(percent,0);
   lcd.print("%");
   
   lcd.setCursor ( 13, 1 );
   lcd.print(runtime);
   lcd.print("min");
   }
   
void maxausgabe()
{
   lcd.clear();
   
   lcd.setCursor ( 0, 0 );
   lcd.print("TempMAX: ");
   lcd.print(maxtemp,1);
   lcd.write(223);
   lcd.print("C");
   
   lcd.setCursor ( 0, 1 );
   lcd.print("HumidMAX: ");
   lcd.print(maxh,1);
   lcd.print("%");
   
   lcd.setCursor ( 0, 3 );
   lcd.print("WindMAX: ");  
   lcd.print(maxwind,0);
   lcd.print("km/h");
 
}*/



void abfrage()
 {
 if(temp >= 21.5 & windgeschwindigkeit < 30 & percent > 30  & h <= 90){
 
   digitalWrite(led, HIGH);
 }  
  else
  {
   digitalWrite(led, LOW);
 }
 }
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Wampo on Nov 27, 2013, 09:48 pm
Laut dem scanner hab ichn PCF8574 Backpack drauf
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Nov 27, 2013, 09:52 pm
Eigene Zeichen definiere ich so:
Code: [Select]
byte up[8] = {
 B00100,
 B01110,
 B10101,
 B00100,
 B00100,
 B00100,
 B00100,
 B00100
};
byte down[8] = {
 B00100,
 B00100,
 B00100,
 B00100,
 B00100,
 B10101,
 B01110,
 B00100
};


im void setup:
Code: [Select]
 lcd.begin(20,4);               // Initialisierung
 lcd.createChar(0, up);
 lcd.createChar(1, down);


und wenn es dann angezeigt werden soll:
Code: [Select]
 lcd.write(byte(2));

Sollte auch bei Dir funktionieren.

Quote
Laut dem scanner hab ichn PCF8574 Backpack drauf

Und wird die Konfiguration auf dem LCD angezeigt ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Wampo on Nov 27, 2013, 10:05 pm
Nope ich kann keine Chars zeigen auch wenn ich des Byte ausfüll mit 1en immer das gleiche üxelkrüxel aufm display.

Meine Confi kenn ich ja schon vom Display und genau das hat der Guesser auch rausgeafunden. ;)

Code: [Select]

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


Vielleicht liegts wirklich an meim Backpack, hab auch bei einigen gelesen das die Dimmbar sind übers I2C, meiner nich :(
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Nov 27, 2013, 10:29 pm
Ich wusste doch dass ich da was gelesen hatte ;-)...
Schau mal hier, da geht es um die 16x4 LCDs - deren Adressierund der 2. Zeile ist wohl abweichend.
http://forum.arduino.cc/index.php?topic=63038.15 (http://forum.arduino.cc/index.php?topic=63038.15)

Und Üxeln tun die LCD eigentlich nur, wenn z.B. die Baudrate nicht stimmt (oder zu schnell ist...)

Wegen der eigenen Zeichen geht es auch so:
Code: [Select]

uint8_t bell[8]  = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4};
uint8_t note[8]  = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0};
uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0};
uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};
uint8_t duck[8]  = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0};
uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0};
uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0};
uint8_t retarrow[8] = { 0x1,0x1,0x5,0x9,0x1f,0x8,0x4};


Code: [Select]
 lcd.createChar(0, bell);
 lcd.createChar(1, note);
 lcd.createChar(2, clock);
 lcd.createChar(3, heart);
 lcd.createChar(4, duck);
 lcd.createChar(5, check);
 lcd.createChar(6, cross);
 lcd.createChar(7, retarrow);


Code: [Select]

// display all keycodes
void displayKeyCodes(void) {
 uint8_t i = 0;
 while (1) {
   lcd.clear();
   lcd.print("Codes 0x"); lcd.print(i, HEX);
   lcd.print("-0x"); lcd.print(i+16, HEX);
   lcd.setCursor(0, 1);
   for (int j=0; j<16; j++) {
     lcd.write(i+j);
   }
   i+=16;
   
   delay(4000);
 }
}

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 28, 2013, 08:49 am
@Wampo

Um die Schnittstelle komplett zu ändern musst du auch eine kleine Änderung in der  LCDMenuLib___config.h im Libverzeichnis vornehmen. Dies ist in Abschnitt 4 im ersten Thread erklärt. In der Datei musst du eine Zeile Auskommentieren und vermutlich die Zeile mit dem Wert 15 wieder entkommentieren.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bhvfotos on Dec 03, 2013, 11:34 am
Moinsen! Erstmal ein großes Lob an deine unermüdliche Unterstützung!

Habe ich es richtig verstanden, dass ich die Buttons wie folgt anschließen kann: http://arduino.cc/en/Tutorial/Button und dann bspw. wie folgt an meine digital Pins stecke:

void LCDMenuLib_control_digital()
{
  #define _BUTTON_digital_enter         1   
  #define _BUTTON_digital_up            2
  #define _BUTTON_digital_down          3
  //optional
  #define _BUTTON_digital_enable_quit   1
  #define _BUTTON_digital_quit          4
  //optional
  #define _BUTTON_digital_enable_lr    1
  #define _BUTTON_digital_left          5
  #define _BUTTON_digital_right         6

?

Wenn ich das mache, nimmt der keinen einzigen Tastendruck an. Oder muss ich in der Lib noch die "Auswahlmethode" ändern? Wenn ja, wie?

Grüße und vielen Dank!

Jan
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Dec 03, 2013, 11:40 am
Hoi Jan,

hast Du in diesem Part die entsprechende Zeile aktiviert?
Code: [Select]

  //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
  LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
   LCDMenuLib_control_KeyPaddy();      /* lcd menu control - config in tab "LCDML_control" */
//LCDMenuLib_control_serial();        /* lcd menu control */ 
   LCDMenuLib_loop();                  /* lcd function call */
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bhvfotos on Dec 03, 2013, 11:53 am
Moinsen, das ging fix!

Ja habe ich, aber der Display springt ständig rum zwischen dem angezeigten Menü und diesem hier:

Code: [Select]
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(F("Um Funktion zu"));
    lcd.setCursor(0,1);
    lcd.print(F("schliessen eine"));
    lcd.setCursor(0,2);
    lcd.print(F("Taste druecken oder"));
    lcd.setCursor(0,3);
    lcd.print(F("Back Taste verwenden"));


So schnell, dass man es kaum lesen kann. des Weiteren bekomme ich diese Meldung:
Binäre Sketchgröße: 10.058 Bytes (von einem Maximum von 32.256 Bytes)
avrdude: stk500_getsync(): not in sync: resp=0x00
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Dec 03, 2013, 12:02 pm
das umspringen "Hört" sich so an, als ob die ESC oder BACKSPACE-Taste Dauerkontakt hat  ;)

"Not in Sync" lässt z.B. auf einen "falschen" Chip schliessen bzw. falsche Auswahl im Menü unter Board - was für ein Board benutzt Du ?
Such mal nach den Fehlermeldungen auf der Webseite, da sind einige ganz genau beschrieben.

Oder benutzt Du einen selbst gebrannten Chip und da passt was nicht im Bootloader ?



Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 03, 2013, 12:06 pm
Ich bin gerade in der Hochschule und kann nur Hinweise geben.

Ich glaub bei den digitalen Anschlüssen sind die Buttons noch nicht entprellt. Schau dir mal die analoge Ansteuerung an und wie dort die Taster entprellt werden oder verwende die Bouncing Lib. Dann sollte das klappen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bhvfotos on Dec 03, 2013, 12:25 pm
Also wenn ich zum Beispiel einen Poti nutze und den über Analog(0) anschließe, funktioniert es. Leider nur sehr schlecht, da dieser 100k Ohm hat. Ich werde mir mal einen 360° Poti mit Druckpunkt besorgen, dann müsste es ja funktionieren. Eigentlich brauche ich sowieso jeden Digitalpin für meine Lüfter und LED Steuerung. Mein Board ist ein UNO R3, nichts selbst gebrutzeltes ;-)

Grüße
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Dec 03, 2013, 12:29 pm
Quote
Also wenn ich zum Beispiel einen Poti nutze und den über Analog(0) anschließe, funktioniert es

Joa, da hst Du noch Prellungen  8)
Quote
Eigentlich brauche ich sowieso jeden Digitalpin für meine Lüfter und LED Steuerung.

Schau mal auf unsere Lösung mit dem KeyPad (KeyPaddy) mit nur 3 Leitungen  ;)
Quote
Mein Board ist ein UNO R3, nichts selbst gebrutzeltes ;-)

Yo, geht ja auch  XD
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 03, 2013, 01:37 pm
Probier es mal mit dieser Funktion aus:

Code: [Select]

void LCDMenuLib_control_digital()
{
  #define _BUTTON_digital_enter         1   
  #define _BUTTON_digital_up            2
  #define _BUTTON_digital_down          3
  //optional
  #define _BUTTON_digital_enable_quit   1
  #define _BUTTON_digital_quit          4
  //optional
  #define _BUTTON_digital_enable_lr     1
  #define _BUTTON_digital_left          5
  #define _BUTTON_digital_right         6
 
  if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) {
  if(digitalRead(_BUTTON_digital_enter) || digitalRead(_BUTTON_digital_up) || digitalRead(_BUTTON_digital_down)
    || (digitalRead(_BUTTON_digital_quit) && _BUTTON_digital_enable_quit == 1)
    || ((digitalRead(_BUTTON_digital_left) || digitalRead(_BUTTON_digital_right)) && _BUTTON_digital_enable_lr == 1))
  {
     if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time))
     {
       if(digitalRead(_BUTTON_digital_enter)) { LCDML.Button_enter(); }
       else if(digitalRead(_BUTTON_digital_up)) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); }
       else if(digitalRead(_BUTTON_digital_down)) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); }
       else if(digitalRead(_BUTTON_digital_quit) && _BUTTON_digital_enable_quit == 1) {LCDML.Button_quit(); }
       else if(digitalRead(_BUTTON_digital_left) && _BUTTON_digital_enable_lr == 1) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);}
       else if(digitalRead(_BUTTON_digital_right) && _BUTTON_digital_enable_lr == 1) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);}       
     }
  } 
}
}


Nun müssen nur noch die Digitalen Eingänge an deine Funktion angepasst werden.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bhvfotos on Dec 03, 2013, 03:07 pm
Habe Sie nun wie folgt angepasst:
Code: [Select]
void LCDMenuLib_control_digital()
{
  #define _BUTTON_digital_enter         1   
  #define _BUTTON_digital_up            2
  #define _BUTTON_digital_down          3
  //optional
  #define _BUTTON_digital_enable_quit   1
  #define _BUTTON_digital_quit          4
  //optional
  #define _BUTTON_digital_enable_lr     1
  #define _BUTTON_digital_left          5
  #define _BUTTON_digital_right         6
 
  if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) {
  if(digitalRead(_BUTTON_digital_enter) || digitalRead(_BUTTON_digital_up) || digitalRead(_BUTTON_digital_down)
    || (digitalRead(_BUTTON_digital_quit) && _BUTTON_digital_enable_quit == 1)
    || ((digitalRead(_BUTTON_digital_left) || digitalRead(_BUTTON_digital_right)) && _BUTTON_digital_enable_lr == 1))
  {
     if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time))
     {
       if(digitalRead(_BUTTON_digital_enter)) { LCDML.Button_enter(); }
       else if(digitalRead(_BUTTON_digital_up)) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); }
       else if(digitalRead(_BUTTON_digital_down)) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); }
       else if(digitalRead(_BUTTON_digital_quit) && _BUTTON_digital_enable_quit == 1) {LCDML.Button_quit(); }
       else if(digitalRead(_BUTTON_digital_left) && _BUTTON_digital_enable_lr == 1) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);}
       else if(digitalRead(_BUTTON_digital_right) && _BUTTON_digital_enable_lr == 1) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);}       
     }
  } 
}
}


Der Display springt nicht rum, wechselt nur nach einer bestimmten Zeit in den Init Screen, nimmt aber keinen Tastendruck an... Schade Schokolade :-(
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 03, 2013, 03:53 pm
Ich habe da was vergessen, ich sollte nicht so oft von Unterwegs Antworten schreiben ;-)

Das mit dem Timer kann nicht klappen da dieser ja schon implementiert ist, also die eine Zeile + die unterste Klammer wieder entfernen. Wenn das Programm zu schnell herumspringt ist entweder ein digitaler Anschluss dauerhaft aktiviert oder die Zeit    
#define _LCDMenuLib_cfg_press_time       200
Zu klein gewählt.

Kannst du sicher sagen das der Taster nicht dauerhaft ein 1 Signal liefert ? Er sollte auch irgendwann auf 0 gehen.
Zudem darf in der Loop nur eine LCD_Control Funktion aktiviert sein, mehrere können auch zu Fehlern führen.

Ich habe hier im Moment keinen Arduino und auch kein Display daher kann ich das nicht testen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bhvfotos on Dec 03, 2013, 04:08 pm
Habe das mal wieder raus genommen. Müsste der nicht theoretisch aufhören, wenn ich gar keinen Button angeschlossen habe? Er springt sogar, wenn nichts dran ist. Mit der Zeit hattest du recht, wird die erhöht, kann man den aufblinkenden Text besser lesen, aber ich kann noch so lange drücken, es passiert nichts ^^

Muss ich vielleicht Pins nehmen, die nicht PWM sind?

Grüße
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 03, 2013, 04:21 pm
Wenn du nichts angeschlossen hast, dann sind die Eingänge wie Antennen und springen die ganze Zeit hin und her. Dies würde genau das beschriebene Verhalten erklären. Ich glaube immer noch das irgendetwas mit deinen Tastern nicht stimmt. Wie hast du diese verdrahtet ? Wenn der Taster nicht gedruckt ist, wird der Eingang auf einen sicheren Zustand gelegt. Sprich benutzt du Pullup oder Pulldown Widerstände ?

PWM hat damit soviel zu tun, wie ein Apfel mit einer Birne ;-) Also garnichts.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bhvfotos on Dec 03, 2013, 04:25 pm
10k Ohm Widerstand zwischen Gnd und Taster, also Pull-Down, richtig? Es würde aber reichen drei Taster anzuschließen, oder müssen es die sechs stück sein?

Grüße

Siehe hier noch einmal: https://www.dropbox.com/sc/1wf6ywsw4lj0lj8/cjKPoa2mJr
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bhvfotos on Dec 03, 2013, 04:32 pm
(https://www.dropbox.com/sc/1wf6ywsw4lj0lj8/cjKPoa2mJr)

Von links nach rechts die Belegung: Pin1, Pin2, Pin3

Und dazu folgenden Code:
Code: [Select]
/* =============================================== */
/* Example 1: LCD Menu with LiquidCrystal          */
/* =============================================== */
/* file content:                                   */
/* - LCDMenuLib_control_analog()                   */
/* - LCDMenuLib_control_digital()                  */
/* - LCDMenuLib_control_seriel()                   */
/* =============================================== */

/* analog menu control */
/*void LCDMenuLib_control_analog()
{
  uint16_t value = analogRead(0);  // analogpin for keypad

  #define _BUTTON_analog_enter_min     850     // Button Enter
  #define _BUTTON_analog_enter_max     920 
  #define _BUTTON_analog_up_min        520     // Button Up
  #define _BUTTON_analog_up_max        590   
  #define _BUTTON_analog_down_min      700    // Button Down
  #define _BUTTON_analog_down_max      770   
  //optional if menu element "back" exists, look at FUNC_back in functions tab
  #define _BUTTON_analog_enable_quit   1
  #define _BUTTON_analog_back_min      950     // Button Back
  #define _BUTTON_analog_back_max      102   
  //optional if needed
  #define _BUTTON_analog_enable_lr     1
  #define _BUTTON_analog_left_min      430     // Button Left
  #define _BUTTON_analog_left_max      500   
  #define _BUTTON_analog_right_min     610     // Button Right
  #define _BUTTON_analog_right_max     680   
     
  if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) {
    if(value >= _BUTTON_analog_enter_min && value <= _BUTTON_analog_enter_max) {        // control enter
      LCDML.Button_enter();
    } 
    else if(value >= _BUTTON_analog_up_min && value <= _BUTTON_analog_up_max) {      // control up
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);
    }
    else if(value >= _BUTTON_analog_down_min && value <= _BUTTON_analog_down_max) {   // control down
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);
    }   
    else if(value >= _BUTTON_analog_left_min && value <= _BUTTON_analog_left_max && _BUTTON_analog_enable_lr == 1) {   // control left
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);
    }
    else if(value >= _BUTTON_analog_right_min && value <= _BUTTON_analog_right_max && _BUTTON_analog_enable_lr == 1) { // control right
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);
    }
       
    if(value >= _BUTTON_analog_back_min && value <= _BUTTON_analog_back_max && _BUTTON_analog_enable_quit == 1) {          // control quit
      LCDML.Button_quit();
    }
  }
}
*/
void LCDMenuLib_control_digital()
{
  #define _BUTTON_digital_enter         1   
  #define _BUTTON_digital_up            2
  #define _BUTTON_digital_down          3
  //optional
  #define _BUTTON_digital_enable_quit   1
  #define _BUTTON_digital_quit          2
  //optional
  #define _BUTTON_digital_enable_lr     2
  #define _BUTTON_digital_left          10
  #define _BUTTON_digital_right         11
 

  if(digitalRead(_BUTTON_digital_enter) || digitalRead(_BUTTON_digital_up) || digitalRead(_BUTTON_digital_down)
    || (digitalRead(_BUTTON_digital_quit) && _BUTTON_digital_enable_quit == 1)
    || ((digitalRead(_BUTTON_digital_left) || digitalRead(_BUTTON_digital_right)) && _BUTTON_digital_enable_lr == 1))
  {
     if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time))
     {
       if(digitalRead(_BUTTON_digital_enter)) { LCDML.Button_enter(); }
       else if(digitalRead(_BUTTON_digital_up)) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); }
       else if(digitalRead(_BUTTON_digital_down)) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); }
       else if(digitalRead(_BUTTON_digital_quit) && _BUTTON_digital_enable_quit == 1) {LCDML.Button_quit(); }
       else if(digitalRead(_BUTTON_digital_left) && _BUTTON_digital_enable_lr == 1) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);}
       else if(digitalRead(_BUTTON_digital_right) && _BUTTON_digital_enable_lr == 1) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);}       
     }
  } 
}


/* serial menu control */
/*void LCDMenuLib_control_serial()
{
  if(Serial.available()) {
    if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) {
      switch(Serial.read()) {
        case 'e': LCDML.Button_enter(); break;
        case 'w': LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); break;
        case 's': LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); break;
        case 'a': LCDML.Button_up_down_left_right(_LCDMenuLib_button_left); break;
        case 'd': LCDML.Button_up_down_left_right(_LCDMenuLib_button_right); break;       
        case 'q': LCDML.Button_quit(); break;
        default: break;
      }
    }
  }
}
*/
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 03, 2013, 04:33 pm
Drei reichen, dann müsstest du nur im Menü  "zurück" Punkte einbauen.

Code: [Select]

#define _BUTTON_digital_enable_quit   0
 //optional
 #define _BUTTON_digital_enable_lr     0


Die beiden "defines" müssen auf 0 gesetzt werden, ansonsten sind die anderen Eingänge offen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bhvfotos on Dec 03, 2013, 04:36 pm
Also zum Beispiel so:
Code: [Select]
void LCDMenuLib_control_digital()
{
  #define _BUTTON_digital_enter         1   
  #define _BUTTON_digital_up            2
  #define _BUTTON_digital_down          3
  //optional
  #define _BUTTON_digital_enable_quit   0
  #define _BUTTON_digital_quit          0
  //optional
  #define _BUTTON_digital_enable_lr     0
  #define _BUTTON_digital_left          0
  #define _BUTTON_digital_right         0


Und pro Ebene dann immer ein ZURÜCK.

Probiert, geht nicht -.-

Könnte ich nicht irgendwo den Status vom jeweiligen Pin Seriell auslesen lassen? Zum Beispiel mit dem Serial Monitor?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 03, 2013, 04:40 pm
Sollte eigentlich funktionieren.

Klar kannst du das, ich glaub dein Vorhaben scheitert gerade an den Grundlagen.

Serielle Ausgabe:

Code: [Select]

//im Setup sollte stehen
Serial.begin(9600);

//in der digitalen Button Funktion folgendes
Serial.println(digitalRead(_BUTTON_digital_enter));


Aber durch irgend eine Beschaltung deiner Buttons sind diese dauerhaft auf "1"
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bhvfotos on Dec 03, 2013, 04:46 pm
Das gibt es nicht! Es war alles richtig, lediglich durch Serial.println(digitalRead(_BUTTON_digital_enter));

funktioniert es!

Ich hatte das Auslesen vorhin in die Loop gelegt, da funktioniert es aber nicht -.-

Danke dir! :-)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 03, 2013, 04:49 pm
Die "defines" sind nur global Zugänglich wenn sie vor dem Aufrufen definiert sind.
In der Arduino Umgebung ist es leider so, dass man nicht genau sehen kann wann welche Dateien eingebunden werden, daher sind die "defines" aus der digitalen LCDML Funktion nur dort und unterhalb gültig.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bhvfotos on Dec 04, 2013, 01:25 pm
Da das Menü dank euch wunderbar funktioniert, versuche ich gerade mal meine erste Anzeige zu gestalten. Ich möchte mit dem Menüpunkt:
Code: [Select]
LCDMenuLib_element(10 , Item_4       , Item_4_1      , "Temperatur"         , FUNC_temperatur);
und den vorher im Menütab deklarierten Variablen:
Code: [Select]
int temp1; eine eigene Anzeige gestalten. Sprich, ich wähle die Temperatur aus und es erscheint folgendes:
Code: [Select]
void FUNC_temperatur (void)
{
  LCDML.FuncInit();
    temp1 = ((5.0*analogRead(A3)*100.0)/1024);
      lcd.clear();
      lcd.setCursor (0,0);
      lcd.print("Temp:");
      lcd.print(temp1);
      lcd.print('\xDF');
      lcd.print("C ");
}


Leider scheint er den LCD so schnell zu aktualisieren, dass die Anzeige nicht mit dem Anzeigen hinterher kommt. Wie kann ich da eine Anzeige einstellen, so dass diese nur jede 1000ms aktualisiert wird, ohne ein Delay zu erzwingen? Ich hätte noch die Idee, das clear weg zu lassen und dafür alle Zeilen mit Blanks zu füllen, was sicherlich nicht die schönste Variante ist...

Grüße und Vielen Dank!

Woran kann das liegen?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 04, 2013, 02:19 pm
Hi,
das liegt daran, dass du dir das Beispiel nicht genau angeschaut hast. Dort ist so ein Problem schon gelöst. Schau mal in der FUNC_timer_info nach. Dort ist der Code zu finden:

Code: [Select]

if(LCDML.Timer(g_timer_1, 1000)) {      /* init a timer with 1000ms */      
   g_func_timer_info--;                  /* increment the value every secound */
   lcd.setCursor(0,0);                   /* set cursor pos */
   lcd.print(g_func_timer_info);         /* print the time counter value */
 }    


Dieser Timer sorgt dafür das der Inhalt der If Schleife nur jede Sekunde aktualisiert wird. Ansonsten kannst du dir auch BlinkWithoutDelay anschauen, da in diesen beispielen das gleiche geschieht.

Oder ließ dir im zweiten Thread unter Punkt 8 Beschrieben die Funktionen nochmal durch. Du kannst dir die Menu-Funktionen als Loop vorstellen die immer erneut aufgerufen werden.

Die Funktion   FuncEnd sollte auch in jeder Funktion vorhanden sein, ansonsten kommst du nicht mehr raus.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 04, 2013, 10:08 pm


Die Funktion   FuncEnd sollte auch in jeder Funktion vorhanden sein, ansonsten kommst du nicht mehr raus.


Stimmt so nicht ganz. Mit dem zurück Button kommt man immer zurück, zumindest war es so bei mir.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 04, 2013, 10:40 pm
Ok, ist zwar nicht gewollt, aber gut wenn es funktioniert ;-)
Ich glaub um alle möglichen Kombinationen die auftreten testen zu können bräuchte ich Tage.  :smiley-sweat:
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Dec 04, 2013, 11:18 pm
Quote
Ich glaub um alle möglichen Kombinationen die auftreten testen zu können brächte ich Tage.

Joa, bei so verschachtelten Schachteln muss man sehr aufpassen und die Möglichkeiten steigen mit jedem Menüpunkt  XD
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 04, 2013, 11:20 pm
Nachher programmiert man noch sein eigenes Grab, ohne es zu wissen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bhvfotos on Dec 05, 2013, 12:42 am
Na ja, ich bin glücklich darüber, dass es funktioniert :-) Man muss sich halt erstmal in die ganze Geschichte reinfuchsen, da sich ja jeder etwas anderes dabei denkt. Aber mittlerweile kann ich ohne Probleme alles dazu schreiben! Danke dafür!

Ich finde zum Beispiel die Variante mit lcd.clear ziemlich ungeschickt, da der Display dann jede Sekunde blinkt. Statt dessen fülle ich einfach alle Zeilen mit Blank aus, da dann nur das "sich ändernde" blinkt und nicht der ganz Display.

Grüße
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 05, 2013, 12:48 am
Bei zB einer Uhr, kann man es als sekunden Anzeige betrachten :D
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Dec 05, 2013, 11:02 am
Quote
Nachher programmiert man noch sein eigenes Grab, ohne es zu wissen.

LoL - die eiskalte Hand noch auf der ENTER-Taste  :smiley-roll-blue: :smiley-eek-blue: :smiley-eek:
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bhvfotos on Dec 05, 2013, 11:16 am
Guten Morgen!

Hätte da noch eine Frage bezüglich der Zeit. Ich habe mir das Menü so gelegt, dass der zweite Punkt die Zeit anzeigt. Wenn ich diesen Punkt anwähle, wird die Zeit auch kurz angezeigt, aber er springt nach ca einer Sekunde wieder in das Hauptmenü zurück?
Jemand eine Idee?

Code: [Select]
void FUNC_zeit (void)
{

  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write((byte)0);
  Wire.endTransmission();

  //  Read Second, Minute, and Hour
  Wire.requestFrom(DS1307_ADDRESS, 3);

  int RTCSecond = bcdToDec(Wire.read());
  int RTCMinute = bcdToDec(Wire.read());
  int RTCHour = bcdToDec(Wire.read() & 0b111111);   //****************************************** 24h Zeit

  //******************************************************************************************** Zeit auf LCD XX:XX:XX

  if(LCDML.Timer(g_timer_1, 1000)) {      /* init a timer with 1000ms */


    lcd.clear();
    lcd.setCursor(0,0);
    if(RTCHour < 10) {
      lcd.print("0");
    }
    lcd.print(RTCHour);
    lcd.print(":");
    if(RTCMinute < 10) {
      lcd.print("0");
    }
    lcd.print(RTCMinute);
    lcd.print(":");
    if(RTCSecond < 10) {
      lcd.print("                    ");
    }
    lcd.print(RTCSecond);
    lcd.print(" Uhr");
    lcd.setCursor(0,1);
    lcd.print("                    ");
    lcd.setCursor(0,2);
    lcd.print("                    ");
    lcd.setCursor(0,3);
    lcd.print("                    ");


  }


Grüße und einen stürmischen Tag,

Jan
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 05, 2013, 11:52 am
Ich kann nur auf die Beispiele verweisen. Da ich keine  FuncInit und keine FuncEnd  in deiner Funktion sehe kann ich auch keine Auskunft über das Verhalten geben. Die FuncInit Funktion setzt eine Variable die dafür sorgt das die Funktion immer erneut aufgerufen wird. Sobald diese fehlt kann er nach einem Durchlauf nur rausspringen.

Wenn die Menu Funktion mit beiden Funktionen aufgebaut wird. Springt er nicht raus !!!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Dec 05, 2013, 01:46 pm
@jomelo:
der I2C Beispielsktech funktioniert nicht  :smiley-roll-blue:
Zuerst fehlen ihm die Pin-Definitionen
Code: [Select]

/* pin settings */ 
#define _LCDMenuLib_LCD_rs               2
#define _LCDMenuLib_LCD_e                1
#define _LCDMenuLib_LCD_dat0             4
#define _LCDMenuLib_LCD_dat1             5
#define _LCDMenuLib_LCD_dat2             6
#define _LCDMenuLib_LCD_dat3             7

und danach zeigt er trotzdem nüschte an  :smiley-roll-sweat:
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 05, 2013, 02:50 pm
Schau dir mal den Abschnitt 4 und 5 im ersten Beitrag an und lade das lcdml_I2C Beispiel. Denk an die Änderung in der ___config.h im lib Verzeichnis.

Bei meinen Tests war immer alles definiert.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trixi on Dec 05, 2013, 10:44 pm
Jepp, eigentlich schon gemacht...gibts da was Besonderes (zu beachten) ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 06, 2013, 09:28 am
Dort stehen die fehlenden Konstanten:
Jedes Display braucht unterschiedliche, daher befinden sich nicht alle mit im Beispiel.

Code: [Select]

//Liquidcrystal 4Bit Mode    
#define _LCDMenuLib_LCD_rs                        4
#define _LCDMenuLib_LCD_e                         5
#define _LCDMenuLib_LCD_dat0                      8
#define _LCDMenuLib_LCD_dat1                      9
#define _LCDMenuLib_LCD_dat2                      7
#define _LCDMenuLib_LCD_dat3                      11
//read write
#define _LCDMenuLib_LCD_rw                        0
//8bit mode
#define _LCDMenuLib_LCD_dat4                      0    
#define _LCDMenuLib_LCD_dat5                      0    
#define _LCDMenuLib_LCD_dat6                      0      
#define _LCDMenuLib_LCD_dat7                      0
//backlight
#define _LCDMenuLib_LCD_backlight                 0
#define _LCDMenuLib_LCD_backlight_pol             0
//i2c address
#define _LCDMenuLib_LCD_addr                      0x20


Desweiteren sollte diese Lib für I2C verwendet werden:
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads

Teste erst ob du eine Ausgabe mit der Lib ohne das Menü bekommst.
Anschließend kannst du in der LCDMenuLib___config.h  deine Konfigurationsmöglichkeit auswählen.
Danach solltest du auch eine Ausgabe mit der LCDMenuLib bekommen.

Das normale Beispiel und das Beispiel mit I2C unterscheiden sich nur in den I2C Einstellungen, der Rest ist gleich.
Einige andere hier konnten ohne Problem I2C einsetzen. Daher bin ich ein wenig verwundert.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 18, 2013, 10:08 pm
Hmm... irgendwie bekomme ich den beispiel Sketch nicht kompiliert
Quote

/Documents/Arduino/libraries/LiquidCrystal/I2CIO.cpp: In member function 'int I2CIO::begin(uint8_t)':
/Documents/Arduino/libraries/LiquidCrystal/I2CIO.cpp:61: error: 'Wire' was not declared in this scope
/Documents/Arduino/libraries/LiquidCrystal/I2CIO.cpp: In member function 'uint8_t I2CIO::read()':
/Documents/Arduino/libraries/LiquidCrystal/I2CIO.cpp:117: error: 'Wire' was not declared in this scope
/Documents/Arduino/libraries/LiquidCrystal/I2CIO.cpp: In member function 'int I2CIO::write(uint8_t)':
/Documents/Arduino/libraries/LiquidCrystal/I2CIO.cpp:140: error: 'Wire' was not declared in this scope


Egal was ich bei LCDMenuLib___config eingebe, kommen Fehler.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 19, 2013, 10:30 am
Ich hab es gerade nochmal getestet.

1. alte LiquidCrystal Lib aus dem Lib Verzeichnis entfernen. Z.B. einen Ordner nach oben kopieren.
  Umbennen funktioniert hier nicht, da die Lib ansonsten immer noch gefunden wird.

2. Diese Lib herunterladen und ins Libverzeichnis kopieren
    https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads

3. In der ___config.h  die Zeile 46 auskommentieren (Wert 0) und die Zeile 57 (Wert 10) einkommentieren
    Wenn es mit der Zeile 57 geht geht es auch mit allen anderen

4. Die Arduino Software sollte ganz geschlossen werden. Da ansonsten die neue Lib nicht erkannt wird.

5. Beispielsketch compelieren

So treten bei mir keine Fehler auf.

Edit 1:
Vielleicht noch eine andere Sache.
Wenn man aus versehen den das normale Beispiel geladen hat anstatt das I2C Beispiel könnte der Fehler eventuell bedeuten das die "#include <Wire.h>"  nicht  im Sketch eingebunden wird so wie es beim I2C Beispiel der Fall ist.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 19, 2013, 06:05 pm
Achso, ich sollte vielleicht noch dazu schreiben dass ich ohne I2C es nutzen will.

Edit 1: Nachdem ich #include <Wire.h> im Sketch eingefügt habe, funktionierts. Danke Jomelo!
Edit 2: Nachdem ich es eingefügt habe und erfolgreich kompiliert wurde, hab ichs wieder gelöscht und es wurde wieder erfolgreich kompiliert.  :smiley-roll:
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 19, 2013, 06:52 pm
Quote

Edit 2: Nachdem ich es eingefügt habe und erfolgreich kompiliert wurde, hab ichs wieder gelöscht und es wurde wieder erfolgreich kompiliert.


Hmm, sprachlos  :)

Ohne I2C kannst du auch einfach die Standard LiquidCrystal Lib verwenden.

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 19, 2013, 06:54 pm
das ganze macht dann 1kB aus.
habe nun ein anderes Problem, Tasten funktionieren nicht.
Habe die Werte aus der älteren Lib übernommen, pustekuchen.

Edit: Sorry jungs, mein Fehler. Im loop muss man ja LCDMenuLib_control_analog(); auskommentieren.
Funktioniert nun mit den Werten bei einem 16x2 Display von Sainsmart:
Code: [Select]
/* analog menu control */
void LCDMenuLib_control_analog()
{
  uint16_t value = analogRead(0);  // analogpin for keypad

  #define _BUTTON_analog_enter_min     690    // Button Enter
  #define _BUTTON_analog_enter_max     790 
  #define _BUTTON_analog_up_min        95     // Button Up
  #define _BUTTON_analog_up_max        195   
  #define _BUTTON_analog_down_min      280    // Button Down
  #define _BUTTON_analog_down_max      380   
  //optional if menu element "back" exists, look at FUNC_back in functions tab
  #define _BUTTON_analog_enable_quit   1
  #define _BUTTON_analog_back_min      465    // Button Back
  #define _BUTTON_analog_back_max      565   
  //optional if needed
  #define _BUTTON_analog_enable_lr     1
  #define _BUTTON_analog_left_min      450    // Button Left
  #define _BUTTON_analog_left_max      460   
  #define _BUTTON_analog_right_min     5      // Button Right
  #define _BUTTON_analog_right_max     50   
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 21, 2013, 11:14 pm
Abend zusammen,

ich bin neu hier und habe aber schon paar sachen auf dem Arduino zum laufen bekommen.
Habe mich an das Menü vom Beitrag 1 gewagt,leider habe ich lauter fehler beim comiplieren.

Ich habe arduino uno und die Arduino 1.0.5 IDE.
Habe ein 16x4 lcd als 4 bit dran,also nicht I2C!
Habe die lib und den code koipert,leider compiliert die ide das nicht,da einiges an fehlern b.z.w fehlende Variablen fehlen.

Würde mich über jeden Tip freuen,

Mfg.
haustechno

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Lena on Dec 22, 2013, 12:08 am
Mit Fehlermeldung bleibt die Glaskugel nicht ganz so trübe  ;)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 22, 2013, 02:19 am
Wie wäre es wenn du paar Beiträge davor liest, da hatte ich ähnliche Start Schwierigkeiten.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 12:23 pm
Malzeit,

vielen Dank und sorry das ich keine exakteren Angaben gemacht habe.

Nun hab ich das menü erstmal so am laufen ,also mit Serialansteuerung.

Nun möchte ich auch Taster mit einbinden,damit ich erstmal die Menüstruktur mit Taster testen kann.

Verstehe ich das richtig das ich in dem Besipielcode,den Teil mit :
Quote
void loop()

  //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
  LCDMenuLib_control_serial();        /* lcd menu control */ 
  LCDMenuLib_loop();                  /* lcd function call */


die Zeile mit dem control_digital  frei mache und dann den Code hier:

Quote
/* analog menu control */
void LCDMenuLib_control_analog()
{
  uint16_t value = analogRead(0);  // analogpin for keypad

  #define _BUTTON_analog_enter_min     850     // Button Enter
  #define _BUTTON_analog_enter_max     920 
  #define _BUTTON_analog_up_min        520     // Button Up
  #define _BUTTON_analog_up_max        590   
  #define _BUTTON_analog_down_min      700     // Button Down
  #define _BUTTON_analog_down_max      770   
  //optional if menu element "back" exists, look at FUNC_back in functions tab
  #define _BUTTON_analog_enable_quit   1
  #define _BUTTON_analog_back_min      950     // Button Back
  #define _BUTTON_analog_back_max      1020   
  //optional if needed
  #define _BUTTON_analog_enable_lr     1
  #define _BUTTON_analog_left_min      430     // Button Left
  #define _BUTTON_analog_left_max      500   
  #define _BUTTON_analog_right_min     610     // Button Right
  #define _BUTTON_analog_right_max     680   
     
  if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) {
    if(value >= _BUTTON_analog_enter_min && value <= _BUTTON_analog_enter_max) {        // control enter
      LCDML.Button_enter();
    } 
    else if(value >= _BUTTON_analog_up_min && value <= _BUTTON_analog_up_max) {      // control up
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);
    }
    else if(value >= _BUTTON_analog_down_min && value <= _BUTTON_analog_down_max) {   // control down
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);
    }   
    else if(value >= _BUTTON_analog_left_min && value <= _BUTTON_analog_left_max && _BUTTON_analog_enable_lr == 1) {   // control left
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);
    }
    else if(value >= _BUTTON_analog_right_min && value <= _BUTTON_analog_right_max && _BUTTON_analog_enable_lr == 1) { // control right
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);
    }
       
    if(value >= _BUTTON_analog_back_min && value <= _BUTTON_analog_back_max && _BUTTON_analog_enable_quit == 1) {          // control quit
      LCDML.Button_quit();
    }
  }
}


reinkopiere?

Und wenn ja wo kommt es genau hin?
Ich möchte die Funktion des menüs testen und verstehen,sorry...

Mfg.
Haustechno
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 23, 2013, 12:31 pm
Hast du mein Post gelesen? Fals ja, dann nicht verstanden,


das ganze macht dann 1kB aus.
habe nun ein anderes Problem, Tasten funktionieren nicht.
Habe die Werte aus der älteren Lib übernommen, pustekuchen.

Edit: Sorry jungs, mein Fehler. Im loop muss man ja LCDMenuLib_control_analog(); auskommentieren.
Funktioniert nun mit den Werten bei einem 16x2 Display von Sainsmart:
Code: [Select]
/* analog menu control */
void LCDMenuLib_control_analog()
{
  uint16_t value = analogRead(0);  // analogpin for keypad

  #define _BUTTON_analog_enter_min     690    // Button Enter
  #define _BUTTON_analog_enter_max     790 
  #define _BUTTON_analog_up_min        95     // Button Up
  #define _BUTTON_analog_up_max        195   
  #define _BUTTON_analog_down_min      280    // Button Down
  #define _BUTTON_analog_down_max      380   
  //optional if menu element "back" exists, look at FUNC_back in functions tab
  #define _BUTTON_analog_enable_quit   1
  #define _BUTTON_analog_back_min      465    // Button Back
  #define _BUTTON_analog_back_max      565   
  //optional if needed
  #define _BUTTON_analog_enable_lr     1
  #define _BUTTON_analog_left_min      450    // Button Left
  #define _BUTTON_analog_left_max      460   
  #define _BUTTON_analog_right_min     5      // Button Right
  #define _BUTTON_analog_right_max     50   



Das heißt also, fals du ein 16x2 Keypad Shield hast und nur dieses benutzen willst, lässt du nur dieses in der loop:
Code: [Select]
LCDMenuLib_control_analog(); 
die anderen beiden kannst du löschen:
Code: [Select]

  //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
  LCDMenuLib_control_serial();        /* lcd menu control */   

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 12:35 pm
sorry habs gerade auch gelesen :smiley-roll-blue:

Ok und die Pinbelegung der Buttons?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 12:39 pm
ok auch gefunden :-)
Ist in der control.h

Danke für die Mühe an alle

Mfg.
Haustechno
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 23, 2013, 12:42 pm
Das Keypad Shield nutzt A0 oder A1, weiß ich jetzt nicht mehr.
Wenn du aber jetzt mit Pinbelegung ankommst, versteh ich es so dass du kein Keypad Shield hast und jeden Taster/Button an den Arduino anklemmen willst.
Dazu muss man hier was ändern, wie ich es verstehe. Hab es noch nicht gebraucht.
Code: [Select]
void LCDMenuLib_control_digital()
{
  #define _BUTTON_digital_enter         1   
  #define _BUTTON_digital_up            2
  #define _BUTTON_digital_down          3
  //optional
  #define _BUTTON_digital_enable_quit   1
  #define _BUTTON_digital_quit          4
  //optional
  #define _BUTTON_digital_enable_lr     1
  #define _BUTTON_digital_left          5
  #define _BUTTON_digital_right         6
 


Dann musst du aber auch in der loop anpassen:
Code: [Select]
LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 12:45 pm
jetzt noch eine Frage zum backlight.

ich habe das Backlight mit:
int Backlight = A1;

Und mit:
Quote
pinMode(Backlight, OUTPUT);  

           
Quote
digitalWrite(Backlight, HIGH);  und  digitalWrite(Backlight, LOW);

EDIT: High gegen Low getauscht :-)
ein und ausschalten.

Nun möchte ich das das backlight nur bei betättigung eines der taster für eine gewisse Zait an und dann wieder ausgeht.

wie kann ich das lösen?

Momentan hab ich in :
void setup()
Quote
{  
 pinMode(Backlight, OUTPUT);              // Analogpin als ausgang deffiniernen
 digitalWrite(Backlight, HIGH);  


das backlight beim start auf dauerein geschaltet.

danke vorab,

Mfg.
Haustechno
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 12:49 pm
Ja ich habe kein Shield,das lcd hängt so an dem Arduino uno angelötet auf lochraster.
Die taster kann ich dann nach belieben löten.

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 23, 2013, 12:51 pm
Quote
digitalWrite(Backlight, HIGH);  und  digitalWrite(Backlight, HIGH);
ein und ausschalten.


Da machst du es einmal an und dann einmal an.

Wie solls aus?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 12:52 pm
:smiley-yell: :smiley-mr-green:

Ja mal high mal low natürlich,schreibe schneller als ich denke :smiley-zipper:
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 23, 2013, 12:56 pm
Die LCDMenuLib hat ja ein INIT SCREEN

Du könntest es so machen, wenn der INIT SCREEN angezeigt wird, soll Backlight LOW.

Wenn man dann eine Taste drückt, zeigt ja immer das Menü an, also machst du da dein Code mit Backlight HIGH
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 01:14 pm
Besten DANK ;)

Funktioniert !

Mfg.
Haustechno
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 04:20 pm
so da bin ich leider wieder :(

Also hab alles hinbekommen,leider stört mich noch eine Sache.

Auf dem lcd wir die zeile 0 und die 1 richtig dargestellt,zeile 2 und 3 sind verschoben um vier felder nach rechts.
Auch die untermenüs sind somit verschoben,find den Fehler leider nicht.

LCD ist ein 16x4  HD44780 LCD,die Pinbelegung sollte im code ok sein da ja alles dargestellt wird,oder?

Mfg.
Haustechno
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 04:29 pm
Hier meine Einstellungen:
Quote
/* LCD Einstellungen */
#define _LCDMenuLib_LCD_cols             16
#define _LCDMenuLib_LCD_rows             4

/* LCD Pin Belegung */ 
#define _LCDMenuLib_LCD_rs               2
#define _LCDMenuLib_LCD_e                3
#define _LCDMenuLib_LCD_dat0             4
#define _LCDMenuLib_LCD_dat1             5
#define _LCDMenuLib_LCD_dat2             6
#define _LCDMenuLib_LCD_dat3             7

/* lib einstellungen */
#define _LCDMenuLib_cfg_initscreen       1      /* 0=disable, 1=enable */
#define _LCDMenuLib_cfg_initscreen_time  30000  /* 0=time disabled, >0 wait time in ms */
#define _LCDMenuLib_cfg_scrollbar    1      /* 0=no scrollbar, 1=complex scrollbar, 2=easy scrollbar */
#define _LCDMenuLib_cfg_lcd_standard    0      /* 0=HD44780 standard / 1=HD44780U standard */
#define _LCDMenuLib_cfg_press_time       200    /* button press time in ms */

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 23, 2013, 04:33 pm
Die "Einstellungen" können ja richtig sein, man muss die auch richtig verbinden und löten.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 04:39 pm
Tja,da war ich grade dran und hab denke auch was gefunden...

Also in den einstellungen steht :
#define _LCDMenuLib_LCD_rs                  2
#define _LCDMenuLib_LCD_e                   3
#define _LCDMenuLib_LCD_dat0            4
#define _LCDMenuLib_LCD_dat1             5
#define _LCDMenuLib_LCD_dat2             6
#define _LCDMenuLib_LCD_dat3             7

Mein lcd ist aber nicht an data 0,1,2,3 sondern an data 4,5,6,7

Frage:
Kann ich nun die 4 bit leitungen einfach ändern im code?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 23, 2013, 04:43 pm
Nein, es ist egal ob da steht
#define _LCDMenuLib_LCD_dat0            4
#define _LCDMenuLib_LCD_dat1             5
#define _LCDMenuLib_LCD_dat2             6
#define _LCDMenuLib_LCD_dat3             7

oder

#define _LCDMenuLib_LCD_dat4            4
#define _LCDMenuLib_LCD_dat5             5
#define _LCDMenuLib_LCD_dat6             6
#define _LCDMenuLib_LCD_dat7             7

bzw hat es in deinem Fall nix zu sagen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 23, 2013, 04:45 pm
Das passt trotzdem, die Lib arbeitet mit 4.5.6.7.   Nur es gab mal fragen wieso die Nummerierung erst bei 4 beginnt, darauf hin habe ich die Nummerierung von 0 - 3 gemacht. Dies ist mit 4 - 7  gleichzusetzen.

Ich schau gerade mal in den Quellcode, ein Display mit 16x4 hab ich bisher noch nie gesehen und konnte es auch nicht testen. Vielleicht liegt hier der Fehler. Muss aber nicht.

Wo kann man denn 16x4 Displays kaufen ?  Ich kenne nur 16x2, 20x4, 40x4

Sind eventuell die Strings in der Namensgebung zu lang, so dass diese bis in die nächste Zeile gehen ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 04:50 pm
Hmm,

ok also mein lcd ist  so i etwa:
http://www.ebay.de/itm/STN-LCD-Anzeigemodul-4-x-16-Zeichen-/200935307868?pt=LH_DefaultDomain_77&hash=item2ec8ad7a5c (http://www.ebay.de/itm/STN-LCD-Anzeigemodul-4-x-16-Zeichen-/200935307868?pt=LH_DefaultDomain_77&hash=item2ec8ad7a5c)

Hat 16 Zeichen pro Zeile und vier zeilen,und den HD44780 Controller
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 04:52 pm
Also zu lang denke nicht:
Quote
LCDMenuLib_element(0  , Item         , Item_1        , "Hauptmenue"         , FUNC);
LCDMenuLib_element(1  , Item         , Item_2        , "VersionInfo"        , FUNC);

LCDMenuLib_element(2  , Item         , Item_3        , "Servotest"          , FUNC);           // Bereich_1 Servotest
LCDMenuLib_element(3  , Item_3       , Item_3_1      , "Servo_Links"        , FUNC);           // Servotest links starten
LCDMenuLib_element(4  , Item_3       , Item_3_2      , "Servo_Rechts"       , FUNC);           // Servotest rechts startetn
LCDMenuLib_element(5  , Item_3       , Item_3_3      , "Zurueck"            , FUNC_back);      // Zurück


wie gesagt erste und zweite zeile ok,dritte und vierte um vier felder nach rechts versetzt
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 23, 2013, 04:53 pm
Ich habe gerade nochmal in den Quelltext geschaut. Es wird nicht überprüft ob die Zeichenlänge des Textes auch in das Display passt.

Kannst du sicher sein, dass der Text der Menuelemente nicht zu lang ist  und wird der Scrollbalken und der Kursor an der richtigen stelle angezeigt ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 04:56 pm
sowohl der Kursor als auch der text sind verschoben so al wären die ersten viel felder nicht da,also quasi:



Hauptmenue
Versionsinfo
     Servotest
     zurueck
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 23, 2013, 04:58 pm
LCDMenuLib_element(0  , Item         , Item_1        , "Hauptmen\365"         , FUNC);
LCDMenuLib_element(1  , Item         , Item_2        , "VersionInfo"        , FUNC);

LCDMenuLib_element(2  , Item         , Item_3        , "Servotest"          , FUNC);           // Bereich_1 Servotest
LCDMenuLib_element(3  , Item_3       , Item_3_1      , "Servo_Links"        , FUNC);           // Servotest links starten
LCDMenuLib_element(4  , Item_3       , Item_3_2      , "Servo_Rechts"       , FUNC);           // Servotest rechts startetn
LCDMenuLib_element(5  , Item_3       , Item_3_3      , "Zur\365ck"            , FUNC_back);      // Zurück


Teste mal obs damit besser aussieht
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 05:03 pm
leider ohne Änderungen....

Hilft dir ein foto vom zustand des lcd?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 23, 2013, 05:05 pm
Ich kann mir das gerade nicht erklären.
Vor allem, da es bei anderen Displays läuft. (20x4). Nur der Versatz von 4 Zeichen ist so auffällig, dass ich einen Bug nicht ausschließen kann.

In der Lib wird mit
Code: [Select]

lcd->_LCDML_lcd_setCursor(0,i-scroll);
lcd->_LCDML_lcd_write(0x20);                        
lcd->_LCDML_lcd_print(buffer);


Der Inhalt geschrieben. Da der Cursor vorher explizit auf 0 gesetzt wird versteh ich nicht wieso er bei 4 anfängt. Naja, man lernt immer dazu.

Muss nun aber auch los. Nach Weihnachten kann ich tiefer suche. Ich habe im Moment keinen Arduino und kein Display in der Nähe.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 05:08 pm
Hey hast ja die Ü zeichen gezaubert,immerhin ;)

Trotzdem vielen Dank uns schöne weihnachten und guten rutsch ins neue jahr an alle,

Mfg.
Haustechno


PS.
wäre ganz lieb wenn du was findest mir dann ne nachricht zukommen zu lassen,Danke
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 23, 2013, 05:11 pm
Na also, sieht ja doch besser aus  8)

Wie es für mich nun aussieht, macht der es rechtsbündig und nicht linksbündig.
Hatte da mal was gelesen, ist aber etwas länger her wo ich mich mit LCDs beschäftigt hatte.

Foto wär cool
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 23, 2013, 05:32 pm
Ok,
na dann hier die pics :-)

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 28, 2013, 09:12 am
Morgen allerseits,

komme leider nicht weiter:

Quote
LCDMenuLib_element(0  , Item         , Item_1        , "Hauptmen\365"       , FUNC);                // Bereich_1 versionsinfo

LCDMenuLib_element(1  , Item         , Item_2        , "Servotest"          , FUNC);                // Bereich_3 Servotest
LCDMenuLib_element(2  , Item_2       , Item_2_1      , "Servo_Links"        , FUNC);                // Servotest links starten
LCDMenuLib_element(3  , Item_2       , Item_2_2      , "Servo_Rechts"       , FUNC);                // Servotest rechts startetn
LCDMenuLib_element(4  , Item_2       , Item_2_3      , "Zur\365ck"          , FUNC_back);           // Zurück

LCDMenuLib_element(5  , Item         , Item_3        , "Sp\365lung"         , FUNC);                // Bereich_4  Spülung
LCDMenuLib_element(6  , Item_3       , Item_3_1      , "Intervalsp\365len"  , FUNC);                // Submenü Intervalspülen
LCDMenuLib_element(7  , Item_3       , Item_3_1_1    , "Zeit"               , FUNC);                // Spülen nach Uhrzeit
LCDMenuLib_element(8  , Item_3       , Item_3_1_2    , "Wochentag"          , FUNC);                // Spülen nach Wochentag
LCDMenuLib_element(9  , Item_3       , Item_3_1_3    , "Zur\365ck"          , FUNC_back);           // Zurück

LCDMenuLib_element(10 , Item         , Item_4        , "FunkSystem"         , FUNC);                // Bereich_5  Funksystem
LCDMenuLib_element(11 , Item_4       , Item_4_1      , "Kanal Info"         , FUNC);                // FS20 Adresse Anzeigen
LCDMenuLib_element(12 , Item_4       , Item_4_2      , "FS20 Anlernen"      , FUNC);                // FS20 Anlernen
LCDMenuLib_element(13 , Item_4       , Item_4_3      , "Zur\365ck"          , FUNC_back);

LCDMenuLib_element(14  , Item         , Item_5        , "PanelConfig"       , FUNC);                      // Bereich_5 Panel
LCDMenuLib_element(15  , Item_5       , Item_5_1      , "Ambilight"         , FUNC);                    // Ambilight
LCDMenuLib_element(16  , Item_5       , Item_5_1_1    , "Farbe"             , FUNC);                    // Farbe
LCDMenuLib_element(17  , Item_5       , Item_5_1_2    , "Sensor"            , FUNC);                   // Touchsensor
LCDMenuLib_element(18  , Item_5       , Item_5_1_3    , "Zur\365ck"         , FUNC_back);           // Zurück


leider wird der Code nur bis 
LCDMenuLib_element(17  , Item_5       , Item_5_1_2    , "Sensor"            , FUNC);                   // Touchsensor
bis "Sensor" im lcd angezeigt.
Das
LCDMenuLib_element(18  , Item_5       , Item_5_1_3    , "Zur\365ck"         , FUNC_back);           // Zurück
taucht im LCD gar nicht mehr auf???
Hab ich da was übersehen?

Danke vorab,

Mfg.
Haustechno
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Dec 28, 2013, 09:23 am
 #define _LCDMenuLib_cnt    4    //muss der letzten verwendeten ID im Menü entsprechen

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 28, 2013, 09:31 am
Jep,
vielen Dank das war`s ;-)
Hab gerade auch noch die erste Seite überflogen,und es auch gefunden :-(

Mfg.
Haustechno
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 28, 2013, 10:19 am
Vielleicht auch noch ein anderer Fehler:

Code: [Select]

LCDMenuLib_element(5  , Item         , Item_3        , "Sp\365lung"         , FUNC);                // Bereich_4  Spülung
LCDMenuLib_element(6  , Item_3       , Item_3_1      , "Intervalsp\365len"  , FUNC);                // Submenü Intervalspülen
LCDMenuLib_element(7  , Item_3       , Item_3_1_1    , "Zeit"               , FUNC);                // Spülen nach Uhrzeit
LCDMenuLib_element(8  , Item_3       , Item_3_1_2    , "Wochentag"          , FUNC);                // Spülen nach Wochentag
LCDMenuLib_element(9  , Item_3       , Item_3_1_3    , "Zur\365ck"          , FUNC_back);           // Zurück


Sollte vermutlich so aussehen

Code: [Select]

LCDMenuLib_element(5  , Item         , Item_3        , "Sp\365lung"         , FUNC);                // Bereich_4  Spülung
LCDMenuLib_element(6  , Item_3       , Item_3_1      , "Intervalsp\365len"  , FUNC);                // Submenü Intervalspülen
LCDMenuLib_element(7  , Item_3_1       , Item_3_1_1    , "Zeit"               , FUNC);                // Spülen nach Uhrzeit
LCDMenuLib_element(8  , Item_3_1       , Item_3_1_2    , "Wochentag"          , FUNC);                // Spülen nach Wochentag
LCDMenuLib_element(9  , Item_3_1       , Item_3_1_3    , "Zur\365ck"          , FUNC_back);           // Zurück


da ansonsten die eine Ebene wegfällt.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Dec 28, 2013, 02:28 pm
Ja,
natürlich,hab`s jetzt so gemacht :smiley-red:
Ich wollte zuerst ein Menü erstellen bevor ich die Funktionen nach und nach einpflege,d.h. wenn ich es irgendwie hinkriege :smiley-roll-blue:

Vielen Dank nochmal für die Hinweise,

Mfg.
Haustechno
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Haustechno on Jan 02, 2014, 11:13 am
Frohes neues an alle ;-)

@jomelo,

Vielen dank für deine Mühe (pm),leider gibt es keine Änderung was das versetzte angeht :-(
Wenn es bei dir nicht auftritt,dann kann es ja nur an meinem LCD Liegen .
Jedoch ist es dennoch komisch,denn das gleiche LCD hab ich auch in einem anderem Bausatz  gehabt,
und da läuft es ohne probleme.Welche lib dort allerdings eigesetzt ist kann ich leider nicht sagen :(
Ich habe neue Displays bestellt,mal sehen......

Aber da hab ich noch eine Frage,und zwar gibt es ein horizontales menü auch?
Das jetztige ist ja vertikal!

Denn jetzt ist es ja so bei mir:

Hauptmenü
      ==
Servotest
        Servo_Links
        Servo_Rechts
        Zurück
==
Spülung

usw.........

Wäre das acu so machbar ?:

Hauptmenü    ==)    Servotest       ==)        Spülung       ==) usw...... ==)   Zurück
                                       Servo_Links
                                       Servo_Rechts
                                       Zurück

Vielleicht sogar so das die Menüauswahl sich vor und zurück wählen läßt?
Dabei Sollte die Zeile 0 aber immer frei bleiben denn da sollte später mal die Uhr rein


Mfg.
Haustechno



Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jan 02, 2014, 11:38 am
Hi,
diese Funktionalität wird so leider nicht unterstützt. Man kann sich alles selber so schreiben und anpassen, aber da es jeder dann anders haben will ist das so nicht vorgesehen und auch mit einigem Arbeitsaufwand verbunden.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: SaschaMega on Jan 24, 2014, 05:17 pm
Hallo,
ich experimentiere nun auch schon eine Weile mit dieser Lib und sie macht auch immer, was sie soll. Vielen Dank dafür! Jetzt meine Frage: als Tastatur verwende ich ein Matrix-Keypad  (4x4), welches ich mithilfe der Keypad.h ( http://playground.arduino.cc/Code/Keypad (http://playground.arduino.cc/Code/Keypad)) auslese. Die LCDML_control-Funktion dafür habe ich so angepasst:
Code: [Select]

/* serial menu control */
void LCDMenuLib_control_keypad()
{
    if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time))
    {
      switch(kpd.getKey())
      {
        case 'E': LCDML.Button_enter(); break;
        case 'U': LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); break;
        case 'D': LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); break;
        case 'L': LCDML.Button_up_down_left_right(_LCDMenuLib_button_left); break;
        case 'B': LCDML.Button_up_down_left_right(_LCDMenuLib_button_right); break;       
        case 'S': LCDML.Button_quit(); break;         
        default: break;
      }
    }
 
}


Nun würde ich aber auch gern die Zifferntasten der Tastatur zum Einstellen verschiedener Schalt(Uhr)zeiten benutzen.
dazu benutze ich: char key = kpd.getKey();
Das funktioniert, aber ich komme aus der Funktion nicht mehr heraus (über das Abfragen der 6 Steuertasten).  LCDML.checkButtons() funktioniert scheinbar nicht, wenn man auch kpd.getKey(); in einer Funktion verwendet. Ich hoffe, ich habe mein Problem verständlich dargestellt, ich möchte also Werte direkt über das Keypad eingeben können und die Funktion zB. mit dem LCDML.Button_quit() verlassen können. hier nochmal der Code der Funktion:
Code: [Select]
/* callback function - FUNC_LED_standard */
void FUNC_Lightsetting(void)
{
    uint8_t button_value=0; 
    uint8_t i=0;
  /* setup function */       
  if(!LCDML.FuncInit())
  {
    g_button_value=0;

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Startzeit: ");
    lcd.print(erste_Null(g_hour_start)); 
    lcd.print(":");
    lcd.print(erste_Null(g_minute_start)); 
 
    lcd.setCursor(0,1);
    lcd.print("Stoppzeit: ");
    lcd.print(erste_Null(g_hour_stopp)); 
    lcd.print(":");
    lcd.print(erste_Null(g_minute_stopp)); 
    lcd.setCursor(11,0);
    lcd.blink();
  }
char key = kpd.getKey();
if(LCDML.checkButtons()) ////////////////////////////////////////Diese Bedingung funktioniert hier so nicht, wenn die vorige Zeile nicht auskommentiert ist
   {
     Serial.println("Button");
   }
   
   
while(i<=7)//8 Ziffern müssen eingegeben werden
   { 
    char key = kpd.getKey();
    if (key != NO_KEY)
      {
        i++;
        switch(i)
             {
             case 1://1. Ziffer///////////////////////////////////////////Eingabe Stunde Start////////
              Serial.println("1. Stelle");
              if(key-48 <=2)
                {
                  lcd.print(key);
                  g_hour_start = 10 * (key-48);
                  lcd.setCursor(12,0);
                }
              else i--;
              break;
             
             case 2://2. Ziffer
              Serial.println("2. Stelle");
              lcd.print(key);
              g_hour_start = g_hour_start + (key-48); 
              if(g_hour_start<=24) lcd.setCursor(14,0);
              else i--;
              break;/////////////////////////////////////////////////////////////////////////////////
             
             case 3://3. Ziffer//////////////////////////////////Eingabe Minute Start////////////////
              Serial.println("3. Stelle");
              if(key-48 <=5)
                {
                  lcd.print(key);
                  g_minute_start = 10 * (key-48);
                  lcd.setCursor(15,0);
                }
              else i--;
              break;
             
             case 4://4. Ziffer
              Serial.println("4. Stelle");
              lcd.print(key);
              g_minute_start = g_minute_start + (key-48);             
              if(g_minute_start<=59) lcd.setCursor(11,1);
              else i--;
              break;/////////////////////////////////////////////////////////////////////////////////

             case 5://1. Ziffer///////////////////////////////////////////Eingabe Stunde Stopp////////
              Serial.println("1. Stelle Stopp");
              if(key-48 <=2)
                {
                  lcd.print(key);
                  g_hour_stopp = 10 * (key-48);
                  lcd.setCursor(12,1);
                }
              else i--;
              break;
             
             case 6://2. Ziffer
              Serial.println("2. Stelle Stopp");
              lcd.print(key);
              g_hour_stopp = g_hour_stopp + (key-48); 
              if(g_hour_stopp<=24) lcd.setCursor(14,1);
              else i--;
              break;/////////////////////////////////////////////////////////////////////////////////
             
             case 7://3. Ziffer//////////////////////////////////Eingabe Minute Stopp////////////////
              Serial.println("3. Stelle stopp");
              if(key-48 <=5)
                {
                  lcd.print(key);
                  g_minute_stopp = 10 * (key-48);
                  lcd.setCursor(15,1);
                }
              else i--;
              break;
             
             case 8://4. Ziffer
              Serial.println("4. Stelle Stopp");
              lcd.print(key);
              g_minute_stopp = g_minute_stopp + (key-48);             
              if(g_minute_stopp<=59) lcd.setCursor(11,2);
              else i--;
              break;/////////////////////////////////////////////////////////////////////////////////
           
             }             
       }
    }
   

  lcd.print("OK!");
  Serial.println(g_hour_start);
  Serial.println(g_minute_start);

  /* end function for callback */
  if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1))  /* (direct, up, down, left, right) */
  {
    lcd.noBlink();
  }
}

Danke für eure Mithilfe,
Gruß
Sascha
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jan 25, 2014, 09:44 am
Hi,

die Funktion LCDML.checkButtons ist nur für 6 Buttons ausgelegt, daher werden deine eigenen nicht unterstützt. Die Zeile kann daher so direkt nicht funktionieren. Man könnte die Funktion aber Manuel setzen z.B:

Code: [Select]

//Gloable Variable, diese sollte irgendwo oberhalb der setup() stehen
char   g_save_keypad = 0;
/* callback function - FUNC_LED_standard */
uint8_t g_lightsetting_current_pos = 0;
/* falls noch keine globale timer variabel existiert, muss diese verwendet werden */
unsigned long g_timer_1 = 0;    /* timer variable */



/* serial menu control */
void LCDMenuLib_control_keypad()
{
   if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time))
   {
        /* minimal verändern */
        char l_key = kpd.getKey();   // das l_  steht für lokale variabel
     switch(l_key)
     {
       case 'E': LCDML.Button_enter(); break;
       case 'U': LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); break;
       case 'D': LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); break;
       case 'L': LCDML.Button_up_down_left_right(_LCDMenuLib_button_left); break;
       case 'B': LCDML.Button_up_down_left_right(_LCDMenuLib_button_right); break;      
       case 'S': LCDML.Button_quit(); break;

       /* neu */
      case 'deine_zahl':  
         // Button Check setzen
         bitWrite(LCDML.button, _LCDMenuLib_button, 1);
         g_save_keypad = l_key;
     break;

     //.. weitere abfragen nach dem gleichen schema      
       default: break;
     }
   }



Anschließend folgt in deiner Menu Funktion folgendes:
Code: [Select]


void FUNC_Lightsetting(void)
{  
/* setup function */      
if(!LCDML.FuncInit())
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Startzeit: ");
lcd.print(erste_Null(g_hour_start));  
lcd.print(":");
lcd.print(erste_Null(g_minute_start));  
 
lcd.setCursor(0,1);
lcd.print("Stoppzeit: ");
lcd.print(erste_Null(g_hour_stopp));  
lcd.print(":");
lcd.print(erste_Null(g_minute_stopp));  
lcd.setCursor(11,0);
lcd.blink();
}

// Die while schleife ist hier eine dumme lösung, da alle anderen funktionen nun darauf warten
// Weitere verbesserung, du führst die key-48 operation an mehreren stellen aus, an einer wäre angenehmer oder ?

// g_save_keypad >= '0'  liefert einen vergleich mit der zahl 48 die in ascii 0 enspricht
// g_Save_keypad <= '9'  liefert einen vergleich mit der zahl 57 die in ascii 9 enspricht
if(LCDML.checkButtons() && g_save_keypad >= '0' && g_save_keypad <= '9' && g_lightsetting_current_pos < 8)
{
Serial.println("Button");

Serial.print(g_lightsetting_current_pos+1);
Serial.print(". Stelle");



switch(g_lightsetting_current_pos)
{
//1. Ziffer///////////////////////////////////////////Eingabe Stunde Start////////
case 0:  
             if(g_save_keypad-48 <=2)
               {
                 lcd.print(g_save_keypad);
                 g_hour_start = 10 * (g_save_keypad-48);
                 lcd.setCursor(12,0);
 g_lightsetting_current_pos++;
               }        

break;

case 1://2. Ziffer
             
             lcd.print(g_save_keypad);
             g_hour_start = g_hour_start + (g_save_keypad-48);  
             if(g_hour_start<=24) {
 lcd.setCursor(14,0);
 g_lightsetting_current_pos++;
 }
           
             break;/////////////////////////////////////////////////////////////////////////////////
             
            case 2://3. Ziffer//////////////////////////////////Eingabe Minute Start////////////////
           
             if(g_save_keypad-48 <=5)
               {
                 lcd.print(g_save_keypad);
                 g_minute_start = 10 * (g_save_keypad-48);
                 lcd.setCursor(15,0);
 g_lightsetting_current_pos++;
               }
           
             break;
             
            case 3://4. Ziffer
           
             lcd.print(g_save_keypad);
             g_minute_start = g_minute_start + (g_save_keypad-48);              
             if(g_minute_start<=59) {
 lcd.setCursor(11,1);
 g_lightsetting_current_pos++;
 }
           
             break;/////////////////////////////////////////////////////////////////////////////////

            case 4://1. Ziffer///////////////////////////////////////////Eingabe Stunde Stopp////////
           
             if(g_save_keypad-48 <=2)
               {
                 lcd.print(g_save_keypad);
                 g_hour_stopp = 10 * (g_save_keypad-48);
                 lcd.setCursor(12,1);
 g_lightsetting_current_pos++;
               }
           
             break;
             
            case 5://2. Ziffer
             
             lcd.print(g_save_keypad);
             g_hour_stopp = g_hour_stopp + (g_save_keypad-48);  
             if(g_hour_stopp<=24) {
 lcd.setCursor(14,1);
 g_lightsetting_current_pos++;
 }
           
             break;/////////////////////////////////////////////////////////////////////////////////
             
            case 6://3. Ziffer//////////////////////////////////Eingabe Minute Stopp////////////////
           
             if(g_save_keypad-48 <=5)
               {
                 lcd.print(g_save_keypad);
                 g_minute_stopp = 10 * (g_save_keypad-48);
                 lcd.setCursor(15,1);
 g_lightsetting_current_pos++;
               }
           
             break;
             
            case 7://4. Ziffer              
             lcd.print(g_save_keypad);
             g_minute_stopp = g_minute_stopp + (g_save_keypad-48);              
             if(g_minute_stopp<=59) {
 lcd.setCursor(11,2);
 g_lightsetting_current_pos++;
 }
           
             break;/////////////////////////////////////////////////////////////////////////////////

 default: break;
         
            }  


}



if(g_lightsetting_current_pos >= 8)
{
// Damit das lcd nicht zuschnell blinkt
if(LCDML.Timer(g_timer_1, 1000))
{
lcd.print("OK!");
Serial.println(g_hour_start);
Serial.println(g_minute_start);
}

// Abbruch erst erlauben, wenn die 8 Ziffern eingegeben wurden
/* end function for callback */
 if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1))  /* (direct, up, down, left, right) */
 {
lcd.noBlink();
 }
}
}


Ich konnte den Code nicht testen, daher sind vermutlich noch kleine Fehler drin. Die While Schleife hab ich entfernt, da sie nicht mehr benötigt wird.

Im Normalfall sollte man mit Quit die Funktion trotz Zahleneingabe verlassen können.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: SaschaMega on Jan 27, 2014, 11:46 am
Hallo Jomelo,
vielen Dank für die schnelle Hilfe, ich konnte deinen code erst jetzt testen, er funktioniert auf Anhieb! Eine Frage habe ich noch zum Verständnis: Was macht dieser Befehl (in der angepassten  LCDMenuLib_control_keypad()):
Code: [Select]
bitWrite(LCDML.button, _LCDMenuLib_button, 1);

Danke
Sascha
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jan 27, 2014, 02:10 pm
Hi, die Funktion sorgt nur dafür das LCDML.checkButtons() funktioniert.
Es wird quasi das benötigte Bit in der Variable LCDML.button gesetzt.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: crossbreak on Jan 28, 2014, 09:54 am
Hi, cooles OS. Versuche gerade ein I2C LCD zum laufen zu bekommen. Typ10 ist es nicht. Alle anderen kompiliert er leider nicht.

Alles was in der LCDMenuLib_class.h für _LCDML_lcd_obj  definiert wird, kreidet mir der Kompilierer an. Typ 11 z.B. mit
Code: [Select]

lcdml_i2c:56: error: '_LCDMenuLib_LCD_backlight' was not declared in this scope


Bei den anderen Typen 12-15 wird's entsprechend noch bunter. Was läuft hier  falsch?

BTW, die pinbelegung+adresse meines LCDs kenne ich, hat mir LCD I2C guesser augespuckt. http://forum.arduino.cc/index.php?topic=157817.msg1235230#msg1235230 (http://forum.arduino.cc/index.php?topic=157817.msg1235230#msg1235230)


Gibt es eine Möglichkeit in deinem OS die Pinbelegung so ganz normal und frei zu konfiurieren, etwas so
Code: [Select]
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address and pinout


Danke für die Hilfe, bin echt gespannt :D
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jan 28, 2014, 11:02 am
Hi,
falsch läuft da gar nichts :-)  

Schau dir nochmal Punkt 4 im ersten Beitrag an, vor allem der letzte Satz bevor der Quellcode eingeblendet wird. Dort steht wie man die fehlenden Konstanten definiert.

Unter dem Quellcode steht dann auch was passiert, wenn man diese nicht einbindet  XD
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: crossbreak on Jan 28, 2014, 12:29 pm
Warum sollte ich die Pins denn 2mal definieren? In type 10-15 werden die doch schon definiert. Die Frage ist, warum akzeptiert der Kompiler das nicht?

type10 schreibt immerhin ein "A" in der mitte des Bildschirms, es müssen also Pins definiert sein.

Wenn ich Typ11 versuche, spuckt er mir ja o.g. Fehlermeldung aus. Wenn ich nun
Code: [Select]
#define _LCDMenuLib_LCD_backlight                 0
#define _LCDMenuLib_LCD_backlight_pol             0

hinzufüge (was überflüssig sein sollte, da es in der für type 11 in der  LCDMenuLib_class.h definiert wird) dann sagt er:
Code: [Select]
lcdml_i2c:59: error: invalid conversion from 'int' to 't_backlighPol'
Hier muss was falsch laufen, er glaubt 't_backlighPol' ist ein Datentyp??
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jan 28, 2014, 02:40 pm
Also die Type 10 - 15 definieren nicht die fehlenden Konstanten. Diese werden dann benötigt, aber nicht festgelegt. Daher müssen sie im Programm festgelegt werden.

Ich hab es gerade nochmals bei mir getestet, ich kann Version 10 - 15 kompilieren ohne Fehlermeldung wenn ich im Arduino Sketch die Konstanten einfüge.

Sieh dir das Bild im Anhang an!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: crossbreak on Jan 28, 2014, 11:10 pm
Ok. Es wird also "umdefiniert" sobald ich was anderes als 10 auswähle. Habs noch mal nachgeprüft, alles drüber kopiert usw. Fehler ist noch der selbe. Ich raff es nicht. Habe leider auch noch nix mit Klassen gemacht, deshalb steige ich durch das Programm nicht durch.
http://666kb.com/i/cldbwdl98ix7rhlxn.gif (http://666kb.com/i/cldbwdl98ix7rhlxn.gif)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jan 29, 2014, 08:27 am
Dann liefern wir dem Fehler einfach den Datentyp den er erwartet:

t_backlightPol ist so definiert:
Code: [Select]

typedef enum { POSITIVE, NEGATIVE } t_backlighPol;


Änder mal das define wie folgt um:
Code: [Select]

//....
#define _LCDMenuLib_LCD_backlight_pol     POSITIVE  // oder NEGATIVE  so wie dein LCD das benötigt
// ....


Dann wäre es Datentyp technisch korrekt.
Ich weiß nicht wieso er bei mir die "0" annimmt.

Ich hab die Änderung auch in der Beschreibung des ersten Beitrages geändert.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: crossbreak on Jan 29, 2014, 09:01 am
klappt, Danke!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jan 29, 2014, 09:09 am
:smiley-roll-blue:
Title: Anbindung an Schieberegister mittels SPI
Post by: nop0 on Feb 02, 2014, 11:14 pm
Hi erst mal Respekt vor deiner Arbeit. Mach weiter so.
Danke das du hier soviel Zeit und Mühe investierst.
Ich hab wenig Erfahrung mit Arduino hab ein paar kleine Übungen mit H-Brücken und LCD´s gemacht.

Nun ich möchte ca. 20 Buttons und ca. 20 LED´s und eine H-Brücke + LCD am Arduino UNO betreiben.
Das alles möchte ich über mehrere Schieberegister EIN und AUS lesen. Habe das Panel bereits erfolgreich am Schieberegister mit SPI am laufen. Nun bin ich auf dieses Projekt gestoßen, ich arbeite schon ein paar Tage mit der Libary, jedoch mit Serial Eingabe und das LCD direkt am Arduino.
Jetzt möchte ich die Buttons über Eingangsschieberegister einlesen und in der Menu.lib nutzen. Das LCD + LED +  H-Brücke auch über Schieberegister ansteuern. Irgendwie bin ich jetzt an einem Punkt wo ich nicht mehr richtig weiter komme und etwas überfordert bin.

Wie schreibe ich die einzelnen Bits für das LCD + LED´s + H-Brücken in die Schieberegister?

Ich denke ich hab auch noch einen kleinen Fehler in der keywords.txt festgestellt.
In der Zeil 93 steht
_LCDMenuLib_LCD_clk   LITERAL1
sollte aber
_LCDMenuLib_LCD_srclk   LITERAL1
heißen oder?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 03, 2014, 09:34 am
Hi,
ich selbst habe noch nicht mit Schieberegistern gearbeitet, wie du nun genau die einzelnen Funktionen aufrufst weiß ich nicht genau. Allgemeine Fragen dazu kann man besser in einem eigenem Thema stellen.

Allgemein LiquidCrystal_SR,  LCDMenuLib:
In der LCDMenuLib nutze ich eine externe Lib die eingebunden werden kann. Diese kann die Schieberegister für das LCD passend setzen.
Die Dokumentation zu der Lib findest du hier:  https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home
(alte LiquidCrystal an einen Ort außerhalb des Lib Verzeichnis kopieren und die Neue einfügen, anschließend die Arduino Software [alle Instanzen] schließen und neu öffnen)

In meiner Lib müsstest du nun in das Lib Verzeichnis wechseln und die LCDMenuLib___config.h öffnen. Hier kommentierst du die erste Zeile aus (Nummer 0) und die letzte Zeile ein (Nummer 20). Dies aktiviert den Schieberegister Modus.

Anschließend öffnest du z.B. das normale Beispeil aus meiner Lib.

Hier musst bei den Dateien die eingebunden werden die Zeile mit  #include <LiquidCrystal.h>  durch    <LiquidCrystal_SR.h> ersetzen.
Danach müssen noch die Konstanten für das Schieberegister definiert werden
Code: [Select]

#define _LCDMenuLib_LCD_srdata     0     //data pin    
#define _LCDMenuLib_LCD_srclk        1     //clock pin
#define _LCDMenuLib_LCD_enable     TWO_WIRE


Die Verdrahtung eines Schieberegisters mit dem LCD kann man hier finden:
https://code.google.com/p/arduinoshiftreglcd/

Eine ausführliche Anleitung zur Ansteuerung der Schieberegister findet man auch in den *.h Dateien der neuen LiquidCrystal Lib: Dort stehen viele Information wie z.B.:
für SR Register:
Quote

// Connection description:
//
// SR output:
// Bit  #0   - N/C - not connected, used to hold a zero
// Bit  #1   - N/C
// Bit  #2   - connects to RS (Register Select) on the LCD
// Bits #3-6 - connects to LCD data inputs D4 - D7.
// Bit  #7   - enables the LCD enable-puls (via the diode-resistor AND "gate")
//
// 2 or 3 Pins required from the Arduino for Data, Clock and (optional) Enable
// If not using Enable, the Data pin will be used for the enable signal.
// 2 wire mode can be indicated by:
// - ommitting the enable pin in constructor
// - defining the same pin for Enable as for Data in constructor
// - by using the token TWO_WIRE for the enable pin.


SR2W:
Quote

// 2 Pins required from the Arduino:
// - Data/Enable
// - Clock
// The Data pin is also used to control the enable signal
// LCD RW-pin hardwired to LOW (only writing to LCD).
// Busy Flag (BF, data bit D7) is not read.
//
//  Original project homepage: http://code.google.com/p/arduinoshiftreglcd/
//
// Shift register bits
// Bit  #0   - (cannot be used on 74HC595)
// Bit  #1   - optional backlight control
// Bit  #2   - connects to RS (Register Select) on the LCD
// Bit  #3   - connects to LCD data inputs D4
// Bit  #4   - connects to LCD data inputs D5
// Bit  #5   - connects to LCD data inputs D6
// Bit  #6   - connects to LCD data inputs D7
// Bit  #7   - enables the LCD enable-puls (via the diode-resistor AND "gate")


SR3W:
Quote

//   +--------------------------------------------+
//   |                 MCU                        |
//   |   IO1           IO2           IO3          |
//   +----+-------------+-------------+-----------+
//        |             |             |
//        |             |             |
//   +----+-------------+-------------+-----------+
//   |    Strobe        Data          Clock       |
//   |          8-bit shift/latch register        | 74HC595N
//   |    Qa0  Qb1  Qc2  Qd3  Qe4  Qf5  Qg6  Qh7  |
//   +----+----+----+----+----+----+----+----+----+
//        |    |    |    |    |    |    |    
//        |11  |12  |13  |14  |6   |5   |4   (LCD pins)
//   +----+----+----+----+----+----+----+----+----+
//   |    DB4  DB5  DB6  DB7  E    Rw   RS        |
//   |                 LCD Module                 |


Die SR2W und SR3W Versionen der neuen LiquidCrystal sind bisher noch nicht in der Lib eingebunden. Dies könnte ich aber heute Abend umsetzen.


Zur Ansteuerung der LCDMenuLib
Du könntest dir die folgende Funktion so umschreiben, dass das digitalRead durch deine Abfrage des Schieberegisters ersetzt wird. Danach wäre die Ansteuerung schon fertig.
Code: [Select]

void LCDMenuLib_control_digital_over_sr()
{
   if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time))
   {
if(digitalRead(_BUTTON_digital_enter))
   {
LCDML.Button_enter();
}
else if(digitalRead(_BUTTON_digital_up))
{
LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);
}
else if(digitalRead(_BUTTON_digital_down))
{
LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);
}
else if(digitalRead(_BUTTON_digital_left))
{
LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);
}
else if(digitalRead(_BUTTON_digital_right))
{
LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);}      
}
// Button Quit hat Priorität wenn mehrere Gleichzeitig gedrückt werden
if(digitalRead(_BUTTON_digital_quit))
{
LCDML.Button_quit();
}  
}
}


Ich hoffe das Hilft dir erstmal weiter und danke für den Tipp mit dem KeyFile, dass werde ich wenn ich etwas mehr Zeit habe mal anpassen.

Update 03.02.2014
- Beispiele überarbeitet bezüglich definierter Konstanten
- SR Beispiel eingefügt
- SR2W und SR3W werden nun unterstützt
- SR2W und SR3W Beispiele eingefügt
- Konstanten im Keyfile angepasst
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: crossbreak on Feb 04, 2014, 01:17 pm
Hi Jomelo,

wollte jetzt mal meine Pin-Konfiguration einstellen. Habe entsprechend alle  Pins definiertfür 4-bit mode mit I2C, dat4-7

ich bekomme ich wieder Fehler bei LCDMenuLib_createMenu(_LCDMenuLib_cnt);
Code: [Select]
lcdml_i2c:75: error: expected primary-expression before ',' token

Ich verstehe nicht wo der hercommt.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 04, 2014, 05:09 pm
Was ist denn der 4bit Modus mit I2C ?  Einfacher ist es wenn du mir sagst welche Konfiguration du in der LCDMenuLib___config.h eingestellt hast. Ich habs gerade bei mir mit dem Typen 10 - 15 getestet und habe keine Fehlermeldungen beim kompelieren. Definierte Variablen:
Code: [Select]

/* i2c address */
#define _LCDMenuLib_LCD_addr             0x20

#define _LCDMenuLib_LCD_e 0
#define _LCDMenuLib_LCD_rw 1
#define _LCDMenuLib_LCD_rs 2
#define _LCDMenuLib_LCD_dat4              3
#define _LCDMenuLib_LCD_dat5              4
#define _LCDMenuLib_LCD_dat6              5
#define _LCDMenuLib_LCD_dat7              6
#define _LCDMenuLib_LCD_backlight         7
#define _LCDMenuLib_LCD_backlight_pol     POSITIVE // NEGATIVE

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: crossbreak on Feb 05, 2014, 02:21 pm
?4bit Modus mit I2C ? Alle PCF8574 mit I2C benutzen das...der hat nur 8bit = 8pins, 4 für data, und noch 4 rs, e, rw, backlight.
Alle i2c adapter die man bei ebay findet für 1-2€ haben den PCF8574 drauf. Die ganze i2c lib ist in erster linie auf den ausgelegt.


typ 11 comiliert. Typ 12-15 sagt
Code: [Select]
lcdml_i2c:69: error: '_LCDMenuLib_LCD_dat0' was not declared in this scope
lcdml_i2c:69: error: '_LCDMenuLib_LCD_dat1' was not declared in this scope
lcdml_i2c:69: error: '_LCDMenuLib_LCD_dat2' was not declared in this scope
lcdml_i2c:69: error: '_LCDMenuLib_LCD_dat3' was not declared in this scope


wenn ich die auch noch definiere, dann sagt der comiler: nix!  Keine Ahnung wo der Kommafehler herkam. Plötzlich ist er weg.

Aus der normalen initialisierung kann man die Pinbelegung ablesen, etwa:
Code: [Select]
              //    (Addr, En, Rw, Rs, d4, d5, d6, d7, backlighPin,  pol    );
LiquidCrystal_I2C lcd(0x27,  2,   1, 0,  4,  5,  6,  7,           3, POSITIVE);


funktioniert bei meinem PCF8574 wunderbar, wenn ich dat0...dat3 auf 0 setze. Mit den Einstellungen 10-15 geht offensichtlich sowieso nur 4-bit.

Mit dem PCF8575 und 8bit konnte ich es dementsprechend nicht testen. Er hat 16bit, also sogar noch 4 pins übrig für Buttons. Kostet 1.50€ bei reichelt... 50cent mehr für 8 extra Pins ist echt ein guter deal im vergleich zum 8574.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 05, 2014, 04:43 pm
So wie du es geschrieben hast wird das Objekt auch angelegt:
Code: [Select]

LiquidCrystal_I2C lcd(_LCDMenuLib_LCD_addr, _LCDMenuLib_LCD_e, _LCDMenuLib_LCD_rw, _LCDMenuLib_LCD_rs, _LCDMenuLib_LCD_dat4, _LCDMenuLib_LCD_dat5, _LCDMenuLib_LCD_dat6, _LCDMenuLib_LCD_dat7, _LCDMenuLib_LCD_backlight, _LCDMenuLib_LCD_backlight_pol);


Aber nirgens unter 12 - 15 werden die  dat0 - dat3 verwendet. Wieso er das nun als Fehlermeldung ausgibt weiß ich nicht. Kannst du mal bei dir in der LCDMenuLib_class.h unter in Zeile 86 - 107 nachschauen ob irgendwo  das definiert ist ?

Ich hab gerade schon die alten Versionen der Lib durchgeschaut, aber dort habe ich die definitionen auch nicht deklariert. Sind vielleicht zwei Einträge in der ___config.h aktiv ?

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Shojo on Feb 07, 2014, 12:04 pm
Hi,
wollte grade Deine Lib ansehen mit dem Example "lcdml" , aber ich bekomme beim Compilieren aber den folgenden Werten:
Code: [Select]
/* menu element count - last element id */
#define _LCDMenuLib_cnt    17

/* init lcdmenulib */
LCDMenuLib_init(_LCDMenuLib_cnt);


den Felher:
Code: [Select]
Arduino: 1.5.5-r2 (Windows 8), Board: "Arduino Uno"

lcdml:43: error: expected constructor, destructor, or type conversion before '(' token

Wo Zeile 43 "LCDMenuLib_init(_LCDMenuLib_cnt);" ist.

Ein Tipp für mich?

Gruß
Shojo
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 07, 2014, 01:36 pm
Die Lib ist noch nicht für die Version 1.5.5 vom Arduino geeignet. Diese Arduino Version ist eine Beta und eigentlich nur für den Arduino Due geeinget und nicht so gut für die anderen. Daher wird die Lib unter dieser Version nicht laufen. Benutz die stabile Version 1.05 und dein Problem ist nicht mehr vorhanden.

Edit:
Wobei, ich hab es gerade mal getestet, bei mir kann ich die Lib mit der Version 1.5.5-r2 übersetzen ohne Fehlermeldungen. Hast du am Quellcode irgendetwas verändert ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Shojo on Feb 07, 2014, 07:33 pm
Nein alles Out of the Lib ;o)

#edit

Habe es nun mal mit der Version 1.05 versucht... gleicher Fehler.
Ich habe echt keine Ahnung weshalb die nicht bei mir will, habe nichts angefasst an der Lib und die ist auch direkt von github geladen.

Gruß
Shojo
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 07, 2014, 10:27 pm
Hi, ich habs gerade nochmal getestet, indem ich in einer Virtuellen Box ein frisches Windows 8.0 Image Installiert habe. Dann habe ich dort die Arduino Umgebung heruntergeladen und den letzten Stand der Lib von GitbHub.

Beim kompelieren tritt keine Fehlermeldung auf. Hast du sonst irgendetwas installiert welches den Kompeliervorgang stören könnte. Kannst du das Problem auf mehreren Rechnern nachweisen ?
Ich wunder mich immer wieso es bei einigen läuft und bei anderen nicht. Ich kann den Fehler im Moment so nicht reproduzieren.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Shojo on Feb 07, 2014, 10:44 pm
Ok danke Dir für deine Mühe!
Keine Ahnung was da stören sollte.... Habe jetzt hier nur Visual Studio 2013 Prof. zusätzlich drauf, das war es aber schon
Ich mache bei mir mal eine VM auf mit Win7  auf und melde mich dann zurück.

PS: Ich habe Win 8.1 drauf.

#edit

Leider geht es auch nicht in der VM....

#edit

Mir ist da noch was aufgefallen was anders ist .......
Mein #include <LCDMenuLib.h> in nicht .."Goldend"...
Bild 2
Warum ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 07, 2014, 11:11 pm
Das sollte eigentlich nicht sein. Es deutet darauf hin das nichtmal das keyfile gefunden wird.
Liegt die Lib den wirklich im libraries verzeichnis, bzw  ist in der Lib noch ein weiteres Verzeichnis außer "examples" ?

Edit:
Ok, habs gerade getestet, der Fehler tritt auf, da die Lib noch ein unterverzeichnis besitzt. Kopier mal das LCDMenuLib Verzeichnis direkt unter "libraries" dann sollte der Fehler nicht mehr auftauchen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Shojo on Feb 07, 2014, 11:14 pm
Nein die liegt im "C:\Users\XXXX\Documents\Arduino\libraries\"
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 07, 2014, 11:16 pm
siehe Anhang
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Shojo on Feb 07, 2014, 11:29 pm
Ok es läuft!

Deine Lib darf also nicht in einem Unterordner (Das hatte ich blos nicht gesehen, mein Fehler) und oder auch nicht im Sketchbook in den Lib-Ordner liegen.

Danke Dir nochmal für deine Mühen!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 07, 2014, 11:32 pm
Ne, ist aber auch bei eigentlich allen anderen Libs so. Ob sie nun mit im Sketch Ordner liegen darf habe ich noch nicht getestet. Ich werde noch eine kleine Installationsanleitung hinzufügen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Feb 08, 2014, 01:45 am
Jomelo, du tust mir leid  :smiley-mr-green:
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: ichbinsleute on Feb 08, 2014, 07:01 am
Guten morgen alle zusammen....
Von mir erst auch mal ein grosses Lob an Jomelo 8)
Ich würde diese auch gerne in meinem Projekt einsetzen, aber habe auch das gleiche Problem mit der Darstellung wie "haustechno" auf Page 19 oben.
Bei meinem 16X4 LCD sind die Reihen ebenfalls verschoben, obwohl alles richtig initiallisiert wurde.

Hat da jemand schon eine Lösung gefunden???
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 08, 2014, 08:27 am
Verwendest du das gleiche LCD ?
Mir ist so bisher noch keine Lösung bekannt.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: ichbinsleute on Feb 08, 2014, 08:50 am
ja. auch ein 16x4 mit I2C Aufsatz....
schade...ich finde die libary echt genial.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 24, 2014, 03:39 pm
Update 24.02.2014
- Unterstützung von DogLCD Displays, Einstellungen in der LCDMenuLib___config.h
- Beispiel DogLcd
- ShiftRegister Ansteuerung getestet
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Tim23 on Mar 01, 2014, 11:46 am
Hallo zusammen,

ich bin komplet neu hier. Hab mir jetzt für den Anfang folgendes Set gekauft:
http://www.amazon.de/SainSmart-Keypad-Starter-Arduino-Duemilanove/dp/B00HRRQPC6/ref=sr_1_2?ie=UTF8&qid=1393618008&sr=8-2&keywords=keypad+arduino

Nun hab ich mir die Daten wie beschrieben gezogen und wollte dann das Menü anschauen, leider ohne Erfolg.
"Upload abgeschlossen." Bekomm ich zurück, allerdings macht mein Display kein Mucks.
Prinzipiell funktioniert das Display und das Übertragen von Programmen, habe bereits selbst Texte anzeigen lassen.

Nun die Frage, was ich falsch mache? Viele Dank im voraus für die Hilfe!

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Mar 01, 2014, 04:39 pm
Die Anleitung nochmal durchgehen, ist auf Seite 1 ab dem ersten Post von Jomelo.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Tim23 on Mar 02, 2014, 04:54 pm
Hi,
hab die Anleitung erneut gelesen, aber immernoch Probleme.
Also habe, wie in der Anleitung beschrieben die config angepasst --> 8 Bit with Backlight
Ebenfalls hab ich die Schnittstellen angepasst, wie folgt:
Code: [Select]

#define _LCDMenuLib_LCD_cols             16
#define _LCDMenuLib_LCD_rows             2
#define _LCDMenuLib_LCD_rs               12
#define _LCDMenuLib_LCD_e                10
#define _LCDMenuLib_LCD_dat0             9
#define _LCDMenuLib_LCD_dat1             8
#define _LCDMenuLib_LCD_dat2             7
#define _LCDMenuLib_LCD_dat3             6
#define _LCDMenuLib_LCD_rw                        11
#define _LCDMenuLib_LCD_dat4                      5   
#define _LCDMenuLib_LCD_dat5                      4     
#define _LCDMenuLib_LCD_dat6                      3     
#define _LCDMenuLib_LCD_dat7                      2

#define _LCDMenuLib_LCD_backlight                 0
#define _LCDMenuLib_LCD_backlight_pol         POSITIVE

Habe auch diverse andere Konstelationen versucht, aber immer erfolglos.
Als Resultat erhalte ich auf dem Bildschirm ein "?" oder teilweise auch andere komische Zeichen.
Hab ich die Schnittstellen falsch definiert? Wenn ja, wie finde ich heraus, wie ich diese Konfigurieren muss? Die obere Darstellung hab ich aufgrund der Schnittstellenbeschreibung des Boardes vorgenommen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Mar 02, 2014, 06:40 pm
Hi, also ich hab das LCD nicht, aber die 8Bit definition scheint mir auf jeden Fall falsch zu sein. Stell am besten alle Einstellungen die du gemacht hast wieder auf den Standard zurück (oder lad die Lib erneut herunter). Danach öffne das Beispiel lcdml also die Standardversion für die 4Bit Schnittstelle und dann versuch erneut die Pins für dein LCD Anzupassen.

Falls es nicht läuft, schreib bitte die Pin Deklaration hier rein. Teste bitte auch nochmal die direkte Ansteuerung ohne die Lib und "poste" uns dann den Code hier als Antwort, so dass wir sehen können wie es läuft.

Auf Amazon steht:
Quote

SainSmart LCD Keypad shield: This Shield includes a 16x2 HD44780 White on Blue LCD module and a 5 push button keypad for menu selection and user interface programming. Fully assembled. On-line Arduino tutorial and example code. Compatible with Arduino Uno, Mega, Duemilanove. Uses digital pins 4 - 10, and analog pin 0.

Dieses deutet darauf hin das zwischen pin 4 - 10 die Anschlüsse: RS, E, DAT4, DAT5, DAT6, DAT7 liegen. Also kann es im 8Bit Modus garnicht laufen, da die Anschlüsse 0 - 3 nicht angeschlossen sind. Wie nun die Reihenfolge der Anschlüsse zum LCD sind, sollte im Datenblatt stehen.

Ich hoffe das hilft dir weiter.  
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: maxa on Mar 05, 2014, 03:03 pm
Hallo,
ich habe den Ordner  LCDMenuLib in Libraries kopiert. Aber beim Kopilieren  von z.B. lcdml erscheinen viele Fehlermeldungen:
ide Version: arduino 1.0.5+dfsg2-1
Fehlerauszug:
Code: [Select]
lcdml.ino:54:1: error: variable 'g_LCDMenuLib_lang_3_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
lcdml.ino:55:1: warning: 'prog_char' is deprecated (declared at /usr/lib/gcc/avr/4.7.2/../../../avr/include/avr/pgmspace.h:350): prog_char type is deprecated. [-Wdeprecated-declarations]
lcdml.ino:55:1: error: variable 'g_LCDMenuLib_lang_4_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'


Was kann das sein?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Mar 05, 2014, 03:15 pm
Wird bei dir im Beispiel beim #include   das  <LCDMenuLib.h>  in gelb angezeigt ?

Es scheint mir etwas mit dem Pfad der Lib nicht zu stimmen, da die "lang_..." -Konstanten immer definiert sind.  Kopier mal bitte nicht die untersten Fehlermeldungen, sondern die obersten die als erstes auftreten hier herein, falls die folgende Anleitung nicht hilft.

Schau mal hier:
http://forum.arduino.cc/index.php?topic=73816.msg1580280#msg1580280

Vielleicht hilft dir die Lösung die hier beschrieben wird weiter. Und bitte auch die folge Beiträge lesen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: maxa on Mar 05, 2014, 05:42 pm
Den Link hatte ich schon gelesen, aber es existiert kein weiteres Verzeichnis, ich habs einfach nur kopiertl
Nein  <LCDMenuLib.h>  wird nicht in gelb angezeigt.

Als erstes erscheinen nur Warnungen und dann wiederholen sich Fehlermeldungen bezogen auf die Konstanten "...lang_0_var'" bis  "...lang_17_var'"
Quote
In file included from /usr/share/arduino/libraries/LCDMenuLib/LCDMenuLib.h:118:0,
                from lcdml.ino:7:
/usr/share/arduino/libraries/LCDMenuLib/LCDMenuLib_makros.h:105:22: warning: Backslash und Newline durch Leerzeichen getrennt [enabled by default]
...
lcdml.ino:51:1: warning: 'prog_char' is deprecated (declared at /usr/lib/gcc/avr/4.7.2/../../../avr/include/avr/pgmspace.h:350): prog_char type is deprecated. [-Wdeprecated-declarations]
lcdml.ino:51:1: error: variable 'g_LCDMenuLib_lang_0_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
lcdml.ino:52:1: warning: 'prog_char' is deprecated (declared at /usr/lib/gcc/avr/4.7.2/../../../avr/include/avr/pgmspace.h:350): prog_char type is deprecated. [-Wdeprecated-declarations]
lcdml.ino:52:1: error: variable 'g_LCDMenuLib_lang_1_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
...
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Mar 05, 2014, 07:05 pm
Solange die Lib nicht gelb oder orange angezeigt wird, ist sie irgendwie falsch eingebunden. Ich bin im Moment mit meiner Zeit sehr begrenzt und kann erst am We näher danach schauen.

Hast du schon einmal probiert andere Libs einzubinden und diese zu testen ? Bisher hatte niemand ein Problem mit der Fehlermeldung, außer die Lib wurde wie erwähnt nicht richtig eingebunden.

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: maxa on Mar 05, 2014, 07:51 pm
Doch die eingebundenen lib wird natürlich farbig (orange) dargestellt, Pardon.

Ja, und  andere Libs funktionieren.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: DrunkenDude on Mar 09, 2014, 05:02 pm
Hallo,

Ich habe ein Programm, welches ich gerne in das Menü mit einbinden würde. Leider bekomme ich das nicht hin.

Code: [Select]

  void setup() {
  Serial.begin(9600);
  pinMode(7,OUTPUT);
}

boolean eineSekundeIstUm()
{
static unsigned long lastSekunde;
if (millis()/1000!= lastSekunde)
{
   lastSekunde=millis()/1000;
   return true;
}
return false;
}


int ausSchaltzeit=1;
int einSchaltzeit=30;
int counter = 0;

void schalten()
{
  static int sekundeImIntervall=0;
  if (sekundeImIntervall<einSchaltzeit)
  {
    if (digitalRead(7)==LOW)
    {
      digitalWrite(7,HIGH);
      counter++;
      Serial.println(counter);
      Serial.println(" EIN");
    }
  } 
  else if (digitalRead(7)==HIGH)
    {
      digitalWrite(7,LOW);
      Serial.println(" AUS");
    }
  sekundeImIntervall++;
  if (sekundeImIntervall>=einSchaltzeit+ausSchaltzeit)
  {
    sekundeImIntervall=0;
    ausSchaltzeit++;
  } 
}

void loop() {
  if (eineSekundeIstUm()) schalten();
}


Wäre super cool wenn sich das mal wer anschauen kann.

Gruß
DD
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Mar 09, 2014, 06:48 pm
Diese Funktion eineSekundeIstUm ist schon integriert, erstmal die Anleitung lesen und dann Fragen Stellen.
Punkt 8 bringt dir einige Antworten diesbezüglich.
Dann sehe ich kein Problem mehr, was dich hindern sollte programmieren zu lernen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pcace on Apr 04, 2014, 03:51 pm
Hi,

kann ich diese Library auch nutzen, wenn ich ein Sainsmart LCD Keypad shield (http://www.sainsmart.com/sainsmart-1602-lcd-keypad-shield-for-arduino-duemilanove-uno-mega2560-mega1280.html) habe und nutzen will?
Wenn ja, was muss ich machen um es zum laufen zu bekommen?

gruß
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Apr 04, 2014, 04:06 pm
Ja es funktioniert, kannst diese Lib dafür nutzen.
Einfach die Anleitung lesen, befolgen, nachbauen,nachmachen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pcace on Apr 06, 2014, 06:53 pm
hallo,

na das klappt ja wunderbar!! Selbst für mich als blutigen totalanfänger bekomme ich ein wunderschönes Menü auf das LCD gezaubert!
Danke!!

Nun aber eine Frage: wenn ich eine Funktion habe, und will, dass ich in der funktion buttons abfrage, dachte ich es ginge irgendwie so:

Code: [Select]
 
if(LCDML.checkButtons()) {
   if(LCDMenuLib_checkButtonLeft()) {
     LCDMenuLib_resetButtonLeft();
     Serial1.println("pp0");
     Serial.println("pp0");
   }

if(LCDMenuLib_checkButtonRight()) {
     LCDMenuLib_resetButtonRight();
     Serial1.println("pp1000");
     Serial.println("pp1000");
   }
 }


Was passieren soll: wenn ich "links" drücke, dann schreibt er pp0 und nach rechts pp1000. das links kommt auch an, leider das rechts nicht. Was ist falsch?

UND die 2. Frage:

ich habe dieses Sainsmart LCD keypad ding. Da gibt es einen Select, hoch, runter, links und rechts button. keinen "zurück button"
Wenn ich nun mit den links,rechts hoch runter buttons durchs menü wandern will und nicht mit dem select button bestätigen will, sonder den select button als zurück nehmen will, was muss ich da tun?!


Gruß

Pfannkuchen
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Apr 06, 2014, 06:56 pm
Code: [Select]
if(LCDML.checkButtons()) {
    if(LCDMenuLib_checkButtonLeft()) {
      LCDMenuLib_resetButtonLeft();
      Serial1.println("pp0");
      Serial.println("pp0");
    }
else

      Serial1.println("pp1000");
      Serial.println("pp1000");

  }


Ich nutze Links als zurück, du kannst aber enter als zurück nehmen
So ähnlich vielleicht?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pcace on Apr 06, 2014, 07:01 pm
Hi, das funktioniert.
Leider nur so lange, wie ich die anderen knöpfe nicht verwende.
Im endeffekt soll folgendes passieren:
hoch --> "tp1000"
runter --> "tp-1000"
rechts --> "pp1000"
links --> "pp-1000"


Wie kann ich das machen?

Gruß
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pcace on Apr 06, 2014, 07:30 pm
so funktionierts:

Code: [Select]
  if(LCDML.checkButtons()) {
 
    if(LCDMenuLib_checkButtonUp()) {
      LCDMenuLib_resetButtonUp();
      Serial1.println("to-50");
      Serial.println("to-50");
    }
  }
 

    if(LCDMenuLib_checkButtonDown()) {
      LCDMenuLib_resetButtonDown();
      Serial1.println("to50");
      Serial.println("to50");
    }


    if(LCDMenuLib_checkButtonRight()) {
      LCDMenuLib_resetButtonRight();
      Serial1.println("po50");
      Serial.println("po50");
    }
   
        if(LCDMenuLib_checkButtonLeft()) {
      LCDMenuLib_resetButtonLeft();
      Serial1.println("po-50");
      Serial.println("po-50");
    }




Gruß

Pfannkuchen
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pcace on Apr 06, 2014, 09:27 pm
Nun habe ich doch nochmal eine Frage:

sagen wir ich befinde mich auf level 1 des menüs, dann kann ich mit select in level 2 von dem menü springen.
Wie kann ich aber wieder zurück springen, wenn ich keinen zurückbutton habe? Wie kann ich das auf "links" legen?

Das darf allerdings nur funktionieren solange ich nur im menü bin und nicht in einer funktion, denn in den funktionen brauche ich auch den links button!

Ideen?

Gruß

Pfannkuchen
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Apr 06, 2014, 09:29 pm
Nimm den Reset Button als Zurück. musste an ein Analogen Pin verdrahten.
Sönst fällt mir nix ein
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pcace on Apr 10, 2014, 05:15 pm
Hi,

ich habe ein Problem mit der Library, welches ich so ohne weiteres nicht lösen kann als totalanfänger ;)

Wenn ich das DogLCD und das IC2 beispiel kompilieren will, bekomme ich folgenden fehler:

Code: [Select]
In file included from lcdml_DogLcd.ino:7:
/Users/user/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.h:126: error: ISO C++ forbids declaration of 'LiquidCrystal' with no type
/Users/user/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.h:126: error: expected ';' before '*' token
/Users/user/Documents/Arduino/libraries/LCDMenuLib/LCDMenuLib.h:173: error: 'LiquidCrystal' has not been declared
lcdml_DogLcd:60: error: 'LiquidCrystal' does not name a type
lcdml_DogLcd:60: error: 'lcd' was not declared in this scope
lcdml_DogLcd.ino: In function 'void setup()':
lcdml_DogLcd:65: error: 'lcd' was not declared in this scope
LCDML_function.ino: In function 'void FUNC_init_screen()':
LCDML_function:15: error: 'lcd' was not declared in this scope
LCDML_function.ino: In function 'void FUNC_information()':
LCDML_function:34: error: 'lcd' was not declared in this scope
LCDML_function.ino: In function 'void FUNC_timer_info()':
LCDML_function:70: error: 'lcd' was not declared in this scope
LCDML_function:77: error: 'lcd' was not declared in this scope
LCDML_function.ino: In function 'void FUNC_p2()':
LCDML_function:108: error: 'lcd' was not declared in this scope
LCDML_function:130: error: 'lcd' was not declared in this scope


oder hier die IC2 variante:

Code: [Select]
lcdml_i2c:66: error: '_LCDMenuLib_LCD_rs' was not declared in this scope
lcdml_i2c:66: error: '_LCDMenuLib_LCD_e' was not declared in this scope
lcdml_i2c:66: error: '_LCDMenuLib_LCD_dat0' was not declared in this scope
lcdml_i2c:66: error: '_LCDMenuLib_LCD_dat1' was not declared in this scope
lcdml_i2c:66: error: '_LCDMenuLib_LCD_dat2' was not declared in this scope
lcdml_i2c:66: error: '_LCDMenuLib_LCD_dat3' was not declared in this scope


Ideen?!

Gruß

Pcace
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Apr 10, 2014, 05:17 pm
Habe zwar lange nichts damit gemacht aber sieht mir danach aus als ob die config datei nicht richtig configuriert wäre.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pcace on Apr 13, 2014, 10:41 pm
Naja, ich habe einfach ein anderes Display genommen...

Nun funktioniert alles wunderbar. Ich habe nur eine kleine Programmierfrage bei der ich als Anfänger nicht so recht weiterkomme:
ich habe in meinen Funktionen nicht ein einziges mal delay() benutzt. Nun will ich aber einen digitalpin jede sekunde für ca. 50ms auf High stellen. in der lib gibt es ja ein paar timer, die ich nutze, aber irgendwie kome ich da nicht so rihtig weiter:

Code: [Select]

  if (shutterinterval_ms > 0){
    if(LCDML.Timer(shutter_timer_1, shutterinterval_ms)) {     //Timer initialisieren mit shutterinterval in ms
        //Löse Kamera aus
      shutter_count = shutter_count + 1; //Anzahl der Bilder
      D5000.shutterNow();
      digitalWrite(shutterpin,HIGH);
      digitalWrite(shutterpin, LOW);
    }
  }


so und nun soll 50ms gewartet werden bis digitalWrite(shutterpin, LOW);
Wie kann ich das machen? Hilft mir die Lib da irgendwie?

Gruß

Pcace
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Apr 13, 2014, 10:45 pm
Gut dass kein delay.
im ersten Post ist in der Anleitung beschrieben wie man es mit dem timer macht
punkt 8:
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pcace on Apr 13, 2014, 10:47 pm
Hmm,
aber was ich da nicht so ganz verstehe is: wenn ich einen timer habe, der zum beispiel jede sekunde etwas macht, wie mache ich dann einen timer, der auch jede sekunde etwas macht, das aber 50ms zum ersten timer verschoben?

Gruß

Pcace
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Apr 13, 2014, 10:51 pm
Verstehe die Anforderung nicht ganz.
schau dir simplethreads auch von Jomelo mal an.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pcace on Apr 13, 2014, 11:03 pm
Hallo,

danke für die schnellen Antworten, aber simplethreads scheint mir zu kompliziert um ein warschienlich so einfaches Problem zu lösen!
Ich habe mir jetzt sowas ausgedacht:

Code: [Select]

  if (shutterinterval_ms > 0){

    if(LCDML.Timer(shutter_timer_1, shutterinterval_ms)) {     //Timer initialisieren mit shutterinterval in ms
      //Löse Kamera aus
      shutter_count = shutter_count + 1; //Anzahl der Bilder
      D5000.shutterNow();
      digitalWrite(shutterpin,HIGH);
      d300s_timer_1 = millis();
    }
  }

  if (shutterpin == HIGH){
    if (d300s_timer_1 >= millis()-300){
      digitalWrite(shutterpin,LOW);

    }
  }


Trotzdem bleibt "shutterpin" einfach HIGH... durchgängig. Irgendwo muss doch ein verständnisfehler vorliegen oder?

Gruß

Pcace
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pcace on Apr 13, 2014, 11:10 pm
Gelöst!

ich glaube das hier ist das Problem:
Code: [Select]
if (shutterpin == HIGH){
das scheint nicht so wirklich zu gehen...

ich habe es jetzt so gemacht:

Code: [Select]
  if (shutterinterval_ms > 0){

    if(LCDML.Timer(shutter_timer_1, shutterinterval_ms)) {     //Timer initialisieren mit shutterinterval in ms
      //Löse Kamera aus
      shutter_count = shutter_count + 1; //Anzahl der Bilder
      D5000.shutterNow();
      digitalWrite(shutterpin,HIGH);
      d300s_timer_1 = millis();
    }
  }

  if (shutterpin){
    if ((millis()-100) >= d300s_timer_1){
      digitalWrite(shutterpin,LOW);

    }
  }


Danke trotzdem für die Hilfe!!!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Serenifly on Apr 13, 2014, 11:34 pm
Du musst den Zustand mit digitalRead() auslesen...

Was aber irgendwie Blödsinn ist, da du den Zustand ja kennst. Was du eher willst ist eine boolean Variable setzen wenn ausgelöst wurde und diese abfragen. Statt den Pin selbst. Und diese dann wieder auf false setzen wenn der Pin nach der Zeit wieder Low ist.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pcace on Apr 14, 2014, 09:26 pm
Hmm,

ich bin mir nicht so ganz sicher was passiert, aber das funktioniert:
Code: [Select]
if (shutterpin){
}

Ist das gleichbedeutend mit einer booleanvariable?

Gruß

PS.: ich hör ja schon auf so vollkommen offtopic fragen zu stellen ;)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Serenifly on Apr 14, 2014, 09:31 pm
Nicht wenn shutterpin eine Pin-Definition ist, so wie das aussieht, da du die Variable auch bei digtalWrite() verwendest

Generell gilt, dass 0 false ist und alles ungleich 0 ist true. Wenn du also sowas hast:
Code: [Select]

int shutterpin = 5;

Und dann darauf mit "if(shutterpin == true)" abfragst, ist das immer true.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pcace on Apr 14, 2014, 09:34 pm
das heisst also um genau zu sein, macht meine if abfrage einfach garnichts.

Danke dafür! funktionieren tut es trotzdem ;)

haha, schon witzig, wenn irgendwelche Sachen passieren, die man nicht versteht
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Serenifly on Apr 14, 2014, 09:39 pm
Es geht weil du da nur den Pin Low setzt. Was der Ausgangszustand ist. Wenn du da noch andere Dinge machen würdest, wäre da unter Umständen problematisch.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: VS14 on Apr 15, 2014, 07:44 pm
Hallo Jomelo und Danke für das Projekt einfach Klasse
Ich habe aber eine Frage um in einer Funktion den LCDML.Timer zu stopen und  oder Ihn zurückzusetzen ohne die Funktion zu verlassen wie stelle ich das an.
Gruß
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Apr 15, 2014, 09:10 pm
Wieso sollte man diesen zurücksetzen ?

Beschreib mal näher was du vor hast.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: VS14 on Apr 16, 2014, 05:48 pm

Hallo

Wie so oft geht es um die Fotografie

Ich möchte mit Hilfe Deiner Lib ein kleines Programm schreiben
zum Ablauf
In Deinem Programm bis zur Funktion Insekten gehen und
über nochmalige Drücken der Enter Taste wieder einen Schritt zurück.

Das klappt Prima .

Ich habe zwei Sensoren die ich abfragen möchte
Beim betätigen des Sensor1 schaltet die Kamera ein und macht ein unbelichtetes Bild.

Sollte nach 60s nichts weiter passieren schalte die Kamera aus und warte bis wieder der Sensor1 betätigt wird.

Wird in den 60s  der Sensor2 betätigt  öffnet der  den Verschluss http://www.uniblitz.com/product/VS14-shutter-system/ (http://www.uniblitz.com/product/VS14-shutter-system/) .
Nach 3ms (später diese Zeit einstellbar) schalte den Blitz ein  und mache das Bild
weitere ms  später soll die Kamera , Blitz und Verschluss ausgeschaltet werden.

Jetzt warte bis Sensor1 betätigt wird

Wenn ich den Timer  weglasse und es  über Delay mache geht das Prima.
Sobald ich aber einen Timer dafür verwende läuft es nur im ersten Durchgang.
Bestimmt ein grober Schnitzer von mir aber ich finde Ihn nicht
Gruß und Danke für die Hilfe

Code: [Select]
//Funktion für das Programms zum aufnehmen von Insekten

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void FUNC_INSEKTEN(void)
{
 if(!LCDML.FuncInit())
 {
   lcd.clear(); //.lösche Display
   lcd.setCursor(0,0); // Cursor wird auf Zeile 0 Pos.0 gesetzt
   lcd.print(F("Insekten")); // Insekten wird angezeigt
   lcd.setCursor(13,0); // Cursor wird auf Zeile 0 Pos.13 gesetzt
   lcd.print(F("ON")); // ON wird angezeigt
   lcd.setCursor(0,1); // Cursor wird auf Zeile 0 Pos.13 gesetzt
   lcd.print(F("Restzeit")); // Restzeit wird angezeigt
   lcd.setCursor(14,1); // Cursor wird auf Zeile 0 Pos.13 gesetzt
   lcd.print(F("s")); // s wird angezeigt
   g_button_value = 0;        // Variable (g_button_value) wird auf 0 gesetzt
   g_func_timer_1_info = 255;        // Variable (g_func_timer_0_info) wird auf 255 gesetzt
   
   
 }
 
int SENSOR1_state = digitalRead(SENSOR1);  // Eingangswert einlesen Sensor1 Eingang 2
 if (SENSOR1_state == HIGH )               // Eingang 2 HIGH?
 {
  digitalWrite(EOS, HIGH);     // Ausgang 11 (Blitz) wird eingeschaltet
  EOS_state=HIGH; // Merker EOS wird gesetzt
}

int SENSOR2_state = digitalRead(SENSOR2);        // Eingangswert einlesen Sensor2 Eingang 3
 if (SENSOR2_state == HIGH && EOS_state==HIGH )               // Eingang 3 HIGH und Merker EOS HIGH
 {
 digitalWrite(VS14, HIGH); // Ausgang 12 (VS14) wird eingeschaltet
 VS14_state=HIGH;                               // Merker VS14 wird gesetzt
 }
 
 if(VS14_state==HIGH)
 {
 if(LCDML.Timer(g_timer_0, 1))      /* init a timer with 1000ms */     // Merker VS14 wird gesetzt
   {
   g_func_timer_1_info--;                  /* increment the value every secound */
   lcd.setCursor(10,1);                   /* set cursor pos */
   lcd.print(g_func_timer_1_info);
 }
 }
if(VS14_state==HIGH && g_func_timer_1_info <= 10) // ist Timer_0_ kleiner gleich 10 und Merker VS 14 gleich HIGH      ?
{
  digitalWrite(BLITZ, HIGH);       // Ausgang 13 (Blitz) wird eingeschaltet
}

if(g_func_timer_1_info <=  0 )  // ist Timer_0_ kleiner gleich<=  0    oder     ist Timer_1_ kleiner gleich 0        ?

{
digitalWrite(BLITZ, LOW);           // Ausgang 131 (Blitz) wird ausgeschaltet
digitalWrite(VS14, LOW); // Ausgang 12 (VS14) wird ausgeschaltet
digitalWrite(EOS, LOW);        // Ausgang 11 (EOS) wird ausgeschaltet
//BLITZ_state=LOW; // Merker (Blitz) wird rückgesetzt
VS14_state=LOW;        // Merker (VS14) wird rückgesetzt
EOS_state=LOW;        // Merker (EOS) wird rückgesetzt
 }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// wird Enter Taster betätigt
// zähle (g_button_value)

 if(LCDML.checkButtons())
{
   if(LCDMenuLib_checkButtonEnter())
{
     LCDMenuLib_resetButtonEnter();
     g_button_value++;
   }
 }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ist (g_button_value) größer gleich1
// Aufruf der Funktion for callback um im Display zurück zu springen
  if(g_button_value >= 1)
{    
   if(LCDML.FuncEnd(1, 0, 0, 0, 0, 0)) // (direct, up, down, left, right)  
   {
digitalWrite(BLITZ, LOW);           // Ausgang 131 (Blitz) wird ausgeschaltet
digitalWrite(VS14, LOW); // Ausgang 12 (VS14) wird ausgeschaltet
digitalWrite(EOS, LOW); // Ausgang 11 (EOS) wird ausgeschaltet
BLITZ_state=LOW; // Merker (Blitz) wird rückgesetzt
VS14_state=LOW; // Merker (VS14) wird rückgesetzt
EOS_state=LOW; // Merker (EOS) wird rückgesetzt

   }
 }
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Funktions- Ende

/////////////////////////////////////////

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: blubbel on Apr 17, 2014, 12:46 pm
Hi!
Da ich zum eingeben der Daten gerne einen Drehimpulsgeber nutzen würde, hab ich mich mal an ner rechts/links Steuerung versucht. Leider komme ich nicht weiter. Die Pin Abfrage funktioniert, Das Menu selber auch, aber meine Erweiterung leider nicht.
Hier mal der Code:
Code: [Select]
void LCDMenuLib_control_rotary()
{
  if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) {
    AdaEncoder *thisEncoder = NULL;
    thisEncoder = AdaEncoder::genie();
    if (thisEncoder != NULL) {
      clicks = thisEncoder -> query();
      if (clicks > 0) {
        LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);
        Serial.println("CW");
      }
      if (clicks < 0) {
        LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);
        Serial.println("CCW");
      }
    }
  }
}

Hier meine loop()
Code: [Select]
void loop() {
 
  LCDMenuLib_control_rotary();
  LCDMenuLib_loop();
}

Der Serial Monitor spuckt mir auch brav mein CW oder CCW aus, aber das Menu bewegt sich nicht von der Stelle... Kann mir einer von euch erklären an was es liegt?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: VS14 on Apr 22, 2014, 06:02 pm
Hallo
über Ostern war lange Zeit sodas ich meine Frage selber lössen Konnte
Gruß
Code: [Select]
void FUNC_Voegel(void)
{

  if(!LCDML.FuncInit())
  {
    lcd.clear(); // Lösche LCD
    lcd.setCursor(0,0); // Cursor setzen Spalte 0 Zeile 0
    lcd.print(F("Voegel")); // schreiben „ Voegel „
    lcd.setCursor(13,0); // Cursor setzen Spalte 13 Zeile 0
    lcd.print(F("ON")); // schreiben „ ON „
    lcd.setCursor(0,1); // Cursor setzen Spalte 0 Zeile 1
    lcd.print(F("00s Restzeit")); // schreiben „ 00s Restzeit „
    g_button_value_0 = LOW; // Variable (g_button_value_0) auf LOW setzen
    g_func_timer_0_info = 30; // Variable (g_func_timer_0) auf 30 setzen
    g_func_timer_1_info = 60; // Variable (g_func_timer_1) auf 60 setzen
  }

  int SENSOR1_state = digitalRead(SENSOR1); // Eingangswert einlesen Sensor1 Eingang 2

  if (SENSOR1_state == HIGH)         // Eingang HIGH?
  {
    g_func_timer_0_info = 30; // Variable (g_func_timer_0) auf 30 setzen
    g_func_timer_1_info = 60; // Variable (g_func_timer_1) auf 30 setzen
    EOS_state=HIGH;    // Variable (EOS_state) auf HIGH setzen
  }

  if (EOS_state==HIGH)         // ist Variable (EOS_state) HIGH ???
  {
    if(LCDML.Timer(g_timer_0, 1000)) // injiziere (g_timer_0) mit 1000ms
    {
      g_func_timer_0_info--; // inkrementiere den Wert des ( timer_0 ) hier Sekunde
      if (g_func_timer_0_info-- >= 10) // ist der Wert des ( timer_0 ) größer gleich 10
      {
        lcd.setCursor(0,1); // Cursor setzen Spalte 0 Zeile 1
        lcd.print(g_func_timer_0_info); // schreiben „ Zeit ( timer _0 )„
      }
      else //sonst
      {
        lcd.clear(); // Lösche LCD
        lcd.setCursor(0,0); // Cursor setzen Spalte 0 Zeile 0
        lcd.print(F("Voegel")); // schreiben „ Voegel „
        lcd.setCursor(13,0); // Cursor setzen Spalte 13 Zeile 0
        lcd.print(F("ON")); // schreiben „ ON „
        lcd.setCursor(0,1); // Cursor setzen Spalte 0 Zeile 1
        lcd.print(F("0 s Restzeit")); // schreiben „0 s Restzeit „
        lcd.setCursor(0,1); // Cursor setzen Spalte 0 Zeile 1
        lcd.print(g_func_timer_0_info); // schreiben „ Zeit ( timer _0 )„
      }
    }
  }

  int SENSOR2_state = digitalRead(SENSOR2);     // Eingangswert einlesen Sensor2 Eingang 3
  if (SENSOR2_state == HIGH && EOS_state==HIGH) // Eingang HIGH?
  {
    VS14_state = HIGH; // Variable (VS14_state) auf HIGH setzen
    g_func_timer_1_info = 10; // Variable (g_func_timer_1) auf 10 setzen
  }

  if (VS14_state == HIGH) // ist Variable (VS14_state) HIGH ???
  {
    if(LCDML.Timer(g_timer_1, 1)) // injiziere (g_timer_1) mit 1ms
    {
      g_func_timer_1_info--; // inkrementiere den Wert des timer_1 hier Millisekunde
      lcd.setCursor(14,1); // Cursor setzen Spalte 14 Zeile 1
      lcd.print(g_func_timer_1_info); // schreiben „ Zeit ( timer _1 )„
    }
  }

  if(g_func_timer_1_info <= 7 && VS14_state==HIGH)// ist Variable (g_func_timer_1_info) kleiner gleich 7 und Variable (VS14_state) HIGH ???
  {
    BLITZ_state = HIGH;         // Variable (BLITZ_state) auf HIGH setzen
  }

  if(g_func_timer_1_info <= 0)                 // ist Variable (g_func_timer_1_info) kleiner gleich 0
  {
    EOS_state=LOW;         // Variable (EOS_state) auf LOW setzen
    VS14_state=LOW;         // Variable (VS14_state) auf LOW setzen
    BLITZ_state=LOW;         // Variable (BLITZ_state) auf LOW setzen
    lcd.setCursor(0,1);         // Cursor setzen Spalte 0 Zeile 1
    lcd.print(F("00")); // schreiben „ 00 „
  }

  if(g_func_timer_0_info <= 0 && EOS_state==HIGH) // ist Variable (g_func_timer_0_info) kleiner gleich 0 und Variable (EOS_state) HIGH ???
  {
    EOS_state=LOW;         // Variable (EOS_state) auf LOW setzen
    VS14_state=LOW;         // Variable (VS14_state) auf LOW setzen
    BLITZ_state=LOW;         // Variable (BLITZ_state) auf LOW setzen
  }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  // wird Enter Taster betätigt
  // zähle (g_button_value)

  if(LCDML.checkButtons())
  {
    if(LCDMenuLib_checkButtonEnter())
    {
      LCDMenuLib_resetButtonEnter();
      g_button_value_0++;
    }
  }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  // ist (g_button_value_0) größer gleich1
  // Aufruf der Funktion for callback um im Display zurück zu springen

  if(g_button_value_0 >= 1)
  {
    if(LCDML.FuncEnd(1, 0, 0, 0, 0, 0)) // (direct, up, down, left, right)
    {
      EOS_state=LOW;         // Variable (EOS_state) auf LOW setzen
      VS14_state=LOW;         // Variable (VS14_state) auf LOW setzen
      BLITZ_state=LOW;         // Variable (BLITZ_state) auf LOW setzen
    }
  }
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Apr 22, 2014, 07:29 pm
Das klingt gut, so schnell kann ich mich auch nicht in große Code abschnitt hereindenken ohne etwas testen zu können und zudem hab ich im Moment wenig Zeit ;-)

@blubbel  
Prinzipell sieht das richtig aus. Kommen die Seriellen ausgaben den mehrmals oder nur einmalig ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Letty on May 14, 2014, 12:26 pm
Hallo,

erst mal ein großes Lob an Jomelo wirklich eine ganz Klasse Arbeit und sehr vielseitig zu verwenden.
Ich hätte noch 2 kleine Fragen

Eine Frage zu der Funktion mit check Buttons. Ich habe das Problem das wenn ich die Funktion auf gerufen habe und sie mit dem Quit Button benden will hüpft er immer direckt ins Hauptmenü und nicht ins Untermenü wo die Funktion drin ist. Bei anderen Funktionen klappt das wunderbar mit dem zurück gehen.

Hier wäre mal der Code mit der Funktion.
Code: [Select]
void FUNC_mA_Ausgeben_1_schritte(void)




  {
    if(LCDML.checkButtons())
    {


      if (LCDMenuLib_checkButtonUp())
      {     
        if(mAWert < 20) {
           mAWert += 1;
          LCDMenuLib_resetButtonUp();
        }
      }
      else {
      }
      if (LCDMenuLib_checkButtonDown()) {     
        if(mAWert > 4) {
           mAWert -= 1;
          LCDMenuLib_resetButtonDown();
        }
      }
      else {
      }


      //mA an Pin 3 in PWM Ausgeben
       mAinPWM(mAWert);


      //Ausgabe auf LCD
      lcd.setCursor(0,0);
      lcd.print("                   ");
      lcd.setCursor(0,1);
      lcd.print("                   ");
      lcd.setCursor(0,2);
      lcd.print("                   ");
      lcd.setCursor(0,3);
      lcd.print("                   ");
      lcd.setCursor(3,2);
      lcd.print(mAWert);
      lcd.setCursor(13,2);
      lcd.print("mA");
      lcd.setCursor(1,0);
      lcd.print("4 - 20mA Ausgabe");


    } 
  }
}



Und die 2. ob es möglich ist eine Art Bootscreen anzeigen zulassen? Also Quasi eine Funktion beim Start ausführen und diese nach einer festen Zeit benden und das Menü aufrufen.

Vielen Dank schon mal

MFG
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 15, 2014, 06:36 pm
Hi, beides ist möglich.  Der Innit Screen ist quasi so eine Funktion.  Du kannst aber auch das Menü mit einer Funktionen beginnen lassen. ( LCDMenuLib_jumpToFunc(funcname); ) Das mit dem Zurück Knopf versteh ich nicht ganz, mal funktionierts, mal nicht oder wie ?
Wieso sind bei der Funktion mehr { }  drin als benötigt werden ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Letty on May 15, 2014, 10:41 pm
hi, ok danke. Funktionieren tut der zurück Knopf immer nur Springt er bei dieser Funktion gleich bis ins Hauptmenü zurück. Bei anderen Funktionen also ohne die Check.Button hüpft er nur aus der Funktion zurück ins Untermenü wo die Funktion drin ist.
Die Klammern hab ich übersehen werd ich gleich mal löschen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Letty on May 23, 2014, 12:33 am
An welche Stelle im Programm muss denn die LCDMenuLib_jumpToFunc(funcname);  gesetzt werden?

Ich habe es im setup probiert und im loop aber bei beiden malen Startet das Display nicht mehr bzw lässt sich nicht mehr bedienen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 23, 2014, 12:25 pm
Ich bin bis Sonntag im Urlaub und schick dir dann ein Beispiel. Es kann auch Montag werde, je nachdem wie gut das Wetter am Sonntag ist ;-)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Marc2014 on May 23, 2014, 09:31 pm
Hallo Leute,

ich nutze das keypadshield mit 16,2 LCD Display auf einem Uno R3.

Leider zeigt das LCD nur das Menü mit : -> Information
                                                                           Zeit Info         und hier einen Balken.

aber es reagiert nicht auf die Buttons egal welche…

Mit dem Original KeypadShield Sketch geht alles.

Was mache ich falsch?

Gruß Marc
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 25, 2014, 09:05 am
Vermutlich ja, aber ohne Quellcode können wir alle nur raten
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 25, 2014, 09:14 am

An welche Stelle im Programm muss denn die LCDMenuLib_jumpToFunc(funcname);  gesetzt werden?

Ich habe es im setup probiert und im loop aber bei beiden malen Startet das Display nicht mehr bzw lässt sich nicht mehr bedienen.


Probier es mal hiermit:
Code: [Select]

//....
//Deaktivieren des Init Screens, da du ja eien eigene Funktion nutzen willst
//....

//....
void setup()
{   
  LCDMenuLib_setup(_LCDMenuLib_cnt);  /* Setup for LcdMenuLib */
  Serial.begin(9600);                 /* start serial */
  LCDMenuLib_jumpToFunc(FUNC_p2); 
}
//.....


In die Endfunktion von FUNC_p2 könntest du dann z.B.   

LCDML.goRoot();

einbauen. Mit diesem Befehl kommst du zurück zum Hauptmenü egal von wo.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Letty on May 31, 2014, 10:55 pm
Danke Jomelo brachte aber keine Hilfe aber ich hab einen Weg gefunden wie es funktioniert die Funktion die ich bei dem LCDMenuLib_jumpToFunc(xy); aufrufe muss im Menü vorhanden sein. Ist das so gewollt ?

Jetz hätte ich nur noch das Problem mit der Check.Button Funktion dass ich nach dem Verlassen gleich im Hauptmenü bin und nicht in dem Untermenü wo die Funktion drin ist.
Also das wäre die Check.Button  noch mal
Code: [Select]

void FUNC_mA_Ausgeben_1_schritte(void)
 {
   if(LCDML.checkButtons())
   {

     if (LCDMenuLib_checkButtonUp())
     {    
       if(mAWert < 20) {
          mAWert += 1;
         LCDMenuLib_resetButtonUp();
       }
     }
     else {
     }
     if (LCDMenuLib_checkButtonDown()) {    
       if(mAWert > 4) {
          mAWert -= 1;
         LCDMenuLib_resetButtonDown();
       }
     }
     else {
     }

     //mA an Pin 3 in PWM Ausgeben
      mAinPWM(mAWert);


     //Ausgabe auf LCD
     lcd.clear;
     lcd.setCursor(3,2);
     lcd.print(mAWert);
     lcd.setCursor(13,2);
     lcd.print("mA");
     lcd.setCursor(1,0);
     lcd.print("4 - 20mA Ausgabe");  


@Mark2014: Läuft die Abfrage der Tasten auch über den Analog Eingang? Wenn ja hast du hierfür die Werte der Einzelnen Tasten im Config Tab geändert? Du findest sie am einfachsten herraus wenn du den am Analog Eingang gemessenen Wert Serial oder am LCD ausgibst.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 10, 2014, 10:29 am
Hallo zusammen,
Danke erstmal für das schöne Menü. Hab es ausprobiert und es funktioniert soweit auch ganz gut. Allerdings möchte ich anstelle der 6 Tasten einen optischen Encoder verwenden, mit dem ich durch drehen nach links und rechts durch das Menü scrollen kann und durch die Push Funktion des Encoders den jeweiligen Menüpunkt auswählen kann. Leider bin ich ein Neuling im Bereich der Arduino Programmierung, deshalb wäre es schön wenn mir jemand helfen könnte.
Vielen Dank im Voraus.

Giovanni
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 10, 2014, 11:24 am
@Letty
Das nur Menufunktionen von dieser Funktion betroffen sind ist absicht. Jede andere Funktion kann man direkt aufrufen.

@Giovanni85
Kannst du den Encoder schon auslesen ?  Falls nein, erstell bitte ein eigenes Thema. Sobald dieses funktioniert kann ich dir hier weiterhelfen um die Steuerung anzupassen. Dies ist dann in ein paar Minuten erledigt.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 10, 2014, 11:50 am
Sorry Jomelo,
bin leider neu im Forum und weiß nicht genau wie ich ein eigenes Thema öffne und auch nicht wie ich einen Code darstellen kann.
Musste es deswegen leider über Quote machen.

MfG
Giovanni
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Jun 10, 2014, 11:53 am
Oben rechts über der grünen Leiste New Topic (neuer Thread). Dazu muss man hier (http://forum.arduino.cc/index.php?board=31.0) sein.
Insert Quote ist genau neben insert Code, einfach mit der Maus länger drauf lassen dann kommt schon die Beschreibung.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 10, 2014, 11:54 am
Ich meine natürlich dieses Programm zum auslesen des Encoders.

Code: [Select]
// Bibliotheken einfügen:
#include <LiquidCrystal.h>
#include <display.h>
#include <Encoder.h>
#include <constrain.h>

LiquidCrystal lcd(12, 11, 7, 8, 9, 10); // initialisiert die Bibliothek mit den Pins am Arduino

int Encoder_PinA = 22;        //initialisiert Encoder PinA = Arduino Pin 22
int Encoder_PinB = 23;        //initialisiert Encoder PinB = Arduino Pin 23
int Encoder_Push = 24;        //initialisiert Encoder Push Button = Arduino Pin 24
int Variable1 = 1;            //initialisiert Variable1
int Encoder_PinALast = LOW;   //initialisiert Encoder PinALast
int i = LOW;                  //initialisiert Variable i
int val = 0;                  //initialisiert Variable für den Pin Status
int ledPin = 13;              //initialisiert LED Pin 13

void setup()
{
   lcd.begin(20, 4);               //initialisiert Display, 20 Spalten und 4 Zeilen
   delay(500);                     //waits for a half second
   
    {
    lcd.command(0x01);             //clear display
    delay(50);                     //wartet 0,05 sekunden
    lcd.command(0x24);             //function set RE=1
    delay(50);                     //wartet 0,05 sekunden
    lcd.command(0x0C);             //control, display on, cursor off, blinken off
    delay(50);                     //wartet 0,05 sekunden
    lcd.command(0x20);             //function set RE=0
    delay(50);                     //wartet 0,05 sekunden
    lcd.command(0x06);             //entry mode segment bidirectional
    delay(50);                     //wartet 0,05 sekunden
    lcd.command(0x24);             //function set RE=1
    delay(50);                     //wartet 0,05 sekunden
    lcd.command(0x09);             //extended function set, 4 lines, 5-dot fontwith
    delay(50);                     //wartet 0,05 sekunden
    lcd.command(0x20);             //function set RE=0
    delay(50);                     //wartet 0,05 sekunden
    }

   Serial.begin (9600);            //serielle Verbindung mit 9600 bit pro sekunde
   
   pinMode (Encoder_PinA, INPUT);  //setzt Pin 22 als INPUT
   pinMode (Encoder_PinB, INPUT);  //setzt Pin 23 als  INPUT
   pinMode (Encoder_Push, INPUT);  //setzt Pin 24 als INPUT
   pinMode (ledPin, OUTPUT);       //setzt LED Pin 13 als OUTPUT
}

void loop()

{
    lcd.setCursor(1, 0);                         // setzt den Cursor auf Spalte 0 in Zeile 0
    lcd.print("Encoder Test Prog.");             // Schreibt "Waehle einen Kanal" auf das Display
   
    i = digitalRead(Encoder_PinA);               //Variable i = Encoder PinA
    if ((Encoder_PinALast == LOW) && (i == HIGH))//wenn Encoder PinALast low ist und Variable i high ist
     
    {
       if (digitalRead(Encoder_PinB) == LOW)     //wenn Encoder PinB low ist
       
      {
       lcd.clear();                              //Display reinigen
       Variable1++;                              //Variable1 wird um 1 hoch gezählt
       lcd.setCursor(17, 2);                     //setzt den Cursor auf Spalte 17 in Zeile 2
       Variable1 = constrain(Variable1, 1, 10);  //begrenzt den Bereich der Variablen1 auf Werte zwischen 1 und 10
       lcd.print(Variable1);                     //gibt die Variable1 auf dem Display aus
       }
       else                                      //wenn Encoder PinB high ist
       {
       lcd.clear();                              //Display reinigen
       Variable1--;                              //Variable1 wird um 1 runter gezählt
       lcd.setCursor(17, 2);                     //setzt den Cursor auf Spalte 17 in Zeile 2
       Variable1 = constrain(Variable1, 1, 10);  //begrenzt den Bereich der Variablen1 auf Werte zwischen 1 und 10
       lcd.print(Variable1);                     //gibt die Variable1 auf dem Display aus
      }
    }

  Encoder_PinALast = i;
 
  val = digitalRead(Encoder_Push);     //Variable für Pin Status
  if(val == LOW)                       //wenn Pin Status low
 
  {
    digitalWrite(ledPin, LOW);         //schaltet LED 13 aus
    lcd.setCursor(16, 3);              //setzt den Cursor auf Spalte 16 in Zeile 3
    lcd.print("Aus");                  //gibt den Text "Aus" auf dem Display aus
  }
 
  else                                 //wenn Pin Status high ist
 
  {
    digitalWrite(ledPin, HIGH);        //schaltet LED 13 ein
    lcd.setCursor(16, 3);              //setzt den Cursor auf Spalte 8 in Zeile 3
    lcd.print("Ein");                  //gibt den Text "Ein" auf dem Display aus
  }
       lcd.setCursor(5, 1);            // setzt den Cursor auf Spalte 0 in Zeile 2
       lcd.print("05.06.2014");        //gibt den Text "05.06.2014" auf dem Display aus
       
       lcd.setCursor(0, 2);            // setzt den Cursor auf Spalte 0 in Zeile 2
       lcd.print("Durchschalten:");    //gibt den Text "Durchschalten:" auf dem Display aus
       
       lcd.setCursor(0, 3);            // setzt den Cursor auf Spalte 0 in Zeile 2
       lcd.print("Druckknopf:");       //gibt den Text "Druckknopf:" auf dem Display aus
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 10, 2014, 11:54 am
Code geht mit  [ code ] [ /code ] ohne Leerzeichen.

Den Quellcode den du oben gepostet hast, der stammt aber nicht aus deinem Code, das ist ein Teil aus der Lib. Zeig mal bitte deinen eigenen Code

Edit:
Ihr wart schneller ;-)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 10, 2014, 12:03 pm
Also hier noch der Code. Damit wird auf dem Display in der 1. Zeile: Encoder Test Prog.
                                                                                                        2. Zeile: Datum
                                                                                                        3. Zeile: Das durchschalten des Encoders (von 1 bis 10)
                                                                                                        4. Zeile: Das betätigen der Push Funktion (Ein/Aus)
...angezeigt.

Code: [Select]
   pinMode (Encoder_PinA, INPUT);  //setzt Pin 22 als INPUT
   pinMode (Encoder_PinB, INPUT);  //setzt Pin 23 als  INPUT
   pinMode (Encoder_Push, INPUT);  //setzt Pin 24 als INPUT
   pinMode (ledPin, OUTPUT);       //setzt LED Pin 13 als OUTPUT
}

void loop()

{
    lcd.setCursor(1, 0);                         // setzt den Cursor auf Spalte 0 in Zeile 0
    lcd.print("Encoder Test Prog.");             // Schreibt "Waehle einen Kanal" auf das Display
   
    i = digitalRead(Encoder_PinA);               //Variable i = Encoder PinA
    if ((Encoder_PinALast == LOW) && (i == HIGH))//wenn Encoder PinALast low ist und Variable i high ist
     
    {
       if (digitalRead(Encoder_PinB) == LOW)     //wenn Encoder PinB low ist
       
      {
       lcd.clear();                              //Display reinigen
       Variable1++;                              //Variable1 wird um 1 hoch gezählt
       lcd.setCursor(17, 2);                     //setzt den Cursor auf Spalte 17 in Zeile 2
       Variable1 = constrain(Variable1, 1, 10);  //begrenzt den Bereich der Variablen1 auf Werte zwischen 1 und 10
       lcd.print(Variable1);                     //gibt die Variable1 auf dem Display aus
       }
       else                                      //wenn Encoder PinB high ist
       {
       lcd.clear();                              //Display reinigen
       Variable1--;                              //Variable1 wird um 1 runter gezählt
       lcd.setCursor(17, 2);                     //setzt den Cursor auf Spalte 17 in Zeile 2
       Variable1 = constrain(Variable1, 1, 10);  //begrenzt den Bereich der Variablen1 auf Werte zwischen 1 und 10
       lcd.print(Variable1);                     //gibt die Variable1 auf dem Display aus
      }
    }

  Encoder_PinALast = i;
 
  val = digitalRead(Encoder_Push);     //Variable für Pin Status
  if(val == LOW)                       //wenn Pin Status low
 
  {
    digitalWrite(ledPin, LOW);         //schaltet LED 13 aus
    lcd.setCursor(16, 3);              //setzt den Cursor auf Spalte 16 in Zeile 3
    lcd.print("Aus");                  //gibt den Text "Aus" auf dem Display aus
  }
 
  else                                 //wenn Pin Status high ist
 
  {
    digitalWrite(ledPin, HIGH);        //schaltet LED 13 ein
    lcd.setCursor(16, 3);              //setzt den Cursor auf Spalte 8 in Zeile 3
    lcd.print("Ein");                  //gibt den Text "Ein" auf dem Display aus
  }
       lcd.setCursor(5, 1);            // setzt den Cursor auf Spalte 0 in Zeile 2
       lcd.print("05.06.2014");        //gibt den Text "05.06.2014" auf dem Display aus
       
       lcd.setCursor(0, 2);            // setzt den Cursor auf Spalte 0 in Zeile 2
       lcd.print("Durchschalten:");    //gibt den Text "Durchschalten:" auf dem Display aus
       
       lcd.setCursor(0, 3);            // setzt den Cursor auf Spalte 0 in Zeile 2
       lcd.print("Druckknopf:");       //gibt den Text "Druckknopf:" auf dem Display aus
}


Oder brauchst du nch etwas anderes?

MfG
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 10, 2014, 12:50 pm
Probier es mal so oder so ähnlich, ich kann es nun nicht testen da ich keinen Encoder besitze.

In Controll:
Code: [Select]

boolean lastEncoderValue = False;

void LCDMenuLib_control_encoder()
{
boolean statusEncoder;
uint8_t button = 0;

statusEncoder = digitalRead(Encoder_PinA);               //Variable i = Encoder PinA
if ((lastEncoderValue == LOW) && (statusEncoder == HIGH)) {
if (digitalRead(Encoder_PinB) == LOW) {     //wenn Encoder PinB low ist
button = 1; // links ?
} else {
button = 2; // rechts ?
}
}

lastEncoderValue = statusEncoder;
     

if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time) && button > 0)
{
   if(digitalRead(Encoder_Push)) { LCDML.Button_enter(); }
   //else if(digitalRead(_BUTTON_digital_up)) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); }
   //else if(digitalRead(_BUTTON_digital_down)) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); }
   //else if(digitalRead(_BUTTON_digital_quit) && _BUTTON_digital_enable_quit == 1) {LCDML.Button_quit(); }
   else if(button == 1) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);}
   else if(button == 2) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);}       

}


Im Setup, deine Pin definitionen mit  pinMode(.......)

Im Loop
Code: [Select]

//..
//LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_serial();        /* lcd menu control */ 
  LCDMenuLib_control_encoder();        /* lcd menu control */ 
  LCDMenuLib_loop();                  /* lcd function call */
//..


Die zurück Buttons auf jeder Ebene musst du dir selbst bauen, dazu gibt es auf irgendeiner der vorherigen Seite eine Anleitung, ich weiß nun aber nicht genau wo. Wenn ich sie finde füg ich sie hier noch ein.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 10, 2014, 01:26 pm
Mhhh, danke erstmal. Tut sich aber leider immer noch nicht mehr. Das Display zeigt die ersten Menü Elemente an...
Zeile1: Information
Zeile2: Zeit Info
Zeile3: Einstellungen
Zeile4: Programme

...nur leider macht der Encoder noch nichts. Müsste dann ja eigentlich an der LCDML_control liegen.
Also so sieht der Code momentan bei mir aus:
Code: [Select]
/* =============================================== */
/* Example: LCD Menu with LiquidCrystal          */
/* =============================================== */

/* include libs */
#include <LiquidCrystal.h>
#include <LCDMenuLib.h>


/* settings for lcd */
#define _LCDMenuLib_LCD_cols             20
#define _LCDMenuLib_LCD_rows             4

/* pin settings */  
#define _LCDMenuLib_LCD_rs               12
#define _LCDMenuLib_LCD_e                11
#define _LCDMenuLib_LCD_dat0             7
#define _LCDMenuLib_LCD_dat1             8
#define _LCDMenuLib_LCD_dat2             9
#define _LCDMenuLib_LCD_dat3             10

//#define _LCDMenuLib_LCD_backlight         7
//#define _LCDMenuLib_LCD_backlight_pol     POSITIVE // NEGATIVE

//#define _LCDMenuLib_LCD_rw 0
/* 8 bit mode */
//#define _LCDMenuLib_LCD_dat4          0
//#define _LCDMenuLib_LCD_dat5          0
//#define _LCDMenuLib_LCD_dat6          0
//#define _LCDMenuLib_LCD_dat7          0


/* lib config */
#define _LCDMenuLib_cfg_initscreen       1      /* 0=disable, 1=enable */
#define _LCDMenuLib_cfg_initscreen_time  60000  /* 0=time disabled, >0 wait time in ms */
#define _LCDMenuLib_cfg_scrollbar 1      /* 0=no scrollbar, 1=complex scrollbar, 2=easy scrollbar */
#define _LCDMenuLib_cfg_lcd_standard 0      /* 0=HD44780 standard / 1=HD44780U standard */
#define _LCDMenuLib_cfg_press_time       200    /* button press time in ms */

/* menu element count - last element id */
#define _LCDMenuLib_cnt    17  

int Encoder_PinA = 22;        //initialisiert Encoder PinA = Arduino Pin 22
int Encoder_PinB = 23;        //initialisiert Encoder PinB = Arduino Pin 23
int Encoder_Push = 24;        //initialisiert Encoder Push Button = Arduino Pin 24
int Variable1 = 1;            //initialisiert Variable1
int Encoder_PinALast = LOW;   //initialisiert Encoder PinALast
int i = LOW;                  //initialisiert Variable i
int val = 0;                  //initialisiert Variable für den Pin Status

/* init lcdmenulib */
LCDMenuLib_init(_LCDMenuLib_cnt);

/* create lcdmenulib */
/* Item           => layer 0 */
/* Item_XX        => layer 1 */
/* Item_XX_XX     => layer 2 */
/* Item_XX_XX_XX  => layer 3 */
/* LCDMenuLib_element(id, prev_layer_element, current_layer_element, lang_string, callback_function) */
LCDMenuLib_element(0  , Item         , Item_1        , "Information"        , FUNC_information);
LCDMenuLib_element(1  , Item         , Item_2        , "Zeit Info"          , FUNC_timer_info);
LCDMenuLib_element(2  , Item         , Item_3        , "Einstellungen"      , FUNC);
LCDMenuLib_element(3  , Item_3       , Item_3_1      , "Werte veraendern"   , FUNC);
LCDMenuLib_element(4  , Item_3       , Item_3_2      , "Irgendwas"          , FUNC);
LCDMenuLib_element(5  , Item         , Item_4        , "Programme"          , FUNC);
LCDMenuLib_element(6  , Item_4       , Item_4_1      , "Programme 1"        , FUNC);
LCDMenuLib_element(7  , Item_4_1     , Item_4_1_1    , "P1 Starten"         , FUNC);
LCDMenuLib_element(8  , Item_4_1     , Item_4_1_2    , "Einstellungen"      , FUNC);
LCDMenuLib_element(9  , Item_4_1_2   , Item_4_1_2_1  , "extra warm"         , FUNC);
LCDMenuLib_element(10 , Item_4_1_2   , Item_4_1_2_2  , "extra lang"         , FUNC);
LCDMenuLib_element(11 , Item_4_1_2   , Item_4_1_2_3  , "zurück"             , FUNC_back);
LCDMenuLib_element(12 , Item_4       , Item_4_2      , "Programm 2"         , FUNC_p2);
LCDMenuLib_element(13 , Item_4       , Item_4_3      , "Programm Mix"       , FUNC);
LCDMenuLib_element(14 , Item_4       , Item_4_4      , "Programm Hemden"    , FUNC);
LCDMenuLib_element(15 , Item_4       , Item_4_5      , "Programm Schnell"   , FUNC);
LCDMenuLib_element(16 , Item_4       , Item_4_6      , "Einstellungen"      , FUNC);
LCDMenuLib_element(17 , Item_4_6     , Item_4_6_1    , "Irgendwas"          , FUNC);
LCDMenuLib_createMenu(_LCDMenuLib_cnt);


void setup()
{    
 LCDMenuLib_setup(_LCDMenuLib_cnt);  /* Setup for LcdMenuLib */
 Serial.begin(9600);      /* start serial */  
 
  pinMode (Encoder_PinA, INPUT);  //setzt Pin 22 als INPUT
  pinMode (Encoder_PinB, INPUT);  //setzt Pin 23 als  INPUT
  pinMode (Encoder_Push, INPUT);  //setzt Pin 24 als INPUT
  //pinMode (ledPin, OUTPUT);       //setzt LED Pin 13 als OUTPUT
   
}

void loop()
{  
 
 //..
 //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
 //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
 //LCDMenuLib_control_serial();        /* lcd menu control */  
 LCDMenuLib_control_encoder();        /* lcd menu control */  
 LCDMenuLib_loop();                  /* lcd function call */
 //..
 //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
 //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
 //LCDMenuLib_control_serial();        /* lcd menu control */  
 //LCDMenuLib_loop();                  /* lcd function call */

 //other function ... for example simple threads ..  
}

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 10, 2014, 01:27 pm
...und die LCDML_control Funktion:
Code: [Select]
/* =============================================== */
/* Example 1: LCD Menu with LiquidCrystal          */
/* =============================================== */
/* file content:                                   */
/* - LCDMenuLib_control_analog()                   */
/* - LCDMenuLib_control_digital()                  */
/* - LCDMenuLib_control_seriel()                   */
/* =============================================== */

/* analog menu control */
void LCDMenuLib_control_analog()
{
  uint16_t value = analogRead(0);  // analogpin for keypad

  #define _BUTTON_analog_enter_min     850     // Button Enter
  #define _BUTTON_analog_enter_max     920 
  #define _BUTTON_analog_up_min        520     // Button Up
  #define _BUTTON_analog_up_max        590   
  #define _BUTTON_analog_down_min      700     // Button Down
  #define _BUTTON_analog_down_max      770   
  //optional if menu element "back" exists, look at FUNC_back in functions tab
  #define _BUTTON_analog_enable_quit   1
  #define _BUTTON_analog_back_min      950     // Button Back
  #define _BUTTON_analog_back_max      1020   
  //optional if needed
  #define _BUTTON_analog_enable_lr     1
  #define _BUTTON_analog_left_min      430     // Button Left
  #define _BUTTON_analog_left_max      500   
  #define _BUTTON_analog_right_min     610     // Button Right
  #define _BUTTON_analog_right_max     680   
     
  if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) {
    if(value >= _BUTTON_analog_enter_min && value <= _BUTTON_analog_enter_max) {        // control enter
      LCDML.Button_enter();
    } 
    else if(value >= _BUTTON_analog_up_min && value <= _BUTTON_analog_up_max) {      // control up
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);
    }
    else if(value >= _BUTTON_analog_down_min && value <= _BUTTON_analog_down_max) {   // control down
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);
    }   
    else if(value >= _BUTTON_analog_left_min && value <= _BUTTON_analog_left_max && _BUTTON_analog_enable_lr == 1) {   // control left
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);
    }
    else if(value >= _BUTTON_analog_right_min && value <= _BUTTON_analog_right_max && _BUTTON_analog_enable_lr == 1) { // control right
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);
    }
       
    if(value >= _BUTTON_analog_back_min && value <= _BUTTON_analog_back_max && _BUTTON_analog_enable_quit == 1) {          // control quit
      LCDML.Button_quit();
    }
  }
}

void LCDMenuLib_control_digital()
{
  #define _BUTTON_digital_enter         24   
  #define _BUTTON_digital_up            22
  #define _BUTTON_digital_down          23
  //optional
  #define _BUTTON_digital_enable_quit   24
  #define _BUTTON_digital_quit          24
  //optional
  #define _BUTTON_digital_enable_lr     1
  #define _BUTTON_digital_left          22
  #define _BUTTON_digital_right         23
 
  if(digitalRead(_BUTTON_digital_enter) || digitalRead(_BUTTON_digital_up) || digitalRead(_BUTTON_digital_down)
    || (digitalRead(_BUTTON_digital_quit) && _BUTTON_digital_enable_quit == 1)
    || ((digitalRead(_BUTTON_digital_left) || digitalRead(_BUTTON_digital_right)) && _BUTTON_digital_enable_lr == 1))
  {
     if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time))
     {
       if(digitalRead(_BUTTON_digital_enter)) { LCDML.Button_enter(); }
       else if(digitalRead(_BUTTON_digital_up)) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); }
       else if(digitalRead(_BUTTON_digital_down)) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); }
       else if(digitalRead(_BUTTON_digital_quit) && _BUTTON_digital_enable_quit == 1) {LCDML.Button_quit(); }
       else if(digitalRead(_BUTTON_digital_left) && _BUTTON_digital_enable_lr == 1) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);}
       else if(digitalRead(_BUTTON_digital_right) && _BUTTON_digital_enable_lr == 1) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);}       
     }
  } 
}


/* serial menu control */
//boolean Encoder_PinALast = FALSE;

void LCDMenuLib_control_encoder()
{
boolean statusEncoder;
uint8_t button = 0;

statusEncoder = digitalRead(Encoder_PinA);               //Variable i = Encoder PinA
if ((Encoder_PinALast == LOW) && (statusEncoder == HIGH)) {
if (digitalRead(Encoder_PinB) == LOW) {     //wenn Encoder PinB low ist
button = 1; // links ?
} else {
button = 2; // rechts ?
}
}

Encoder_PinALast = statusEncoder;
     

if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time) && button > 0)
{
   if(digitalRead(Encoder_Push)) { LCDML.Button_enter(); }
   //else if(digitalRead(_BUTTON_digital_up)) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); }
   //else if(digitalRead(_BUTTON_digital_down)) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); }
   //else if(digitalRead(_BUTTON_digital_quit) && _BUTTON_digital_enable_quit == 1) {LCDML.Button_quit(); }
   else if(button == 1) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);}
   else if(button == 2) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);}       

}




Wäre schön wenn du mal drüber schauen könntest.
Weiß momentan leider echt nicht weiter.

MfG
Giovanni
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 10, 2014, 06:33 pm
Das hast du schon richtig erkannt. Probier einfach mal aus wenn du in der control folgende Zeilen anpasst:
Code: [Select]

if(LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time) && button > 0)
{
   if(digitalRead(Encoder_Push)) { LCDML.Button_enter(); }
   else if(button == 1) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); }
   else if(button == 2) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); }
   //else if(digitalRead(_BUTTON_digital_quit) && _BUTTON_digital_enable_quit == 1) {LCDML.Button_quit(); }
   //else if(button == 1) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);}
   //else if(button == 2) { LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);}       



Wenn es dann nicht klappt, teste mal diesen Code, aber nur wenn der andere nicht funktioniert. Da ich das nicht testen kann und nur halbwegs gut raten kann wie das Verhalten ist könnte dies hier funktionieren:

Code: [Select]

void LCDMenuLib_control_encoder()
{
 i = digitalRead(Encoder_PinA);              
 if ((Encoder_PinALast == LOW) && (i == HIGH)) {
   if (digitalRead(Encoder_PinB) == LOW ) {    
     LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);      
   } else {
     LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);
   }
 }
 Encoder_PinALast = i;  
 if(digitalRead(Encoder_Push) == HIGH && LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) {                      
   LCDML.Button_enter();
 }  
}


Dieser code ist aber nicht schön, da man "i" niemals als globale Variable deklarieren sollte. Denk dir dafür besser einen anderen Namen aus ansonsten bekommst du noch Probleme im weiteren Umgang mit dem Arduino.

Dann noch etwas, da du keine "zurück" Button besitzt musst du diese Funktion selbst hinzuschreiben. Schau dir dabei das Beispiel an, bei einer Untereben habe ich das gemacht mit  FUNC_Back.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 11, 2014, 09:56 am
Hallo Jomelo,

vielen Dank erstmal für die tolle Unterstützung.
Mit dem zweiten Code hat es dann auch funktioniert und ich kann mit dem Encoder durch das Menü scrollen und über die Push Funktion bestätigen. Die Funktion Back werde ich versuchen jetzt noch einzubauen. Außerdem muss ich auch noch den Zeichensatz aktualisieren, um Umlaute und Pfeile darzustellen.

Bis hierhin erstmal ein dickes Dankeschön.

MfG
Giovanni
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 11, 2014, 12:13 pm
Entschuldige nochmals...

bin gerade dabei die FUNC_back mit ein zu basteln. Wollte das so realisieren, dass ich in jedem Untermenü eine Funktion "zurück" habe, mit der ich zum vorherigen Bildschirm gelangen kann. Allerdings funktioniert das nicht so...
Außerdem muss das ganze ja auch über die Push Funktion des Encoders realisiert warden.
Wäre dankbar für jede Hilfe...

Hier nochmal die FUNC_back Funktion:

Code: [Select]
void FUNC_back(void)
{   
       
  LCDML.FuncInit();            /* setup function */
  LCDML.Button_quit();         /* quit button */   
  LCDML.FuncEnd(1,0,0,0,0,0);  /* direct func end */
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 11, 2014, 12:46 pm
Wie die Funktion aussieht weiß ich, an der Funktion musst du nichts verändern.

Hier mal ein Beispiel:
Code: [Select]

/* menu element count - last element id */
#define _LCDMenuLib_cnt    21  

/* init lcdmenulib */
LCDMenuLib_init(_LCDMenuLib_cnt);

/* create lcdmenulib */
/* Item           => layer 0 */
/* Item_XX        => layer 1 */
/* Item_XX_XX     => layer 2 */
/* Item_XX_XX_XX  => layer 3 */
/* LCDMenuLib_element(id, prev_layer_element, current_layer_element, lang_string, callback_function) */
LCDMenuLib_element(0  , Item         , Item_1        , "Information"        , FUNC_information);
LCDMenuLib_element(1  , Item         , Item_2        , "Zeit Info"          , FUNC_timer_info);
LCDMenuLib_element(2  , Item         , Item_3        , "Einstellungen"      , FUNC);
LCDMenuLib_element(3  , Item_3       , Item_3_1      , "Werte veraendern"   , FUNC);
LCDMenuLib_element(4  , Item_3       , Item_3_2      , "Irgendwas"          , FUNC);
LCDMenuLib_element(5 , Item_3       , Item_3_3      , "zurueck"            , FUNC_back);
LCDMenuLib_element(6  , Item         , Item_4        , "Programme"          , FUNC);
LCDMenuLib_element(7  , Item_4       , Item_4_1      , "Programme 1"        , FUNC);
LCDMenuLib_element(8  , Item_4_1     , Item_4_1_1    , "P1 Starten"         , FUNC);
LCDMenuLib_element(9  , Item_4_1     , Item_4_1_2    , "Einstellungen"      , FUNC);
LCDMenuLib_element(10  , Item_4_1_2   , Item_4_1_2_1  , "extra warm"         , FUNC);
LCDMenuLib_element(11 , Item_4_1_2   , Item_4_1_2_2  , "extra lang"         , FUNC);
LCDMenuLib_element(12 , Item_4_1_2   , Item_4_1_2_3  , "zurueck"            , FUNC_back);
LCDMenuLib_element(13 , Item_4_1     , Item_4_1_3    , "zurueck"            , FUNC_back);
LCDMenuLib_element(14 , Item_4       , Item_4_2      , "Programm 2"         , FUNC_p2);
LCDMenuLib_element(15 , Item_4       , Item_4_3      , "Programm Mix"       , FUNC);
LCDMenuLib_element(16 , Item_4       , Item_4_4      , "Programm Hemden"    , FUNC);
LCDMenuLib_element(17 , Item_4       , Item_4_5      , "Programm Schnell"   , FUNC);
LCDMenuLib_element(18 , Item_4       , Item_4_6      , "Einstellungen"      , FUNC);
LCDMenuLib_element(19 , Item_4_6     , Item_4_6_1    , "Irgendwas"          , FUNC);
LCDMenuLib_element(20 , Item_4_6     , Item_4_6_2    , "zurueck"            , FUNC_back);
LCDMenuLib_element(21 , Item_4       , Item_4_7      , "zurueck"            , FUNC_back);
LCDMenuLib_createMenu(_LCDMenuLib_cnt);


Fügst du den Code im Beispiel ein, gibt es mehrere zurück Buttons

Ganz wichtig:
Die Variable  #define _LCDMenuLib_cnt    21   muss angepasst werden, steht hier nur 17 drin werden die letzten Buttons nicht angezeigt.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 11, 2014, 01:04 pm
Das hab ich schon so umgebaut wie ich es brauche. Nur wenn ich die FUNC_back aufrufe springt es nicht auf den vorherigen Bildschirm sondern verbleibt auf dem gezeigten Bildschirm.

Hier mal mein veränderter Code:
Code: [Select]
/* menu element count - last element id */
#define _LCDMenuLib_cnt    9 

int Encoder_PinA = 22;        //initialisiert Encoder PinA = Arduino Pin 22
int Encoder_PinB = 23;        //initialisiert Encoder PinB = Arduino Pin 23
int Encoder_Push = 24;        //initialisiert Encoder Push Button = Arduino Pin 24
int Variable1 = 1;            //initialisiert Variable1
int Encoder_PinALast = LOW;   //initialisiert Encoder PinALast
int i = LOW;                  //initialisiert Variable i
int val = 0;                  //initialisiert Variable für den Pin Status

/* init lcdmenulib */
LCDMenuLib_init(_LCDMenuLib_cnt);

/* create lcdmenulib */
/* Item           => layer 0 */
/* Item_XX        => layer 1 */
/* Item_XX_XX     => layer 2 */
/* Item_XX_XX_XX  => layer 3 */
/* LCDMenuLib_element(id, prev_layer_element, current_layer_element, lang_string, callback_function) */
LCDMenuLib_element(0  , Item         , Item_1        , "Information"        , FUNC_information);
LCDMenuLib_element(1  , Item         , Item_2        , "Einstellen Kanal"   , FUNC);
LCDMenuLib_element(2  , Item_2       , Item_2_1      , "Kanal auswählen:"   , FUNC);
LCDMenuLib_element(3  , Item_2       , Item_2_2      , "zurück"             , FUNC_back);
LCDMenuLib_element(4  , Item         , Item_3        , "Einstellen d. PWM"  , FUNC);
LCDMenuLib_element(5  , Item_3       , Item_3_1      , "PWM Einstellen:"    , FUNC);
LCDMenuLib_element(6  , Item_3       , Item_3_2      , "zurück"             , FUNC_back);
LCDMenuLib_element(7  , Item         , Item_4        , "Einstellen Strom"   , FUNC);
LCDMenuLib_element(8  , Item_4       , Item_4_1      , "Strom:"             , FUNC);
LCDMenuLib_element(9  , Item_4       , Item_4_2      , "zurück"             , FUNC_back);

LCDMenuLib_createMenu(_LCDMenuLib_cnt);
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 11, 2014, 01:06 pm
Ich teste das heute abend mal, meine Pause ist nun um ;-)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 11, 2014, 01:07 pm
Vielen Dank schon mal und noch einen schönen Arbeitstag.

MfG
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 11, 2014, 03:15 pm
Hallo Jomelo,

hab das Problem nun gelöst, musste nur die
Quote
_LCDMenuLib_cfg_press_time

etwas höher stellen. Jetzt läuft das Menü einwandfrei.
Würde jetzt nur noch gerne das Zeichen in der Menü Leiste von einem Pfeil auf ein anderes Zeichen ändern.
Wie ist das Möglich?

Danke für die Hilfe...

MfG
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 11, 2014, 03:46 pm
Hi, den Pfeil zu ändern ist so direkt nicht vorgesehen.

Wenn du es aber umbedingt willst, kannst du in das Lib Verzeichnis gehen, dann auf LCDMenuLib/ und die LCDMenuLib.cpp öffnen.
Dort steht in Zeile 237:
Code: [Select]

lcd->_LCDML_lcd_write(0x7E);

Wenn du 0x7E veränderst, ändert sich der Cursor. Du musst nun nur herausfinden welchen Hexcode dein neues Zeichen hat.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 12, 2014, 07:43 am
Hi Jomelo.

Danke für die Hilfe, hat funktioniert mit dem Pfeil ändern.

MfG
Giovanni
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: wober on Jun 12, 2014, 09:51 pm
Hi, bin absolut begeistert von diesem Projekt. Absolut klasse.
Hab aber leider ein Problem.
Gibt's irgendeine Möglichkeit während dem eine while-Schleife im Rahmen einer Button-Abfrage durch einen anderen Button (z.B. Enter) abbrechen zu lassen?
Code: [Select]

if(LCDMenuLib_checkButtonRight())
    {
      LCDMenuLib_resetButtonRight();
      if (modusserial==false) {
        modusSerial();
      }
     ....
   if(message)
        {
          while(message.available())
          {
     ........irgendwo hier bräuchte ich einen "Notausgang"............
            }
      char filename[0];
      lcd.clear();
      lcd.print(("Fertig"));
      delay(2000);
      jump=true;
      LCDMenuLib_jumpToFunc(FUNC_ergebnis); 
    }

Vielleicht hat ja jemand eine Idee.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 12, 2014, 11:08 pm
While-Schleifen kannst du mit break; beenden.  
z.B.
Code: [Select]

while(true)
{
 if(digitalRead(dein_Button)) {
   break;
 }
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: wober on Jun 12, 2014, 11:43 pm
Hallo Jomelo,
hab' leider nur analoge Buttons.
Wenn ich ... versuche bricht die Schleife leider bereits beim ersten Durchlauf ab, auch wenn Links gar nicht gedrückt wurde.
Update (zuerst denken, dann schreiben  :) )
Funktioniert wunderbar wenn ich z.B.
Code: [Select]
if(analogRead(0) >= _BUTTON_analog_left_min && analogRead(0) <= _BUTTON_analog_left_max) {  break;  }
nehme. Vielen Dank für den Tipp.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: rdevet on Jun 16, 2014, 05:02 pm

Hallo Jomelo,

hab das Problem nun gelöst, musste nur die
Quote
_LCDMenuLib_cfg_press_time

etwas höher stellen. Jetzt läuft das Menü einwandfrei.



Hallo,können sie mir helfen mit die Sketch,wen ich meinen Encoder nur bar-lich festhalte geht das Menu ganz wild.
Auf welchen wert haben sie den press time gesetzt,und haben sie ihrem Encoder auf irgend einem weise hardware debounced ?

Mvgr Roberto
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 17, 2014, 08:45 am
Hallo Roberto,

ich habe bei meinem Projekt als "button press time" 1000ms angegeben. Damit funktioniert mein Encoder auch ganz gut.
Hab meinen Encoder nicht entprellt. Ich benutze einen Encoder von Grayhill. Nr:62AY22061

Hier nochmal meine Einstellungen:
Code: [Select]
/* lib config */
#define _LCDMenuLib_cfg_initscreen       1      /* 0=disable, 1=enable */
#define _LCDMenuLib_cfg_initscreen_time  60000  /* 0=time disabled, >0 wait time in ms */
#define _LCDMenuLib_cfg_scrollbar 1      /* 0=no scrollbar, 1=complex scrollbar, 2=easy scrollbar */
#define _LCDMenuLib_cfg_lcd_standard 0      /* 0=HD44780 standard / 1=HD44780U standard */
#define _LCDMenuLib_cfg_press_time       1000    /* button press time in ms */


MfG
Giovanni
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Giovanni85 on Jun 17, 2014, 09:09 am
Hallo zusammen,

ich hättte da auch nochmal eine Frage. Ich versuche momentan drei verschiedene Werte einzustellen. Das möchte ich über drei Untermenüs realisieren. Folgendermaßen: 1 - Kanal (Werte 1 bis 10)
                                                                          2 - PWM (Werte 1 bis 100)
                                                                          3 - Strom (Werte 10 - 60)
Die Untermenüs hab ich hinbekommen, allerdings verändern sich die Werte durch drehen des Encoders nicht. Außerdem möchte ich über die Push Funktion des Encoders die eingestellten Werte zu bestätigen und anschließend zu übertragen. Hier mal mein Code für die Einstellung des PWM. Wäre für jede Hilfe dankbar da ich wiedermal auf dem Schlauch stehe.

Code: [Select]
void FUNC_PWM(void)

{
// void loop();
   
    lcd.setCursor(1, 0);                         // setzt den Cursor auf Spalte 0 in Zeile 0
    lcd.print("PWM Einstellen:");             // Schreibt "Waehle einen Kanal" auf das Display
   
    Push = digitalRead(Encoder_PinA);               //Variable i = Encoder PinA
    if ((Encoder_PinALast == LOW) && (Push == HIGH))//wenn Encoder PinALast low ist und Variable i high ist
     
    {
       if (digitalRead(Encoder_PinB) == LOW)     //wenn Encoder PinB low ist
       
      {
       lcd.clear();                              //Display reinigen
       Variable2++;                              //Variable2 wird um 1 hoch gezählt
       lcd.setCursor(17, 0);                     //setzt den Cursor auf Spalte 17 in Zeile 0
       Variable2 = constrain(Variable2, 1, 100); //begrenzt den Bereich der Variablen1 auf Werte zwischen 1 und 10
       lcd.print(Variable2);                     //gibt die Variable1 auf dem Display aus
       }
      else                                      //wenn Encoder PinB high ist
       {
       lcd.clear();                              //Display reinigen
       Variable2--;                              //Variable2 wird um 1 runter gezählt
       lcd.setCursor(17, 0);                     //setzt den Cursor auf Spalte 17 in Zeile 0
       Variable2 = constrain(Variable2, 1, 100);  //begrenzt den Bereich der Variablen1 auf Werte zwischen 1 und 10
       lcd.print(Variable2);                     //gibt die Variable1 auf dem Display aus
      }
    }
   
  LCDML.FuncInit();            /* setup function */
  LCDML.Button_quit();         /* quit button */   
  LCDML.FuncEnd(1,0,0,0,0,0);  /* direct func end */

}   


MfG
Giovanni
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: rdevet on Jun 17, 2014, 05:15 pm

Hallo Roberto,

ich habe bei meinem Projekt als "button press time" 1000ms angegeben. Damit funktioniert mein Encoder auch ganz gut.
Hab meinen Encoder nicht entprellt. Ich benutze einen Encoder von Grayhill. Nr:62AY22061

Hier nochmal meine Einstellungen:
Code: [Select]
/* lib config */
#define _LCDMenuLib_cfg_initscreen       1      /* 0=disable, 1=enable */
#define _LCDMenuLib_cfg_initscreen_time  60000  /* 0=time disabled, >0 wait time in ms */
#define _LCDMenuLib_cfg_scrollbar 1      /* 0=no scrollbar, 1=complex scrollbar, 2=easy scrollbar */
#define _LCDMenuLib_cfg_lcd_standard 0      /* 0=HD44780 standard / 1=HD44780U standard */
#define _LCDMenuLib_cfg_press_time       1000    /* button press time in ms */


MfG
Giovanni


Hallo , ich habe meinen sketch etwas geändert da mein encoder einen pullup rersitor bracht,es ist ein ganz billiger from china,  .
http://www.banggood.com/KY-040-Rotary-Decoder-Encoder-Module-For-Arduino-AVR-PIC-p-914010.html (http://www.banggood.com/KY-040-Rotary-Decoder-Encoder-Module-For-Arduino-AVR-PIC-p-914010.html)

Ich habe manche LOWS mit HIGHS umgetauscht,meine timer seht jetzt auf 250,hiermit funktioniert es recht gut.
Den push button lag "frei" ,ist also jetzt behoben mit den pullup resitor.
Hier noch meine angepasster sketch .

void LCDMenuLib_control_encoder()
{
  i = digitalRead(Encoder_PinA);   
           
  if ((Encoder_PinALast == HIGH) && (i == LOW)) {
    if( LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) {  //<- new
    if (digitalRead(Encoder_PinB) == HIGH ) {     
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);
    delay(100);     
    } else {
      LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);
     delay(100);
    }
    } //<- new
  }
  Encoder_PinALast = i; 
  if(digitalRead(Encoder_Push) == LOW && LCDML.Timer(g_LCDMenuLib_press_time, _LCDMenuLib_cfg_press_time)) {                       
    LCDML.Button_enter();
  } 

MfG  Roberto
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 17, 2014, 11:07 pm
Hallo Roberto,

wenn du delay(100) verwendest wirst du in naher Zukunft probleme bekommen. Schau dir mal das Beispiel "Blink without delay" an und setzt dieses bei dir um. Erst wenn kein delay mehr im Code vorkommt ist es eine gute ("bessere") Lösung.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Jun 17, 2014, 11:10 pm
Und was ist mit dem punkt 8?
Code: [Select]
if(LCDML.Timer(g_timer_xxBezeichnung, 500));

Würde doch auch gehen oder?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: rdevet on Jun 18, 2014, 01:58 am

Hallo Roberto,

wenn du delay(100) verwendest wirst du in naher Zukunft probleme bekommen. Schau dir mal das Beispiel "Blink without delay" an und setzt dieses bei dir um. Erst wenn kein delay mehr im Code vorkommt ist es eine gute ("bessere") Lösung.


Hier hast du recht,ich war nur was rum experimentieren,sind jetzt weg,,es gab kein unterschied mit oder ohne delays.
Wird mir das beispiel trotzdem mal anschauen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 23, 2014, 03:13 pm
Privatenachricht:

Hey Jomelo,
als erstes Mal vielen dank für dein Projekt. Sieht einfach großartig aus!

Ich bin gelernter Elektroniker für Geräte und Systeme und habe leider nur Programmier Kenntnisse in Assembler (PIC). Ich versuche mich seit einiger Zeit an dem Arduino und bin begeistert. Was es hier für ein Forum und somit auch Unterstützung gibt, kannte ich so noch gar nicht...

naja, wie dem auch sei. ich will dein Menü über einfache Taster steuern. Ich stehe vermutlich einfach nur auf dem schlauch, aber ich raff einfach nicht wie das gehen soll... Das Menü dreht jedes mal durch wenn ich was an der Control ändere. So als hätte ich lauter offene oder nicht definierte Eingänge.
Ich kann mir aber nicht erklären wo das her kommt.

Hast du da vil eine Idee oder kannst mir vil einen tipp geben wie ich eine solche Steuerung bei deinem Projekt realisieren kann  (ich vermute mal das es so was schon iwo gibt, ich einfach nur zu doof bin das zu finden. Falls es so sein sollte, entschuldige ich mich hiermit gleich schon mal vorne weg)…


Wie sind deine Taster denn angeschlossen ?
Hast du Pullup / -down Widerstände an den Eingängen falls der Taster nicht gedrückt ist.
Normalerweise sind die Taster über den Timer (Software)  entprellt, aber dein beschriebenes Verhalten deutet wie du schon sagtest auf offene Eingänge hin.
Funktioniert das Menü wenn du es über die Tastatur bedienst ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: PhOeNiX-1 on Jun 24, 2014, 10:31 am
Sind über Pulldown angeschlossen (4,7k).
Über die Tastatur funktioniert alles einwandfrei...
Vil noch mal ganz von vorne. Für die simple art von Steuerung.
Über analog oder über die digital Eingänge? Und wo sind die definiert?
Wie gesagt, stehe noch ziehmlich am Anfang und bin nur Assambler gewohnt..
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 24, 2014, 10:46 am
Das befindet sich ganz am Anfang in der LCDML_control:
Code: [Select]

void LCDMenuLib_control_digital()
{
  #define _BUTTON_digital_enter         1   
  #define _BUTTON_digital_up            2
  #define _BUTTON_digital_down          3
  //optional
  #define _BUTTON_digital_enable_quit   1
  #define _BUTTON_digital_quit          4
  //optional
  #define _BUTTON_digital_enable_lr     1
  #define _BUTTON_digital_left          5
  #define _BUTTON_digital_right         6
...


Dann musst du noch in der Haupdatei folgendes ändern:
Code: [Select]

void loop()

  //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
  LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_serial();        /* lcd menu control */ 
  LCDMenuLib_loop();                  /* lcd function call */

  //other function ... for example simple threads ..   
}


Aber das sind wirklich die Grundlagen, wenn man von der Materie noch garkeine Ahnung hat, sollte man nicht gleich mit etwas komplizierten Anfangen, sondern erst die ganzen Beispiele probieren und sich langsamm vortasten.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: PhOeNiX-1 on Jun 24, 2014, 11:13 am
Vielen Dank. Ich wusste ich stehe nur auf dem Schlauch. Hab das mit dem, ich nenne es mal umkommentieren in der void loop nicht gemacht...
Ich weiß. Als Einsteiger sollte ich mich mit einfacherem beschäftigen. Die Grundlagen habe ich auch schon gemacht( zum größten teil zumindest  :smiley-sweat: )...Halte mich in diesem fall ganz an das Motto man wächst mit seinen Aufgaben... Davon ab habe ich ein kleines Projekt, wo ich eine Menüstruktur wie die sie entworfen hast perfekt gebrauchen kann. Also Danke dafür.
Ich werde versuchen euch nicht weiter mit meinen Anfängerfragen zu nerven ;)
Trotzdem, bis zum nächsten mal  XD
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 24, 2014, 12:07 pm
Anfängerfragen kann man immer stellen  :P. Irgendwoher muss ja das Wissen kommen
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: wolfgang928 on Jun 29, 2014, 08:13 pm
Hallo Jomelo,

ich habe Deine Bibliothek mit einem DOGM204 (20x4) über I2C gut zum Laufen bekommen, nachdem ich in der LCDMenuLib___config.h und der LCDMenuLib_class.h eine entsprechende Konfiguration hinzugefügt habe und natürlich eine Treiberbibliothek geschrieben habe.

Jetzt möchte ich zwei Dinge realisieren:
1.) rechts/links Tasten direkt verwenden
------------------
  HAUPTMENÜ       
> Heizung:    EIN            --> hier sollen die LINKS/RECHTS Tasten den Wert EIN/AUS direkt toggeln können.
  Dauer:        30 min     --> hier sollen die LINKS/RECHTS Tasten den Wert ändern können.
  Einstellungen
------------------

Code: [Select]
void FUNC_HeatingOnOff(void)
{
   if(!LCDML.FuncInit())
    {
      /* Init Function */           
    }
   
    if (LCDML.checkButtons())
    {
      if(LCDMenuLib_checkButtonLeft())
      {
        LCDMenuLib_resetButtonLeft();
        gHeatingStatus = !gHeatingStatus;
      }
      if (LCDMenuLib_checkButtonRight())
      {
        LCDMenuLib_resetButtonRight();
        gHeatingStatus = !gHeatingStatus;
      }
      if (LCDMenuLib_checkButtonEnter())
      {
        LCDMenuLib_resetButtonEnter();
        gHeatingStatus = !gHeatingStatus;
      }
      UpdateOnOffText(gHeatingStatus);     
    }
    if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1)) // (direct, up, down, left, right)
    {
      // do nothing ...
    } 
}


Ich möchte direkt in der Zeile rechts/links verwenden, aktuell muss ich vorher noch enter drücken, sonst gelange ich gar nicht in die FUNC_HeatingOnOff.
Gibt es hierfür eine Möglichkeit? Was habe ich ggf. übersehen?

2.) Menütexte dynamisch ändern

'Heizung:    EIN' auf  'Heizung  AUS' umstellen. Dies kann man natürlich direkt machen, nur bei jedem Neuaufbau des Menüs wird die ursprüngliche Konfiguration angezeigt.

Danke für einen Hinweis, wo ich ggf. ansetzen kann.

Wolfgang


Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 29, 2014, 09:54 pm
Hi,
so im Moment ist es nicht vorgesehen in der Lib. Die Menü Inhalte werden im Flashspeicher des Programms abgelegt, daher können die Einträge nicht dynamisch verändert werden.

Aber:
Du kannst natürlich die Werte überschreiben solange du im Hauptmenü bist. Ich hab nun im Moment keinen Aufbau hier um es direkt zu testen. Aber ich kann Tipps und Ideen geben.

In der LCDMenuLib.h muss unter public: folgende Zeile eingefügt werden:
Code: [Select]

// zb nach dieser Funktion:
/* get the init screen enable bit */
uint8_t getInitScreenActive();
// diese Zeile einfügen
uint8_t getCursorPos();


In der LCDMenuLib.cpp muss ans Ende der Datei folgendes eingefügt werden:
Code: [Select]

uint8_t LCDMenuLib::getCursorPos()
{
return curloc; //in dieser Variable steht die aktuelle Cursor Position
}


So, nun können wir mit  LCDML.getCursorPos die aktuelle Cursor Position auslesen

Der folgende Code muss in der Loop Funktion untergebracht werden, hinter der Funktion die das Menu läd, so dass es regelmäßig überschrieben wird. Der Code ist nicht getestet und besteht teilweise aus Pseudocode


Code: [Select]

//globale variable als speicher
uint8_t refresh_menu = 0;
uint8_t status_heizung = 0;
uint8_t status_time = 30;

void loop()
{
 //so anpassen wie bei dir
 //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
 //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
 LCDMenuLib_control_serial();        /* lcd menu control */  
 LCDMenuLib_loop();                  /* lcd function call */

 //pseudocode, nicht getestet
 
 // Herausfinden ob man im Hauptmenu ist, kein Initscreen aktiv ist und keine Funktion
 if(LCDMenuLib_getActiveFuncId() == _LCDMenuLib_NO_FUNC && LCDML.getLayer() == 0 && getInitScreenActive == false) {
   // Abfragen wo der Cursor gerade steht, Buttons müssen noch irgendwie entprellt werden.
   if(button links oder rechts gedrückt, z.B. mit digitalRead oder analogRead(xx) == xxx)
   {
    // auslesen welcher button gedrückt wurde
      uint8_t left_or_right = 0;  //0 = left, 1 = right

     switch(LCDML.getCursorPos())
     {    
         case 1:  // oder eine andere Zahl für Heizung
           if(left_or_right == 0 && status_heizung == 1) { //left
             status_heizung = 0;
           } else if(left_or_right == 1 && status_heizung == 0) { //right
             status_heizung = 1;
           }
           refresh_menu = 1;
           break:

    case 2: // oder anders für Time
      if(status_time > 0 && left_or_right == 0) { //left
        status_time--;
      } else if(status_time < maximum && left_or_right == 1) { //right
        status_time++;
       }
       refresh_menu = 1;
      break;
     }
  }

   if(refresh_menu == 1) {
      refresh_menu = 0;
     // root ebene
     // ab hier folgt pseudocode
     lcd.setCursor(xxxx);
     lcd.print(status_heizung);
     lcd.setCursor(xxxx);
     lcd.print(status_time);

   }
 }


}


Ich weiß nun nicht ob ich alle Klammern geschlossen habe. Ich hab das nur eben hier geschrieben und nirgendwo getestet. Das ganze funktioniert auch nur, wenn auf der Root Ebene nicht gescrollt werden kann, da ansonsten die Positionen immer angepasst werden müssen. Wäre auch möglich, ist aber mehr Aufwand.

Ich hoffe das Hilft dir weiter deine Lösung umzusetzen.

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: AndiBar on Jun 30, 2014, 06:07 pm
Hallo,

ich finde das Menu echt klasse und habs mir auch schon angepasst wie ich das haben will, aber wenn ich ein sketch, welches ich schon ohne das menu zum laufen gebracht habe ins menu schreibe, passiert gar nix, bzw nicht das was es soll.

ich kopier den sketch welchen ich mit FUNC_ einbinden will mal hier rein.
Ich steh leider total auf dem schlauch.

Code: [Select]
const int kompressorMax = 405;
const int kompressorMin = 610;

void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  lcd.begin(16,2);
  int sensorValue = analogRead(A1);
  int vari;
  int led = 2;
  pinMode(led, OUTPUT);

}

// the loop routine runs over and over again forever:
void loop() {

  int led = 2;
  int sensorValue = analogRead(A1);
  int vari;
 
if (sensorValue < kompressorMax) {
   digitalWrite(led, LOW);
}

else if (sensorValue > kompressorMin) {
   digitalWrite(led, LOW);
   
}
else {
   digitalWrite(led, HIGH);
}
  // print out the value you read:
vari = (100 - ((100 / 1023.0) * sensorValue));

Serial.print("Poti ");
Serial.print(vari);
Serial.print( "%");
Serial.println("...");
Serial.print(sensorValue);

lcd.clear();
lcd.setCursor(0,0);
lcd.print("Poti");
lcd.setCursor(5,1);
lcd.print(vari);
lcd.print("%");

delay(1000);
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: m6m7m9 on Jul 01, 2014, 10:18 am
Hallo und guten Tag,

dies ist mein erster Post und gleich eine sehr spezielle Frage:

Die Menüstruktur etc. habe ich gut umgesetzt bekommen und es läuft. Nun möchte ich einen ausgewählten menüpunkt "übernehmen". Wenn also in dem gewählten Menüfeld ein Begriff steht - z.B. "Phono" - möchte ich diesen Punkt als Text in eine Variable übernehmen.

Konkrete Frage: kann das LCD.Menu...._element() irgendwie ausgewertet und übernommen werden, wenn der Drehencoder >1 Sekunde gedrückt wird.

Ich habe die .h Bibliotheken durchsucht, aber keine Funktion gefunden, mit der ich das bisher umsetzen konnte. Es geht im Prizip darum, den lang_name zu übernehmen. Ich komme da einfach nicht weiter.

Herzlichen Dank

Meinolf
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 01, 2014, 11:31 am
@AndiBar, das umsetzen ist nicht so kompliziert, ich kann dir heute abend noch Tipps geben. Schau dir doch mal in der zwischenzeit an, wie man ein Programm ohne DELAYs aufbaut.

@m6m7m9
Das ist so nicht direkt vorgesehen. Probier mal diese Zeile. Ich habs noch nicht testen können:

Code: [Select]

// Funktioniert nicht

Um die Zeile zu verstehen sind tiefere c Kenntnisse nötig und der Umgang mit dem Speichern und Laden von Variablen die im Flash abgelegt werden. Ich werde es auch heute Abend mal testen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: m6m7m9 on Jul 01, 2014, 01:03 pm
...vielen Dank für die sehr schnelle Antwort. Wenn das klappen sollte? Echt cool! Probiere es heute abend mal aus.

Meinolf
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 01, 2014, 04:30 pm
@m6m7m9
Ich habs gerade mal ausprobiert, das klappt so nicht, da das Menü nur neu aufgebaut wird, wenn Enter gedrückt wird oder der Kursor aus den sichtbaren Bereich heraus bewegt wird. Bei der Scrollbewegung wird nur der Kursor bewegt, ansonsten ändert sicht erstmal nichts in der Lib. Die Änderung wäre somit nur mit einem größerem umschreiben der Lib möglich und zudem belegt das noch mehr Speicher, da Variablen zwischengespeichert werden müssen.

Wozu brauchst du das denn genau ? Eigentlich weißt du doch in welcher Funktion sich das Menü gerade befindet und kannst eine Variable passend beschreiben, das geht deutlich schneller als alles umzuschrieben.

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: m6m7m9 on Jul 01, 2014, 04:49 pm
..ich versuche mal, das Ganze zu beschreiben.

Das Menü soll an einem Phono Vorverstärker über eine Relaissteuerung die Eingänge verwalten (Input 1-5) und über eine weitere Relaissteuerung den kapazitiven bzw. Abschlusswiderstand steuern (8 Relais, die in verschiedenen Kombinationen angesteuert werden..)

Die Eingangswahl ist realisiert, ebenso die Wahl der verschiedenen Widerstandskombinationen samt grafischer Anzeige. Was nicht bisher klappt, ist die individuelle - interaktive - Zusammenstellung von 5 Eingangsmenükonstellationen.

Dazu sollen für jeden Eingang Folgendes voreinstellbar sein:
- Name des Spielers
- Name des Systems
- Grösse es Widerstandes
- Abschluss (MM oder MC)

Über die Menüsteuerung (drücken des rechten Drehencoders) sollen dem benutzer die Möglichkeit gegeben werden, aus einer Gruppe von Bezeichnungen jedem Input die o.g. Parameter "voreingestellt"´zuzuordnen - also quasi eine Menüvorauswahl.

Dazu wird im Menü als Item der 1. Ebene der Eingang gewählt, in der 2. Ebene o.g. Parameter, und jetzt kommt es:

der jeweilige Paramter der letzten Ebene soll dann als Textstring gespeichert werden (Druck des rechten Encoders >1sek und nach Übernahme Meldung "done")

Eingang1 -> Name1 + System1 + Widerstand 1 + Abschluss 1
oder in Textform als Beispiel:
Eingang1 ->  "TD126" - "MC10MK2" - "100 Ohm" - "MC"
Eingang2 -> "Cello" - "Valencia" - "120 Ohm" - MC
Eingang 3 -> "TD320" - "VM-red" - "47k" - MM
........

Wird nun der Eingang verändert (linker Drehencoder), sollen die voreingestellten Parameter direkt angewählt und angezeigt werden und über die 2. relaissteuerung die Widerstandskombination geschaltet werden.

Soweit das Ganze in Kurzform. Es fehlt eine Funktion, über den Menüstring "Text" der letzten Ebene zu übernehmen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 01, 2014, 04:55 pm
@AndiBar

Ich hab mir deinen Code mal angeschaut, dort gibt es noch einiges an Optimierungspotenzial. Zudem hast du dir die Beispiele des Menüs nicht richtig angeschaut, da dort schon ein Timer mit millis verwendet wird, der fast genau das macht was du vor hast.

Dein Code angepasst zum lernen:  WICHTIG: schau dir das genau an
Code: [Select]

// Konstanten kannst du auch mit #define schreiben. Die Bezeichnung #define wird beim übersetzen der Software
// vom Preprozessor im Programmcode ersetzt. Sieh es einfach als Platzhalter an, die du zu Laufzeit des Programms
// nicht verändern kannst
const int kompressorMax = 405;
const int kompressorMin = 610;

void setup() {
 // initialize serial communication at 9600 bits per second:
 Serial.begin(9600);
 lcd.begin(16,2);
 // das auslesen des Sensors macht hier keinen sinn, da die Variable sensorValue in dieser Funktion angelegt wird
 // Normale Variablen in Funktionen sind nur solange gesetzt, wie die funktion geöffnet ist.
 int sensorValue = analogRead(A1);
 int vari;
 // Den LED Pin kannst du auch per #define anlegen, da dieser ja Fest ist bzw sich die angeschlossene Hardware in den
 // seltensten Fällen ohne neue Softwareanpassung einfach ändert
 int led = 2;
 pinMode(led, OUTPUT);

}

// the loop routine runs over and over again forever:
void loop() {
 // siehe oben
 int led = 2;


 int sensorValue = analogRead(A1);
 int vari;
 
// Die Abfrage lässt sich wesentlich kürzer darstellen, wenn du die ersten beiden Abfragen mit einem "ODER" verknüpfst
if (sensorValue < kompressorMax) {
  digitalWrite(led, LOW);
}
else if (sensorValue > kompressorMin) {
  digitalWrite(led, LOW);
 
}
else {
  digitalWrite(led, HIGH);
}
 // print out the value you read:
vari = (100 - ((100 / 1023.0) * sensorValue));

// Jegliche Speicherung von Strings,  z.b. "Poti" wird im Ram des Kontrollers abgelegt. Da der Ram sehr sehr klein ist, solltest
// du darauf achten, nicht zu viel mit unnützen Strings zu verschwenden. Eine Alternative ist das F Makro. Mit diesem werden
// Strings im Flashspeicher abgelegt, davon ist meistens genug vorhanden.     F("Poti")
Serial.print("Poti ");
Serial.print(vari);
Serial.print( "%");
Serial.println("...");
Serial.print(sensorValue);

lcd.clear();
lcd.setCursor(0,0);
lcd.print("Poti");
lcd.setCursor(5,1);
lcd.print(vari);
lcd.print("%");

// Verwende niemals delay in deinen Programmen, außer du weißt 110% was du machst, wieso du das machst und
// das es keine andere Lösung gibt
delay(1000);
}


So nun zu der Funktion im Menü. Diese ist nun nicht mehr erklärt, da die Erklärungen oben im Code stehen
Code: [Select]

#define LED  2
#define KOMPRESSOR_MAX 405
#define KOMPRESSOR_MIN 610

uint8_t g_func_timer_DEIN_NAME = 0;  /* time counter */
unsigned long g_timer_DEIN_NAME = 0;    /* timer variable */

/* callback function - FUNC_information */
void FUNC_DEIN_NAME(void)
{
  /* setup function */       
  if(!LCDML.FuncInit())
  {
    /* clear the display and init the time counter value */         
    lcd.clear();
    lcd.print(F("x sec warten"));     
         
  }
     
  if(LCDML.Timer(g_timer_1, 1000)) {      /* init a timer with 1000ms */
   
    unsigned int sensorValue = analogRead(A1);
   
 
    if (sensorValue < KOMPRESSOR_MAX || sensorValue > KOMPRESSOR_MIN) {
      digitalWrite(LED, LOW);   
    } else {
      digitalWrite(LED, HIGH);
    }
   
    // print out the value you read:
    unsigned char vari = (100 - ((100 / 1023.0) * sensorValue));
   
    Serial.print(F("Poti "));
    Serial.print(vari);
    Serial.print(F("%"));
    Serial.println(F("..."));
    Serial.print(sensorValue);
   
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(F("Poti"));
    lcd.setCursor(5,1);
    lcd.print(vari);
    lcd.print(F("%"));
  }   
 

  /* end function for callback */
  if(LCDML.FuncEnd(0, 1, 0, 0, 0, 0)) /* (direct, enter, up, down, left, right) */ 
  {
    /* do something bevor this function is closed */     
  } 
   
 
}



Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 01, 2014, 05:15 pm
@m6m7m9

Dann ist das schon eher möglich. Also mit diesem code kann ich die letzte Ebene Auslesen, insofern es nicht die Rootebene ist. Ich denke wenn du damit etwas "rumspielst" bekommst du damit deine Lösung umgesetzt. Der "Back" Button wird auch noch nicht utnerstützt, aber die Werte kann man auch wohl so irgendwie zurücksetzen.

Code: [Select]

//....
uint8_t g_last = _LCDMenuLib_NO_FUNC;

void loop()
{  
// hier noch so anpassen, das es bei dir läuft
 //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
 //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
 LCDMenuLib_control_serial();        /* lcd menu control */  
 LCDMenuLib_loop();                  /* lcd function call */


 
 uint8_t num = LCDML.getFunction();
 
 
 if(num != _LCDMenuLib_NO_FUNC) {    
   if(g_last != num) {
     if(g_last != _LCDMenuLib_NO_FUNC) {
       // Auslesen
       char name[20];
       strcpy_P(name, (char*)pgm_read_word(&(g_LCDMenuLib_lang_table[g_last])));
       Serial.println(name);
     }
     g_last = num;
   }
 }
}

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: m6m7m9 on Jul 02, 2014, 01:19 am
...es scheint meinem Anliegen deutlich näher zu kommen! Danke!

Der Textstring wird tatsächlich ausgegeben, nun muss ich herausarbeiten, dass ein kurzes Drücken des Encoderknopfes einen Itemwechsel in die nächste Ebene bedeutet

und ein langes Drücken (>1 sek)

- eine Übernahme des Textes macht
- eine Bestätigungsmeldung "done" macht
- wieder eine Item-Ebene zurückgeht.

Aber der grundsätzliche Weg ist gebahnt, und das ist SUPER!!! Danke!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Niklas21 on Jul 03, 2014, 10:31 pm
Hallo,

ich versuche auch grade bzw. schon seit längere Zeit diese Library zum laufen zu bekommen, kriege es aber irgendwie nicht hin :-(.
Ich bekomme immer eine Fehlermeldung  (im Bild angehängt).
Punkt 4 in der Anleitung  (Schnittstelle einstellen) habe ich beachtet;) ...Ich nutze ein i2c Display (LCD2004) und habe die Adresse eingestellt unter der ich das Display angesteuert bekomme. Nun komme ich aber auch nicht weiter.

Hat  jemand für mich einen Tipp?:)

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 04, 2014, 08:24 am
Hi,
das ist nur der letzte Ausschnit der Fehlermeldung, kannst du bitte auch einen Screenshot vom Anfang hochladen ?

Mögliche Fehler:
- Falsche I2C Lib eingebunden benötigt wird: (LiquidCrystal_new Version 1.2.1)
- In der LCDMenuLib___config.h  darf nur eine Zeile aktive sein, alles andere sollte auskommentiert sein.
- Ist das richtige Beispiel geladen ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: cheshire on Jul 04, 2014, 01:41 pm
Hi, Jomelo!
Ich versuche mal das so kurz wie möglich zu halten. Ich bin ein Neuling was programmieren angeht und habe eine Aufgabe bekommen wo ich ein Menü mit mehreren Ebenen erstellen muss und deine Lib wäre dafür perfekt geeignet, nur gibt es ein kleines Problem: jedes mal wenn ich ein Programm uploade passiert garnichts . =(
Ich dachte am Anfang vielleicht liegt es daran, dass mein Programm falsch ist, aber hab dann später herausgefunden das auch Deine Programme nicht funktionieren.  :smiley-eek-blue:
Ich verwende einen Arduino Uno und MC41605A6W-BNMLW Display.
Woran könnte das ganze liegen? Ich bin schon langsam am verzweifeln hier  =(

P.S Tut mir leid falls das ganze dumm ist, aber ich bin wirklich neu in der Sache.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Jul 04, 2014, 06:36 pm

Hi, Jomelo!
aber hab dann später herausgefunden das auch Deine Programme nicht funktionieren. 


LOL
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Niklas21 on Jul 05, 2014, 04:44 pm
Hallo Jomelo,

Vielen Dank schon einmal für den Support:).
Leider bekomme ich es trotzdem nicht zum laufen:(.
Wie sollte die Config-H Datei denn aussehen? Bzw. was meinst du mit ausklammern der anderen Zeilen?
Das Beispiel,welches ich geladen habe, ist das i2c Beispiel, ich nehme mal an, dass das das richtige sein wird...

Ein Foto des kompletten Fehlertextes habe ich noch einmal angehängt.

Viele Grüße,
Niklas
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: matze2014 on Jul 22, 2014, 01:12 pm
Hallo zusammen,

ich habe ein Problem mit der Libary und meinen Tastern.
Manchmal werden keine Tastbefehle angenommen manchmal überspringt er einige Menüpunkte alsob die Taster nicht entprellt sind.
Ich habe die Taster direkt an 3 Eingänge (up,down,enter) mit 10K pulldown angeschlossen.
Und die Version mit dem Analogeingang und den Spannungsteilerwiderständen habe ich auch getestet mit dem gleichen ergebnis.
Kennt jemand das Problem und kann mir einen Tip geben?

Gruß
Matze
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 22, 2014, 01:18 pm
Es scheint als sei deine g_LCDMenuLib_press_time Zeit zu klein. Wie hast du den Wert eingestellt ?

Hast du direkt das Beispiel getestet oder schon modifikationen am Code vorgenommen ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: matze2014 on Jul 22, 2014, 10:44 pm
hmmm habe mit allen versionen das gleiche Problem deswegen glaube ich eher dass meine Hardware das Problem ist.
Press time könnte ich mal suchen.
Interessant is, wenn der arduino mehrere Stunden läuft wird er unzuverlässiger als direkt nach dem einschalten.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 22, 2014, 11:04 pm
Was heißt: "unzuverlässig direkt nach dem einschalten".
Beschreib mal genauer was passiert und was wann unzuverlässig ist.
Welchen Arduino verwendest du ?
In welcher Form hast du die Lib verändert, weil du ja sagtest, du hättest alle Versionen ausprobiert ? Welche Versionen ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: matze2014 on Jul 23, 2014, 09:49 am
Mein Problem ist nur beim Tastendrücken. Manchmal prellen die Tasten und manchmal wird der erste Tastendruck nicht erkannt, sondern man muss öfters eine Taste drücken damit das Menü weiter geht.
Mir kam es so vor, dass es direkt nach dem Einschalten etwas besser funktionieren würde, das kann aber auch subjektiv sein.

Die Lib habe ich nur soweit angepasst, dass sie mein i2c 2004 Display ansteuert und 3 Digitalpins für die Tasten nutzt.

In der Control.Ino habe ich die Eingänge 10 11 und 12 für die Taster verwendet.

void LCDMenuLib_control_digital()
{
  #define _BUTTON_digital_enter         11   
  #define _BUTTON_digital_up            12
  #define _BUTTON_digital_down          10
  //optional
  #define _BUTTON_digital_enable_quit   0
  #define _BUTTON_digital_quit          13
  //optional
  #define _BUTTON_digital_enable_lr     0
  #define _BUTTON_digital_left          13
  #define _BUTTON_digital_right         13

Ist hier vielleicht schon ein Problem zu erkennen?

Der Arduino ist ein Standard UNO.
Ich bin nicht so der erfahrene Arduino Programmierer das ist mein erstes größeres Projet. :~
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 23, 2014, 10:18 am
Hi,
irgendwie haben damit mehrere Leute ab und zu Probleme. Ab und zu läuft es auch ohne Probleme.
Es gibt eine debounce Lib die sich um das Entprellen von Tastern / Schaltern kümmert.

Kommentier in der Loop mal LCDMenuLib_control_digital aus und binde direkt die Lib ein mit den Funktionen die du benötigst.

Pseudocode:
Code: [Select]

if(debounce_dein_button_enter() ...)
   LCDML.Button_enter();

if (...)
   LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);

if ..
   LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);

// oder einen dieser virtuellen Menu Buttons
LCDML.Button_up_down_left_right(_LCDMenuLib_button_left);
LCDML.Button_up_down_left_right(_LCDMenuLib_button_right);
LCDML.Button_quit();


Ich hoffe das führt zum Ziel.
Falls du eine Lauffähige Version hast, würde ich mich über die Lösung freuen und den Code bei mir integrieren.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: matze2014 on Jul 24, 2014, 08:25 pm
Hallo, danke für deine Hilfe, aber das übersteigt meine Programmier fähigkeiten :smiley-roll:

Aber ich habe das Problem Hardwaremässig gelöst mit einem 100n Kondensator parallel zum Taster.
Jetzt funktioniert es sehr gut.
Kann auch an meinen billig Printtastern gelegen haben die mit sicherheit noch erheblich mehr prellen als andere "bessere" Taster.
Nochmal DANKE!!!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: sschultewolter on Jul 24, 2014, 08:42 pm
Mechanische Taster prellen immer, mal mehr und mal weniger. DEN nicht-prellenden mechanischen Taster gibt es nicht. Wenn ja, dann auch nur weil entsprechend mit ICs bereits das Signal entprellt wird. Kondensator reicht für die meisten Fälle
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: flansch on Jul 26, 2014, 11:16 pm
Hallo,

bin wirklich begeistert von dieser Bibliothek und hab jetzt schon einige Zeit damit experimentiert. Nun hatte ich das MacBook nicht im Haus und wollte mein Projekt unter Ubuntu 14.04 weiter bearbeiten. Leider kann ich hier nicht kompilieren, bekomm folgenden Output:

Code: [Select]

In file included from /home/flansch/sketchbook/libraries/LCDMenuLib/LCDMenuLib.h:118:0,
                from lcdml.ino:7:
/home/flansch/sketchbook/libraries/LCDMenuLib/LCDMenuLib_makros.h:104:54: error: variable 'g_LCDMenuLib_lang_0_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 PROGMEM prog_char g_LCDMenuLib_lang_ ## name ##_var[]  = content;\
                                                     ^
lcdml.ino:54:1: note: in expansion of macro 'LCDMenuLib_element'
/home/flansch/sketchbook/libraries/LCDMenuLib/LCDMenuLib_makros.h:104:54: error: variable 'g_LCDMenuLib_lang_18_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 PROGMEM prog_char g_LCDMenuLib_lang_ ## name ##_var[]  = content;\
                                                     ^
lcdml.ino:55:1: note: in expansion of macro 'LCDMenuLib_element'
/home/flansch/sketchbook/libraries/LCDMenuLib/LCDMenuLib_makros.h:104:54: error: variable 'g_LCDMenuLib_lang_19_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 PROGMEM prog_char g_LCDMenuLib_lang_ ## name ##_var[]  = content;\
                                                     ^
lcdml.ino:56:1: note: in expansion of macro 'LCDMenuLib_element'
/home/flansch/sketchbook/libraries/LCDMenuLib/LCDMenuLib_makros.h:104:54: error: variable 'g_LCDMenuLib_lang_20_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 PROGMEM prog_char g_LCDMenuLib_lang_ ## name ##_var[]  = content;\
                                                     ^
lcdml.ino:57:1: note: in expansion of macro 'LCDMenuLib_element'
/home/flansch/sketchbook/libraries/LCDMenuLib/LCDMenuLib_makros.h:104:54: error: variable 'g_LCDMenuLib_lang_21_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 PROGMEM prog_char g_LCDMenuLib_lang_ ## name ##_var[]  = content;\
                                                     ^
lcdml.ino:58:1: note: in expansion of macro 'LCDMenuLib_element'
/home/flansch/sketchbook/libraries/LCDMenuLib/LCDMenuLib_makros.h:104:54: error: variable 'g_LCDMenuLib_lang_22_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 PROGMEM prog_char g_LCDMenuLib_lang_ ## name ##_var[]  = content;\
                                                     ^
lcdml.ino:59:1: note: in expansion of macro 'LCDMenuLib_element'
/home/flansch/sketchbook/libraries/LCDMenuLib/LCDMenuLib_makros.h:104:54: error: variable 'g_LCDMenuLib_lang_23_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 PROGMEM prog_char g_LCDMenuLib_lang_ ## name ##_var[]  = content;\
                                                     ^
lcdml.ino:60:1: note: in expansion of macro 'LCDMenuLib_element'
/home/flansch/sketchbook/libraries/LCDMenuLib/LCDMenuLib_makros.h:104:54: error: variable 'g_LCDMenuLib_lang_24_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 PROGMEM prog_char g_LCDMenuLib_lang_ ## name ##_var[]  = content;\
                                                     ^
lcdml.ino:61:1: note: in expansion of macro 'LCDMenuLib_element'
/home/flansch/sketchbook/libraries/LCDMenuLib/LCDMenuLib_makros.h:104:54: error: variable 'g_LCDMenuLib_lang_25_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 PROGMEM prog_char g_LCDMenuLib_lang_ ## name ##_var[]  = content;\
                                                     ^
lcdml.ino:62:1: note: in expansion of macro 'LCDMenuLib_element'
/home/flansch/sketchbook/libraries/LCDMenuLib/LCDMenuLib_makros.h:104:54: error: variable 'g_LCDMenuLib_lang_26_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 PROGMEM prog_char g_LCDMenuLib_lang_ ## name ##_var[]  = content;\
                                                     ^
lcdml.ino:63:1: note: in expansion of macro 'LCDMenuLib_element'
/home/flansch/sketchbook/libraries/LCDMenuLib/LCDMenuLib_makros.h:104:54: error: variable 'g_LCDMenuLib_lang_27_var' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 PROGMEM prog_char g_LCDMenuLib_lang_ ## name ##_var[]  = content;\
                                                     ^

< und so weiter ... >


lcdml.ino:88:1: note: in expansion of macro 'LCDMenuLib_element'
/home/flansch/sketchbook/libraries/LCDMenuLib/LCDMenuLib_makros.h:245:46: error: variable 'g_LCDMenuLib_lang_table' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 PROGMEM const char *g_LCDMenuLib_lang_table[] = { LCDMenuLib_lang_repeat(N) }; LCDMenuLib_initObjects()
                                             ^
lcdml.ino:89:1: note: in expansion of macro 'LCDMenuLib_createMenu'


Soweit ich das herausgefunden habe, hat sich beim Kompiler gcc von Version 4.6.0 auf 4.6.1 etwas verändert, möglicherweise liegt's an den Named Address Spaces (http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Named-Address-Spaces.html (http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Named-Address-Spaces.html)). Auf dem MacBook hab ich Kompilerversion 4.2.1, unter Ubuntu 4.8.2. Ich hab nun schon versucht das selbst zu beheben, produziere damit aber immer nur neue Fehlermeldungen  :( Hab einfach noch zu wenig Erfahrung mit dem Arduino, und C-Programmierung ist bei mir inzwischen tatsächlich schon Jahrzehnte her...

Läuft das bei jemandem unter Ubuntu bzw. mit 'nem aktuelleren Kompiler?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 27, 2014, 08:34 am
Hi, ich installier mir mal eben Ubuntu (VirtualBox) und werde das testen, aber bis ich dann dazu eine Lösung herausgefunden habe, die sich in allen Versionen übersetzen lässt kann es etwas dauern.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: PhOeNiX-1 on Jul 28, 2014, 02:09 pm
Hallo,
ich hab da noch mal ein paar Fragen. Ganz einfach für euch bestimmt...
Erstmal was aktuelles:
Ich will einen Schrittmotor ansteuern und ihn einzelne Schritte machen lassen. Je nachdem wie viel grad er sich drehen soll.
bekomme aber eine Fehlermeldung, die ich nicht verstehe... hab mir gedacht ich mach das über ne einfache for schleife.
              for( int a = 0; a = schritt_anzahl; a++ )
                {
                  takt_output = HIGH;
                  delay(pause);
                  takt_output = LOW;
                  delay(pause);
                }
Die Fehlermeldung:
LCDML_function:252: error: lvalue required as left operand of assignment
252 ist der takt_output = HIGH;

Ich vermute das ich den Digitalen I/O völlig falsch definiert habe... Könnte mir wer sagen wo ich das mache?
Habe als letztes versucht in lcdml unter pin settings fest zu legen.

#define takt_output                      3

Dann habe ich in void setup

pinMode(takt_output, OUTPUT);

eingefügt...Ab ich denke ich habe da wieder was missverstanden und das geht ganz anders..

Jetzt zu ein paar allgemeinen fragen wenn es euch nichts aus macht.

lcd.print(F("3 mal Links drucken"));

was hat das mit dem (F("xxxx")) auf sich? Geht ja auch ohne...

Bei mir sind die Tx & Rx (D0 & D1) immer High. Warum? Kann ich die auch noch als "freie" I/O´s benutzen?
Wenn ja, natürlich noch die frage wie?

Und zu guter letzt bin ich durch die Aufteilung des Programms in die drei tabs ein wenig verwirrt( wobei ich idese aufteilung sehr gut finde, da sie das alles viel übersichtlicher macht).
Aber wo deffiniere ich generell die I/O´s und wo globale Variablen?

Schon mal danke für eure Zeit und Gedult
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 28, 2014, 02:13 pm
Globale Variablen kannst du überall definieren, ich mach das immer entweder im ersten Tab, oder nur über den Funktionen in denen ich diese benötige. Der beste Weg ist mein erster Vorschlag.

Zu den anderen Fragen, erstell bitte ein neues Thema, da die Diskussion hier nur Verwirrung stiftet, bzw. benutz die Boardsuche zum F(..) Makro ;-)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Jul 28, 2014, 03:07 pm

Zu den anderen Fragen, erstell bitte ein neues Thema


Brauch er/sie nicht, gibts bereits paar Seiten zurück:
http://forum.arduino.cc/index.php?topic=256916.0
Ansonsten, :D

http://arduino.cc/en/Tutorial/DigitalPins
http://arduino.cc/en/Reference/PinMode
http://arduino.cc/en/Reference/DigitalRead
http://arduino.cc/en/Reference/DigitalWrite
http://arduino.cc/en/Tutorial/HomePage
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: PhOeNiX-1 on Jul 29, 2014, 08:30 am
Alles klar, werde ich mich schlau lesen.
Vielen dank Ihr beiden.

P.S.: er  ;)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: gatekeeper on Jul 29, 2014, 01:33 pm
Hallo
ich möchte das Menü für eine Satelliet-Positionierer verwenden.
Jetzt möchte ich einen Sensor ununterbrochen in der void loop (Rotary Messrad-Encoder)
laufen lassen um der Position zu berechnen.

                  menu 1      menu 2           menu 3      menu 4
East        astra 2           astra 3         astra 1         hotbird              west
limit                                                                                                        limit
0----------53-----------78-----  -84--------102--->>>>>-----200


Und diese Daten verwenden und in alle Menüpunkte angezeigen.
Der Zähler zählt aber das wird nicht live auf das lcd angezeigt.
Der LCD-Anzeige wird nicht dynamisch aktualisiert.
Wie kan ich das ändern hat jemand eine Lösung dar für.

ich habe das Forum gelesen , vielleicht , dass die Lösung bereits erwähnt wurde.
aber Deutsch ist nicht meine Sprache.





int sensorCounter = 0;   // counter for the number of sensor puls
int sensorState = 0;         // current state of the sensor
int lastsensorState = 0;     // previous state of the sensor
const int  sensorPin = 10;    // the pin that the sensor is attached to


LCDMenuLib_element(0  , Item         , Item_1        , "Satellite"          , FUNC);
LCDMenuLib_element(1  , Item_1       , Item_1_1      , "Back  "             , FUNC_back);
LCDMenuLib_element(2  , Item_1       , Item_1_2      , "Astra 1  "          , FUNC_astra);
LCDMenuLib_element(3  , Item_1       , Item_1_3      , "Astra 2  "          , FUNC);
LCDMenuLib_element(4  , Item_1       , Item_1_4      , "Astra 3 "           , FUNC);
LCDMenuLib_element(5  , Item_1       , Item_1_5      , "Hotbird  "          , FUNC);
LCDMenuLib_element(6  , Item_1       , Item_1_6      , "Eutelsat"           , FUNC);
LCDMenuLib_element(7  , Item_1       , Item_1_7      , "Nilesat  "          , FUNC);
LCDMenuLib_element(8  , Item         , Item_2        , "Setup"              , FUNC);
LCDMenuLib_element(9  , Item_2       , Item_2_1      , "Set limits"         , FUNC);
LCDMenuLib_element(10 , Item_2       , Item_2_2      , "Offset"             , FUNC);
LCDMenuLib_element(11 , Item_2       , Item_2_3      , "Back"               , FUNC_back);
LCDMenuLib_element(12 , Item_2_1     , Item_2_1_1    , "East limit"         , FUNC);
LCDMenuLib_element(13 , Item_2_1_1   , Item_2_1_1_1  , "Back"               , FUNC_back);
LCDMenuLib_element(14 , Item_2_1     , Item_2_1_2    , "West limit"         , FUNC);
LCDMenuLib_element(15 , Item_2_1_2   , Item_2_1_2_1  , "Back"               , FUNC_back);
LCDMenuLib_element(16 , Item_2_1     , Item_2_1_3    , "Back"               , FUNC_back);


void setup()
{   
  LCDMenuLib_setup(_LCDMenuLib_cnt);  /* Setup for LcdMenuLib */
  Serial.begin(9600);                 /* start serial */
  pinMode(sensorPin, INPUT);     // initialize the sensor pin as a input:
 

void loop()

  //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_serial();        /* lcd menu control */
  LCDMenuLib_control_rotary();
  LCDMenuLib_loop();   /* lcd function call */
  FUNC_sensorCounter();
// Serial.println(LCDMenuLib_getActiveFuncId()); 
  //other function 

void FUNC_sensorCounter ()
{

// read the sensor input pin:
  sensorState = digitalRead(sensorPin);

  // compare the sensorState to its previous state
  if (sensorState != lastsensorState) {
    // if the state has changed, increment the counter
    if (sensorState == HIGH) {
      // if the current state is HIGH then the sensor
      // wend from low to high:
      sensorCounter++;       
     
    }
    else {      // if the current state is LOW then the sensor
                // wend from high to low:
    }
  } 
  lastsensorState = sensorState;// save the current state as the last state,
  //for next time through the loop

     }

***************************************************************************************
lcdml function

void FUNC_astra(void)
{
   /* setup function */
  if(!LCDML.FuncInit())
  {
 
   
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(sensorCounter);
}
/* end function for callback */
  if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1)) /* (direct, up, down, left, right) */ 
  {
    /* do something bevor this function is closed */
  }
 
}


 
void FUNC_back(void)
{   
       
  LCDML.FuncInit();            /* setup function */
  LCDML.Button_quit();         /* quit button */   
  LCDML.FuncEnd(1,0,0,0,0,0);  /* direct func end */
}

********************************************************************************************

ROTARY ENCODER + BUTTON
Wenn jemand dies noch verwenden kann, so hab ich es gemacht mit meinem Drehgeber + Taste


LCDML
/* include libs */
#include <LiquidCrystal.h>
#include <LCDMenuLib.h>

#include <phi_interfaces.h>
#define Encoder1ChnA 2
#define Encoder1ChnB 3
#define EncoderDetent 20




//encoder mapping
char mapping1[]={'U','D'}; // This is a rotary encoder so it returns U for up and D for down on the dial.
phi_rotary_encoders my_encoder1(mapping1, Encoder1ChnA, Encoder1ChnB, EncoderDetent);
multiple_button_input* dial1=&my_encoder1;


//encoder button
#define enter_btn 6
#define total_buttons 1
char mapping[]={'E'};
byte pins[]={enter_btn};
phi_button_groups my_btns(mapping, pins, total_buttons);
multiple_button_input* pad1=&my_btns;
*********
snip---------

*********
void loop()

  //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_serial();        /* lcd menu control */
  LCDMenuLib_control_rotary();
  LCDMenuLib_loop();   /* lcd function call */
***********************************************************************************

LCDML_control


void LCDMenuLib_control_rotary()
//rotary up-down
{
char temp;
temp=dial1->getKey(); // Use the phi_interfaces to access the same keypad
if (temp!=NO_KEY)
switch ( temp){
case 'U': LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); break;
case 'D': LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); break;
}
//rotary button
{
char temp1;
  temp1=my_btns.getKey(); // Use phi_button_groups object to access the group of buttons
//  temp=pad1->getKey(); // Use the generic multiple_button_interface to access the same hardware
  if (temp1!=NO_KEY) Serial.write(temp1);
  switch (temp1){
  case 'E': LCDML.Button_enter(); break;
}
}
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 29, 2014, 02:30 pm
Hello,

you can post code in code tags  with  [ code ] ... [ /code ] without spaces.

Your Problem is, that you try to change the content in the function setup. This setup is run only at first call or on an recall if you have chosed another menu element before.

Look on the examples with Timer or on this code:
Code: [Select]

/* copy this variable to your globals */
int sensorCounterOld = 0;

void FUNC_astra(void)
{
 /* setup function */      
 if(!LCDML.FuncInit())
 {
   /* do nothing else here */          
   lcd.clear();      
 }
 
 /* loop area: this is the part, to add code  */  
 if(sensorCounter != sensorCounterOld) { // only update your lcd when new data is available
sensorCounterOld = sensorCounter;  // your lcd is not so fast
lcd.clear();
lcd.setCursor(0,0);
lcd.print(sensorCounter);
 }
 /* end loop area */
 
 /* end function for callback */
 if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1)) /* (direct, enter, up, down, left, right) */  
 {
   /* do something bevor this function is closed */      
 }
}

I hope it help you.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: gatekeeper on Jul 29, 2014, 11:11 pm
Thank you very  much for you fast answer Jomelo

Tried you code and it works.
Only thing is that the lcd only shows the counter  until the Rotary wheel moves.
It is blank when I acces the menu  astra or astra2.....
I'm glad I have asked it here.
I asked it on a Different Dutch forum to, but there was immediately thrown with difficult code when in fact it's as simple as that.


Thanks again.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 31, 2014, 11:39 am
Hi,
change my function to this and it works in all other functions:
Code: [Select]

/* copy this variable to your globals */
int sensorCounterOld = 0;

void FUNC_astra(void)
{
 /* setup function */      
 if(!LCDML.FuncInit())
 {    
   lcd.print(sensorCounter);  // <== this line is new        
   lcd.clear();      
 }
 
 /* loop area: this is the part, to add code  */  
 if(sensorCounter != sensorCounterOld) { // only update your lcd when new data is available
sensorCounterOld = sensorCounter;  // your lcd is not so fast
lcd.clear();
lcd.setCursor(0,0);
lcd.print(sensorCounter);
 }
 /* end loop area */
 
 /* end function for callback */
 if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1)) /* (direct, enter, up, down, left, right) */  
 {
   /* do something bevor this function is closed */      
 }
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 31, 2014, 05:52 pm
Update: 31.07.2014
- Kann nun auch in der Arduino Version 1.5.x kompeliert werden
- Kann nun auch unter Linux übersetzt werden (Ubuntu 14.04)
- Leicht anders Verfahren um Menüelemente zu erzeugen (das alte funktioniert auch noch)
- zwei neue Makros die zu einer Element-ID den Text aus dem Flash laden
- eine neue Funktion in der Lib: getCursorPos(); => liefert die aktuelle Kursor Position.


Initialisierung des Menüs:
Code: [Select]

LCDMenuLib_add(0  , root         , 1  , "Information"        , FUNC_information);
LCDMenuLib_add(1  , root         , 2  , "Zeit Info"          , FUNC_timer_info);
LCDMenuLib_add(2  , root         , 3  , "Einstellungen"      , FUNC);
LCDMenuLib_add(3  , root_3       , 1  , "Werte veraendern"   , FUNC);
LCDMenuLib_add(4  , root_3       , 2  , "Irgendwas"          , FUNC);
LCDMenuLib_add(5  , root         , 4  , "Programme"          , FUNC);

"roor" steht für die Ebene 0. Sobald ein Element zu einer neuen Ebene hinzugefügt werden kann, ist dies mit root_"bezeichnung_der_ebene_davor" möglich. Die alte Intialisierung mit LCDMenuLib_element(....) ist weiterhin möglich. 

LCDMenuLib_getElementName(variable, element_id)
Kann, wenn das Element nicht existiert zu abstürzen führen.
Code: [Select]

char test[20];
LCDMenuLib_getElementName(test, 0);
Serial.println(test);


LCDMenuLib_getElementNameChecked(variable, element_id, check_variable)
Überprüft zusätzlich ob das Element existiert.
Code: [Select]

char test[20];
boolean check = False;
LCDMenuLib_getElementName(test, 0, check);
if(check == true) {
  Serial.println(test);
}


@flansch
Das kompilieren mit der neusten gcc Komiler Version ist nun möglich

@clic
Danke für den Tipp mit den digitalen Anschlüssen 0 und 1, diese sind natürlich für die Serielle-Schnittstelle und nicht für Buttons unter  LCDMenuLib_control_digital zu verwenden. Die Beispiele sind nun angepasst.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: flansch on Aug 12, 2014, 11:44 pm
Hallo Jomelo,

danke für die rasche Reaktion, nun läuft auch bei mir unterm aktuellen Ubuntu wieder alles super  :)

lg
Flansch
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: cusk on Sep 08, 2014, 11:05 am
Hallo,

ich wollte diese Library für in der Abschlussprüfung meiner Ausbildung verwenden und wollte aufgrund von Pinknappheit die I2C-version verwenden, bekomm aber die Konfiguration der Header-Datei nicht hin. Kann mir vielleicht jemand sagen, was und wie ich die Datei abändern muss, um den gewünschten Typ zu bekommen.

Vielen Dank schon mal.

cusk
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Sep 08, 2014, 05:52 pm
Hi klar kein Problem. Hast du denn I2C schon ausprobiert, so dass es ohne die Lib läuft ?

In der Datei "LCDMenuLib___config.h"  musst  du die Teile 63:  _LCDMenuLib_cfg_lcd_type   0   kommentieren und einer der Zeilen 75 - 80 entkommentieren. Welche Zeile genau hängt von deinem LCD ab.

Des Weiteren benötigst du die  LiquidCrystal_new Version 1.2.1 Lib.   

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: cusk on Sep 09, 2014, 10:09 am
Danke für die schnelle Hilfe, Jomelo .
Jetzt kann ich das Beispiel-Projekt auch Compilieren ohne Fehler. Konnte die Datei nur mit Texteditor öffnen und habe die Kommentare gar nicht bemerkt.

Hab noch gemerkt, dass in dem Beispielprogramm lcdml_i2c beim Reiter LCDML_control ein kleiner Fehler ist, der zu Frustmomenten führen kann.

In Zeile 57 und 58 muss das # durch // für Kommentar ersetzt werden, da das sonst zu einer Fehlermeldung führt.

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Shortmann on Sep 12, 2014, 04:14 pm
Hi!

großes Lob an dich für die Lib!

Aber ich hab ein Problem:
Ich weiß nicht wie ich in den einen menüpunkt eine variable einstelle damit ich sie in einen anderen programmabschnitt benutzen kann!

zB: in "Einstellungen" setze ich einen Wert (5),
       und in "Programm Starten" soll er den Wert für blinken verwenden(5xblinken).
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Sep 12, 2014, 05:47 pm
Dafür muss du eine globale Variable anlegen also außerhalb der Setup Funktion. Schau dir dazu mal im Beispiel die Funktion "FUNC_timer_info(void)"  an. Darüber sind Variablen definiert die in mehreren Funktionen den abrufbar sind.

Allgemein fällt das unter: "Erste Schritte der Grundlagen". Was globale und lokale Variablen sind kannst du anhand der Beispiele in der Arduino Umgebung lernen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Leon8380 on Sep 13, 2014, 04:02 pm
Hallo Jomelo,
Erst mal großen Respekt für das was Du da geschaffen hast. :)
Ich benutze dein LCD menü für meinen Aquaduino (AquariumSteuerung). Mittlerweile konnte ich schon sehr viel umsetzten und es funktioniert tadellos.  Allerdings steh ich gerade vor einer kleinen Herausforderung.
Ich will einen Menüpunkt gestalten wo ich verschiedene Profile für die strömungspumpen hinterlegt habe.
Nun möchte ich  im menü ein strömungsprofil auswählen dass dann so lange läuft bis ich wieder ein anderes auswähle.
Wie kann ich das am besten implementieren?

Gruß,
Leon8380
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Sep 13, 2014, 05:10 pm
Da gibt es nun viele Möglichkeiten:

1. Erstell dir eine globale Variable in der du den Mode speicherst. Dann machst du in der loop Funktion  eine Abfrage und ruft die jeweilige Funktion auf.

2. Du arbeitest dich in eine zweite Lib von mir ein:  simpleThread (http://forum.arduino.cc/index.php?topic=165552.0). Mit dieser könntest du einen Ablauf erstellen und auch stoppen der zeitlich getriggert aufgerufen wird.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Leon8380 on Sep 13, 2014, 05:24 pm
Hi, danke für die schnelle Antwort. :)
Dann werd ich mich mal mit deinem zweiten Lösungsvorschlag auseinandersetzen und versuchen ob es funktioniert. ;-)

Gruß,
leon8380
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Leon8380 on Sep 13, 2014, 07:51 pm
Hab mich jetzt doch für Lösung ins entschieden. Nur, welche Art von Variable muss ich da wählen? "int" funktioniert nicht
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Sep 14, 2014, 09:18 am
Das hängt nicht mit dem Type zusammen das liegt eher am Grundverständniss der Programmiersprache. Schreib hier in das Forum mal den Quellcode, bei dem du meinst das er für uns wichtig sein wird. (Das ist nicht der komplette Quellcode)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Chris-GDI on Sep 21, 2014, 12:44 pm
Hallo Jomelo,

ich bin begeistert von deiner Lib und würde sie gerne für mein Projekt verwenden.
Ich habe vor, meine Menüführung über einen Drehimpulsgeber zu verwirklichen.
Da in deiner Beschreibung ein Drehimpulsgeber erwähnt wird wollte ich dich  fragen ob du auch für diese Variante eine Control Function hättest oder mir einen Tipp geben könntest wie ich dies selber gestalten könnte.

Ich befinde mich selber erst in den Anfängen der Programmierwelt und wäre dir sehr Dankbar.

LG Chris-GDI
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Sep 21, 2014, 02:29 pm
Ich selbst habe noch keinen Drehgeber / Encoder verwendet, aber einige andere.

Schau mal hier:
http://forum.arduino.cc/index.php?topic=73816.msg1760124#msg1760124

oder auf der Seite zuvor oder danach.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Chris-GDI on Sep 21, 2014, 04:40 pm
Hallo Jemelo,

vielen Dank für die schnelle Hilfe! Nach ein paar Veränderungen hat alles Funktioniert.
Ich lasse mir jetzt noch etwas für den Back befehl einfallen und werde wenn es gewünscht wird mein Code dann hier Posten.

Danke!

LG Chris-GDI
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: michaeltanner on Sep 25, 2014, 07:59 am
Hallo zusammen

Wir versuchen LCDMenuLib mit einem Teensy und LCD mit I2C zum funktionieren zu bringen. Dazu verwenden wir einen Code, der auf einem Mega problemlos läuft. Auf der Teensy HW "hängt" die Programmausführung, auf dem Display wird nichts angezeigt. Mittels Troubleshooting haben wir das Problem schon mal etwas eingegrenzt, die Ausführung bleibt hier hängen:
LCDMenuLib_initFunction(N);

Weiter sind wir im Moment noch nicht gekommen, diese Funktion wird nach Aufruf nicht mehr verlassen, es passiert einfach nichts mehr...

Hat schon mal jemand LCDMenuLib mit einem Teensy verwendet? Ideen, was das Problem sein könnte?

Danke,
Michael
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Sep 25, 2014, 06:39 pm
Hi,
einen Teensy und ein I²C Display hab ich leider nicht hier zum testen.
Kompiliert die Lib denn bei euch, wenn ihr es ohne I²C versucht ?

Welche I²C Lib verwendet ihr ?
Verwendet ihr die neuste Version der Lib  (1.0.1) ?

Die Funktion "LCDMenuLib_initFunction(N);"  ist ein Makro welches die Initialisierung der Menuelemente durchführt. Eine Schleife befindet sich nicht darin. Ich könnte mir vorstellen, dass allgemein etwas bei der Konfiguration schief gegangen ist oder die I²C Lib des Teensy nicht unterstützt wird.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: michaeltanner on Sep 28, 2014, 01:39 pm
Hallo Jomelo

Die Lib kompiliert auch mit I2C, alles ohne Fehler. Wir verwenden die Standard Wire Lib aus Arduino 1.0.5, also nicht die Teensy spezifische Lib. Die MenuLib Version ist noch 1.00

Ich habe ein Display Test Code für I2C, dieser läuft mit dem Teensy problemlos. Das Problem tritt also erst auf, wenn wir MenuLib verwenden. Das Display initialisiert übrigens noch, der Bildschirm löscht. Auch können wir mit dem Oszi die I2C Kommunikation für die Initialisierung sehen, sieht gut aus.

Welche I2C Lib sollte verwendet werden? Upgrade 1.01 sollten wir wohl auch noch testen?

Gruss
Michi

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: michaeltanner on Oct 03, 2014, 04:36 pm
Hallo Jomelo

Mit der aktuellen Library 1.01 funktioniert es jetzt, allenfalls ein Bug Fix dieser Version?

Danke & schönes Wochenende!
Grüsse
Michi
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: peissl_at on Oct 05, 2014, 10:16 am
Hallo Jomelo,

auch von mir größten Respekt und herzlichsten Dank für Deine Arbeit.
Als Arduino-Anfänger konnte ich mir damit eine menügeführte Statusanzeige für meine HomeMatic-Haussteuerung bauen.

Ich hätte jedoch noch eine kleine Frage dazu:
Gibt es eine Möglichkeit die Anzeigetexte der Menüpunkte nachträglich zu verändern?
Beispiel: in einem Menü "Darstellung" kann ich die Anzeige einer Zeile anpassen: zur Auswahl stehen "Systemvariable", S0-Eingang" und "oneWire-Sensor". Ich würde die aktuell verwendete Einstellung gerne markieren oder noch besser: im Menü "Darstellung " das Untermenü gleich entsprechend benennen.

Sonnige Grüße!
Robert
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 05, 2014, 10:37 am
Hi, das ist so nicht vorgesehen um den Ram verbrauch der Lib zu minimieren. Es gibt einige hier die versucht haben das ganze dynamisch anzupassen, aber ich bin mir nicht sicher ob das sinvoll ist.  z.B. hier: http://forum.arduino.cc/index.php?topic=73816.msg1788436#msg1788436 und die nächsten Beiträge.

Eine Lösung hab ich dafür gerade nicht parat, außer halt die Dinge, die du schon genannt hast.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: peissl_at on Oct 05, 2014, 08:01 pm
Hallo Jomelo,

vielen Dank für Deine rasche Antwort.
Kein Problem. Es hätte mir halt gefallen, wenn man bereits im Untermenü die getroffenen Einstellungen gesehen hätte.
Ich habe bereits eine Funktion zur Konfiguration einer IP-Adresse erstellt und werde die anderen Einstellungen ähnlich abbilden.

Trotzdem nochmals herzlichen Dank für Deine Mühe.

Sonnige Grüße!
Robert
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 07, 2014, 06:52 pm
Hi, du hast einen Fehler speziell in diesem Teil:
(code aus dem beispiel)
Code: [Select]

LCDMenuLib_init(_LCDMenuLib_cnt);
  LCDMenuLib_add(0  , root         , 1  , "Information"        , FUNC_information);
  LCDMenuLib_add(1  , root         , 2  , "Zeit Info"          , FUNC_timer_info);
  LCDMenuLib_add(2  , root         , 3  , "Einstellungen"      , FUNC);
  LCDMenuLib_add(3  , root_3       , 1  , "Werte veraendern"   , FUNC);
  LCDMenuLib_add(4  , root_3       , 2  , "Irgendwas"          , FUNC);
  LCDMenuLib_add(5  , root         , 4  , "Programme"          , FUNC);

Irgenwo stimmt eine Zuordnung nicht. Beispiel wie man es machen könnte:

Code: [Select]

LCDMenuLib_init(_LCDMenuLib_cnt);
LCDMenuLib_add(0  , root         , 1  , "Information"        , FUNC_information);
LCDMenuLib_add(1  , root         , 2  , "Zeit Info"          , FUNC_timer_info);
LCDMenuLib_add(2  , root         , 3  , "Einstellungen"      , FUNC);
LCDMenuLib_add(3  , root_3       , 1  , "Werte veraendern"   , FUNC);
LCDMenuLib_add(4  , root_3       , 2  , "Irgendwas"          , FUNC);
LCDMenuLib_add(5  , root         , 4  , "Programme"          , FUNC);
LCDMenuLib_add(6  , root         , 5 , "Root Elemnt 5"        , FUNC);
LCDMenuLib_add(7 , root_5         , 1  , "Root Elemnt 5 Sub 1"          , FUNC);
LCDMenuLib_add(8  , root_5         , 2  , "Root Elemnt 5 Sub 2"      , FUNC);
LCDMenuLib_add(9  , root_5_2       , 1  , "Root Elemnt 5 Sub 2 Sub 1"   , FUNC);
LCDMenuLib_add(10 , root_5_2       , 2  , "Root Element 5 Sub 2 Sub 2"          , FUNC);
LCDMenuLib_add(11 , root_5         , 3  , "Root Element 5 Sub 3"          , FUNC);
//...

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: stinkyBrain on Oct 08, 2014, 11:02 am
Hallo Jomelo!


Vielen Dank fuer Deine Antwort. Hatte Deine Nachricht gar nei gesehen aber konnte das Problem mittlerweile selber loesen. Waren einfach ein Paar Eingabefehler.

Soweit klappt alles einwandfrei, aber wenn ich die Datei auf mein Arduino hochlade passiert nichts. Eigentlich bin ich der Meinung ich habe alle Pins fuer die Buttons usw richtig zugeordnet, trotzdem geschieht auf dem Display ueberhaupt nichts.

Komisch ist nur das ich andere Sketches mit der LiquidCrystal.h library einwandfrei abspielen kann, nur bei diesem geht gar nichts.


Vielleicht hast Du eine Idee?

Hier noch die Einstellungen fuer mein LCD

Quote
/* settings for lcd */
#define _LCDMenuLib_LCD_cols             20
#define _LCDMenuLib_LCD_rows             4

/* pin settings */ 
#define _LCDMenuLib_LCD_rs               8
#define _LCDMenuLib_LCD_e                9
#define _LCDMenuLib_LCD_dat0             0
#define _LCDMenuLib_LCD_dat1             0
#define _LCDMenuLib_LCD_dat2             0
#define _LCDMenuLib_LCD_dat3             0

#define _LCDMenuLib_LCD_backlight        7
#define _LCDMenuLib_LCD_backlight_pol    NEGATIVE // POSITIVE

//#define _LCDMenuLib_LCD_rw            0
/* 8 bit mode */
#define _LCDMenuLib_LCD_dat4          7
#define _LCDMenuLib_LCD_dat5          6
#define _LCDMenuLib_LCD_dat6          2
#define _LCDMenuLib_LCD_dat7          3


MfG
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 08, 2014, 08:03 pm
Du hast die Lösung quasi direkt bei dir im Quelltext stehen:

Code: [Select]

/* 8 bit mode */


Da du aber nur vier Anschlüsse verwendest, verwendest du ja den 4 Bit Mode. Also alles was unter 8 Bit Mode steht auf 0 und alles davor mit den Pins belegen. 
Ich weiß die Beschriftung ist dumm gewählt, aber die LiquidCrystal Lib will es so haben, da das die internen Beschriftungen sind.
Also  0 - 3  = 4 bit mode     4 - 7 = 8 bit Mode.

Code: [Select]

/* 8 bit mode */
#define _LCDMenuLib_LCD_dat0          7
#define _LCDMenuLib_LCD_dat1         6
#define _LCDMenuLib_LCD_dat2          2
#define _LCDMenuLib_LCD_dat3          3

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: stinkyBrain on Oct 11, 2014, 10:07 am
Hallo Jomelo.


Danke fuer Deine rasche Antwort!

ich habe jetzt so ziemlich alles ausprobiert und denke ich habe den fehler herausgefunden. Auch wenn ich die 4-bit Einstellung uebernehme tut sich bei meinem LCD gar nichts.

Als Beispiel beim standard sketch LCD_Test muss ich folgende anpassungen machen um den LCD einzuschalten.

Quote
#include<Wire.h>
#include<LiquidCrystal.h>
//LiquidCrystal lcd(13, 12, 11, 10, 9, 8);  <-- gemaess Beispiel
LiquidCrystal lcd(0); <-- angepasst fuer meine Settings

void setup()
{
  lcd.begin(20, 4);
  lcd.print("Test");
  lcd.setCursor(0, 1);
  lcd.print("Test 2");
}


Wenn ich diese eine Zeile "LiquidCrystal lcd(0);" auf Deine Menuvorlage uebernehme dann stauen sich die Fehlermeldungen gerade so an.

Es tut mir echt leid wenn ich scheinbar nicht zufrieden zu stellen bin aber ich verstehe irgendwie nicht was ich falsch mache, bzw. wieso es bei mir einfach nicht funktionieren will! Ich hoffe Du verstehst das :)

Vielen Dank fuer Deine Antwort!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 11, 2014, 03:20 pm
Hast du den einfach mal nur versucht die Beispiele zu testen also nur in dem du die Pins anpasst, ohne das jetzt viel umgeschrieben wird ?

Welche Arduino Version verwendest du und welche Lib version ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: stinkyBrain on Oct 12, 2014, 02:32 am
Hallo Jomelo!

Ja auch das funktionierte nicht.

Arduino version 1.0.6 und die library habe ich nie geaendert.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 12, 2014, 08:04 am
Also, da es bei vielen anderen läuft, geh ich davon aus das der Fehler irgendwo in deinem Aufbau / Programm liegt:

1. Verwendest du die Lib Version 1.00 oder 1.01 ?  Das kannst du unter GitHub beim Download sehen. Wenn du nun schreibst, du hast nie etwas verändert, kann ich daraus nicht auf die Version schließen. Falls du 1.00 verwenden solltest, teste bitte auch die neuste Version 1.01: https://github.com/Jomelo/LCDMenuLib/releases/tag/v1_01

2. Stell hier bitte mal deinen Code herein, also den ersten Tab im Beispiel nach dem du die Pins so verändert hast, dass es mit der normalen LiquidCrystal Lib läuft, also du einen Ausgabe auf dem LCD erzeugen kannst ohne Verwendung der LCDMenuLib.

3. Skizzier bitte kurz deinen Aufbau also an welchem Pins hängt das LCD  und wo ist der Pin am LCD angeschlossen (kleiner Schaltplan)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: stinkyBrain on Oct 12, 2014, 02:55 pm
Hallo Jomelo!


Danke nochmal fuer Deine Antwort.

Ich benutze bereits Version 1.01 Deiner Lib, also kann diese Fehlerquelle ausgeschlossen werden.

Bei den Pins Einstellungen bin ich mir eben nicht sicher, da ich bis anhin in allen Programmen die Zeile:

Quote
LiquidCrystal lcd  ( 0 ) ;


verwendet habe um mein LCD zu konfigurieren.

Ich benutze ein Brick Shield der Marke "Maker Studio", siehe Bild im Anhang.


Hier die version des Codes die ich ohne Syntax Fehler in meinem IDE abspielen muss, viel habe ich in dem Sinne nicht veraendert ausser dass ich die Lib "Wire.h" hinzugefuegt habe.


Quote

/* include libs */

#include <LiquidCrystal.h>
#include <LCDMenuLib.h>
#include <Wire.h>


/* settings for lcd */
#define _LCDMenuLib_LCD_cols             20
#define _LCDMenuLib_LCD_rows             4

/* pin settings */ 
#define _LCDMenuLib_LCD_rs               2
#define _LCDMenuLib_LCD_e                3
#define _LCDMenuLib_LCD_dat0             4
#define _LCDMenuLib_LCD_dat1             5
#define _LCDMenuLib_LCD_dat2             6
#define _LCDMenuLib_LCD_dat3             7

//#define _LCDMenuLib_LCD_backlight        7
#define _LCDMenuLib_LCD_backlight_pol    POSITIVE // NEGATIVE

//#define _LCDMenuLib_LCD_rw            0
/* 8 bit mode */
//#define _LCDMenuLib_LCD_dat4          0
//#define _LCDMenuLib_LCD_dat5          0
//#define _LCDMenuLib_LCD_dat6          0
//#define _LCDMenuLib_LCD_dat7          0


/* lib config */
#define _LCDMenuLib_cfg_initscreen       1      /* 0=disable, 1=enable */
#define _LCDMenuLib_cfg_initscreen_time  60000   /* 0=time disabled, >0 wait time in ms */
#define _LCDMenuLib_cfg_scrollbar    0      /* 0=no scrollbar, 1=complex scrollbar, 2=easy scrollbar */
#define _LCDMenuLib_cfg_lcd_standard    0      /* 0=HD44780 standard / 1=HD44780U standard */
#define _LCDMenuLib_cfg_press_time       200    /* button press time in ms */

/* menu element count - last element id */
#define _LCDMenuLib_cnt    17 

/* init lcdmenulib */
LCDMenuLib_init(_LCDMenuLib_cnt);

/* create menu */
/* root           => layer 0 */
/* root_XX        => layer 1 */
/* root_XX_XX     => layer 2 */
/* root_XX_XX_XX  => layer 3 */
/* root_...      => layer ... */
/* LCDMenuLib_element(id, prev_layer_element, new_element_num, lang_string, callback_function) */
LCDMenuLib_add(0  , root         , 1  , "Information"        , FUNC_information);
LCDMenuLib_add(1  , root         , 2  , "Zeit Info"          , FUNC_timer_info);
LCDMenuLib_add(2  , root         , 3  , "Einstellungen"      , FUNC);
LCDMenuLib_add(3  , root_3       , 1  , "Werte veraendern"   , FUNC);
LCDMenuLib_add(4  , root_3       , 2  , "Irgendwas"          , FUNC);
LCDMenuLib_add(5  , root         , 4  , "Programme"          , FUNC);
LCDMenuLib_add(6  , root_4       , 1  , "Programme 1"        , FUNC);
LCDMenuLib_add(7  , root_4_1     , 1  , "P1 Starten"         , FUNC);
LCDMenuLib_add(8  , root_4_1     , 2  , "Einstellungen"      , FUNC);
LCDMenuLib_add(9  , root_4_1_2   , 1  , "extra warm"         , FUNC);
LCDMenuLib_add(10 , root_4_1_2   , 2  , "extra lang"         , FUNC);
LCDMenuLib_add(11 , root_4_1_2   , 3  , "zurück"             , FUNC_back);
LCDMenuLib_add(12 , root_4       , 2  , "Programm 2"         , FUNC_p2);
LCDMenuLib_add(13 , root_4       , 3  , "Programm Mix"       , FUNC);
LCDMenuLib_add(14 , root_4       , 4  , "Programm Hemden"    , FUNC);
LCDMenuLib_add(15 , root_4       , 5  , "Programm Schnell"   , FUNC);
LCDMenuLib_add(16 , root_4       , 6  , "Einstellungen"      , FUNC);
LCDMenuLib_add(17 , root_4_6     , 1  , "Irgendwas"          , FUNC);
LCDMenuLib_createMenu(_LCDMenuLib_cnt);


void setup()
{   
  LCDMenuLib_setup(_LCDMenuLib_cnt);  /* Setup for LcdMenuLib */
  Serial.begin(9600);                 /* start serial */ 
}

void loop()

  //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
  LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_serial();        /* lcd menu control */ 
  LCDMenuLib_loop();                  /* lcd function call */

  //other function ... for example simple threads ..   
}


Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 12, 2014, 04:36 pm
Das bild erklärt wieder einiges. Du verwendest also ein I²C Display ?

Gib mir mal bitte einen Schaltplan, also wie hast du das LCD Mit dem Arduino verbunden, verwendest du nur die 4 Anschlüsse (5V, GND, SDA, SCL) ? Falls ja schick ich dir die Lib Konfiguriert zu und du musst das I²C Beispiel laden.

Irgendwo steck da der Wurm drin und ohne Informationen kann ich dir nicht helfen.

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: stinkyBrain on Oct 13, 2014, 06:35 am
Hallo Jomelo!

Ja ich verwende nur die 4 Anschluesse(5V, GND, SDA, SCL)...

Wenn du mir die Lib konfiguriert zuschicken kannst waere das super.

Komisch ist nur das bei anderen Sketches alles mit der normalen LiquidCrystal.h Lib funktioniert. Bei anderen Sketches habe ich nie eine I2C Lib laden muessen, und sie funktionierte trotzdem.



Besten dank fuer deine Antwort!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Wuschlbub on Oct 13, 2014, 01:04 pm
Ich habe bisher nur die ersten 4 Seiten des Topics gelesen.

2 kleine Problemchen habe ich noch.

1) Anstatt des Menu's soll, eine Funktion anfangs gestartet werden.
Mit Select/Enter soll ins Menu gesprungen werden

Wo wir bei Problem #2 wären:

2) Wie frage ich denn Select/Enter ab, es gibt keinen Wert "_LCDMenuLib_button_xxx" wie bei den andren Tasten

Danke dir für die geniale Arbeit.
Kann man dir einen kleinen Obolus zuschicken ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 13, 2014, 06:49 pm

Hallo Jomelo!

Ja ich verwende nur die 4 Anschluesse(5V, GND, SDA, SCL)...

Wenn du mir die Lib konfiguriert zuschicken kannst waere das super.

Komisch ist nur das bei anderen Sketches alles mit der normalen LiquidCrystal.h Lib funktioniert. Bei anderen Sketches habe ich nie eine I2C Lib laden muessen, und sie funktionierte trotzdem.

Besten dank fuer deine Antwort!

Probier es erstmal sebst:

1. Download dieser LiquidCrystal Lib:  https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads  (version 1.2.1)
2. Alte LiquidCrystal Lib aus dem Ordner verschieben, umbennen reicht nicht.
3. neue Lib einfügen und erstmal das Beispiel mit der Adresse 0 oder 0x00  (beides gleich)  testen und schauen ob auf dem Display etwas angezeigt wird.
4. In der  LCDMenuLib___config.h im LCDMenuLib Ordner  die Zeile 63 auskommentieren und in Zeile 75 die Zeile einkommentieren:
Code: [Select]

//-> diese Zeile auskommentieren
//# define _LCDMenuLib_cfg_lcd_type 0 // 4Bit (tested)
//-> diese Zeile einkommentieren
# define _LCDMenuLib_cfg_lcd_type 10 // I2C (tested)

5. I2C Beispiel der LCDMenuLib laden und die Adresse von 0x20 auf 0x00 ändern und erneut testen.


Quote from: Wuschlbub

Ich habe bisher nur die ersten 4 Seiten des Topics gelesen.

2 kleine Problemchen habe ich noch.

1) Anstatt des Menu's soll, eine Funktion anfangs gestartet werden.
Mit Select/Enter soll ins Menu gesprungen werden

Wo wir bei Problem #2 wären:

2) Wie frage ich denn Select/Enter ab, es gibt keinen Wert "_LCDMenuLib_button_xxx" wie bei den andren Tasten

Danke dir für die geniale Arbeit.
Kann man dir einen kleinen Obolus zuschicken ?


Zum springen ist bereits eine Funktion vorgesehen:
Code: [Select]

LCDMenuLib_jumpToFunc(FUNC_deine_name);


Den Enter Button musst du selbst nicht abfangen, dazu kannst du die Funktioin mit der folgenden Konfiguration wie in den Beispielen verwenden:
Code: [Select]

if(LCDML.FuncEnd(0, 1, 0, 0, 0, 0)) /* (direct, enter, up, down, left, right) */  
   {
     /* do something bevor this function is closed */      
   }


Ansonsten schau dir mal den "Init Screen" an, der macht direkt das was du willst, wenn du die Zeit auf ganz groß stellst, dann wird dieser so gut wie nie geladen oder du resettest den Timer regelmäßig. Mit folgenden Funktionen kannst du den InitScreen direkt starten bzw die Zeit neustarten:
Code: [Select]

LCDMenuLib_IS_startDirect();   // direkt zu dieser Funktion springen
LCDMenuLib_IS_reStartTime(); // Zeit neustarten, sprich wenn diese Funktion regelmäßig aufgerufen wird, wird der InitScreen niemals gestartet


Falls du dann doch mal einen Button direkt abfragen willst geht das hiermit:
Code: [Select]

// Buttons abfragen
if(LCDMenuLib_checkButtonEnter()) {  ...  }
if(LCDMenuLib_checkButtonUp()) {  ...  }
if(LCDMenuLib_checkButtonDown()) {  ...  }
if(LCDMenuLib_checkButtonLeft()) {  ...  }
if(LCDMenuLib_checkButtonRight()) {  ...  }

// Button Status zurücksetzen
// Hierbei bitte beachten, dass dann die Funktion FuncEnd  nicht mehr richtig funktioniert, da der Status vorher verändert wurde, also nur anwenden wenn man weiß was man macht
LCDMenuLib_resetButtonEnter();
LCDMenuLib_resetButtonUp();
LCDMenuLib_resetButtonDown();
LCDMenuLib_resetButtonLeft();
LCDMenuLib_resetButtonRight();





Ich hoffe das beantwortet eure Fragen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Wuschlbub on Oct 13, 2014, 08:28 pm
Leider funktioniert das für mich immer noch nicht ganz, obwohl es trivial sein sollte.

Ich möchte einfach eine Funktion anzeige() ausführen, bis ich mit Enter ins Menu springen möchte

Code: [Select]
void anzeige()   
{
  lcd.clear();   
  while(!(LCDMenuLib_checkButtonEnter()))    //ODER: LCDML.FuncEnd(0, 1, 0, 0, 0, 0) /* (direct, enter, up, down, left, right) */
  {
  /*   irgendetwas anzeigen      */
  }
  //HIER: Befehl um wieder zurück ins Root zu springen
}


Der Knopfdruck wird nicht erkannt. Anscheinend brauche ich dazu die checkButtons doch ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 13, 2014, 08:37 pm
Sobald du while verwendest hebelst du jeden Sinn des Menüs aus. Du kannst solltest keine eigenen Funktionen schreiben die vor dem Menü läuft, das ist so nicht vorgesehen getestet. Bei Check Button wird nicht der Status der Eingänge abgefragt, sondern nur der Status der beim letzten mal gespeichert wurde, durch die Funktion LCDMenuLib_control_..... in der Loop Funktion ausgeführt wurde.

Was spricht den gegen die Init Funktion, die ist genau für so etwas vorgesehen.



Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Wuschlbub on Oct 13, 2014, 08:58 pm
Dein Vorschlag scheint zu funktionieren, wenn ich in meinen Funktionen

LCDMenuLib_control_analog();

aufrufe und dann das Menu mit

LCDMenuLib_loop();
starte

Würde ich es wie von dir vorgesehen richtig machen, müsste ich alle meine Funktionen da reinklopfen ?

LCDML.FuncInit ?

Sorry fürs auf der Leitung stehen:
Baue einen Wecker und der funktioniert soweit auch.

Nur die Funktionen (ZeitStellen,WeckzeitStellen etc.pp) müssen jetzt noch bedienbar sein.

P.S.: Anstatt mit einem extra "zurück" Button im Menu, würde ich gerne immer mit Links eine Ebene tiefer gehen.
Einfach möglich ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 13, 2014, 09:08 pm
Einfach möglich:  Ja

In dem Tab LCDControl folgendes anpassen:
Code: [Select]

else if(value >= _BUTTON_analog_left_min && value <= _BUTTON_analog_left_max && _BUTTON_analog_enable_lr == 1) {   // control left
     LCDML.Button_quit();
   }



Nochmal zu der normalen anzeige Funktion und dem Init Screen,  stell die Zeit des Initsscreens auf 20000.  Schreib deine Anzeige Funktion in die Initscreen Funktion, diese wird ja kontinuirlich aufgerufen wie eine while Schleife aber ohne das Programm zu unterbrechen. Da wir schon beim Thema sind, falls du "delay" im Menü verwenden willst / solltest, dann kann es vorkommen das die Funktion nicht mehr gegeben ist.

Setup sieht bei mir dann so aus:
Code: [Select]

void setup()
{    
 LCDMenuLib_setup(_LCDMenuLib_cnt);  /* Setup for LcdMenuLib */
 Serial.begin(9600);   /* start serial */  

 LCDMenuLib_IS_startDirect();
}


Die Loop sieht so aus:
Code: [Select]

void loop()
{  
 //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
 //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
 LCDMenuLib_control_serial();        /* lcd menu control */  
 LCDMenuLib_loop();                  /* lcd function call */
 LCDMenuLib_IS_reStartTime();
 //other function ... for example simple threads ..  
}


Willst du den Init Screen erneut aufrufen geht das aus jedem Menüpunkt mit:
LCDMenuLib_IS_startDirect();

Eigentlich macht es keinen Sinn den Menü Fluss also Programmablauf zu mit eigenen Funktionen zu unterbrechen.

Wenn ich nun dann aber doch Funktionen benötige, die im Hintergrund laufen, dann nutz ich eine weitere Lib von mir:
http://forum.arduino.cc/index.php?topic=165552.0

Wobei im Moment existiert noch ein Bug in der Lib, den ich in den nächsten Tagen beheben werde.  



Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: brs20 on Oct 13, 2014, 09:29 pm
Dear friends,

As I can not speak German I wrote in English. Please forgive me.

I tried to use this library in a incubator project. Normally my incubator code works great. I use lcdmenlib to enter parameters.

I succeeded making it work. But menu starts intermediately.

Where to put my normal code? I don't want the menu start first.

Thank you.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 13, 2014, 09:43 pm
Hi,

have i understand you right.
You want to use the menu, but not every time. Only to change some parameters ?

You can use the initscreen for your normal/old code, when you press a control button the menu will display the settings, when the settings are set, you can go back to the initscreen.

Example Setup
Code: [Select]

void setup()
{    
 LCDMenuLib_setup(_LCDMenuLib_cnt);  /* Setup for LcdMenuLib */
 Serial.begin(9600);   /* start serial */  

 LCDMenuLib_IS_startDirect();
}


Example Loop
Code: [Select]

void loop()
{  
 //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
 //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
 LCDMenuLib_control_serial();        /* lcd menu control */  
 LCDMenuLib_loop();                  /* lcd function call */
 LCDMenuLib_IS_reStartTime();
 //other function ... for example simple threads ..  
}


and now comes your old code here:
Code: [Select]

void FUNC_init_screen(void)
{
 /* setup function */
 if(!LCDML.FuncInit())
 {
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("You old code setup function");      
 }

 /* loop start */
 /* enter you old code here,  this function can be left with the menu control buttons */
 /* you can start this function with  "LCDMenuLib_IS_startDirect();" from ever other */
 /* menu function */

 /* ..... */
 
 /* end function for callback */
 if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1)) /* (direct, enter, up, down, left, right) */  
 {
   /* do something bevor this function is closed */      
 }    
}


This is one way, there are some other ways, but i don`t know wich is perfekt.

I hope i can help you with this answer. Its nearly the same, like the thread/post above.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Wuschlbub on Oct 13, 2014, 09:45 pm
Danke, das ist soweit okay.

Die anderen Funktionen lasse ich dann über das Menu aufrufen. Die die Init kann ich ja nur eine Funktion komplett implementieren.
Vermute fast, dass wir ein wenig aneinander vorbei reden :-(

z.B.
Code: [Select]
LCDMenuLib_add(2  , root_2       , 1  , "Uhrzeit"            , setzeUhrzeit);

Nun ist nur noch das Thema, wie deine Schalterlogik bei mir funktioniert. Um wie hier z.B. die Zeit in meinem Programm einzustellen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: brs20 on Oct 13, 2014, 10:47 pm
@ Jomelo

Thank you very much. I solved exactly as you described.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: koka_tr on Oct 15, 2014, 01:24 am
Hi Jomelo,

erst einmal super Arbeit bei der Lib und toll, dass du dich aktiv weiterhin bemühst den leuten mit deiner Lib zu helfen :).

Ich versuche gerade ein Menü aufzubauen "root" ( "Home" und "Einstellungen" ) wenn man auf Home klickt soll irgendetwas angezeigt werden.
Wenn man auf Einstellungen klickt soll eine Passwortabfrage erfolgen, soweit so gut. Nur wie komme ich nach der erfolgreichen Passwortabfrage wieder zurück ins Menü bzw. dann in "root1" von "Einstellungen" ( hier sollen dann verschiedene Menüpunkte sein wie z.B.  Hindergrundbeleuchtung einstellen etc. ). Das gleiche gilt bei negativer PW abfrage hier soll man wieder in "root" kommen.

was ich brauche ist quasi eine Zwischenfunktion die dann wieder in eine Ebene des Menüs weiterleitet.

Heißt im klartext:

root Home -> Uhrzeit anzeigen;
root Einstellungen -> Func_PWabfrage (falls richtig)-> root1 Backlight
                                                                                                -> root1 Pwm
                                                                                                -> root1 etc.

root Einstellungen -> Func_PWabfrage (falls falsch) -> root Home
                                                                                                -> root Einstellungen

Hoffentlich konnte ich mein Problem verständlich erörtern. ^^

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bocca on Oct 15, 2014, 04:52 pm
Hallo,

auch von mir erst mal großen Respekt zu dem Projekt.

Ich habe folgende Frage:
Bei mir läuft alles bestens mit einem I2C 20x4 LCD Display.

Nun habe ich jedoch für die gleiche Anwendung 3 verschiedene Displays mit verschiedenen I2C Adressen (0x20, 0x27 und 03F).

D.h. ich brauche meinen Quellcode 3x, für jede Adresse 1x.

Nun war meine Idee, daß ich als erstes einen I2C-Scanner laufen lasse, der die Adresse des Displays ermittelt und dann in
eine Variable _LCDMenuLib_LCD_addr schreibt.
Anstatt #define _LCDMenuLib_LCD_addr             0x3F .

Wenn ich das so mache, scheint aber die Adresse nicht richtig an LCDMenuLib übetragen zu werden, denn das Display zeigt nichts an.

Gibt es dafür einen Tipp ?

Danke.

Viele Grüße,
Kay.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 16, 2014, 06:19 am
@koka_tr

Du kannst kannst das Menu auch direkt ansteuern, sprich in einer Menu Funktion wandern bzw direkt zu einem anderen Punkt springen:

Code: [Select]

LCDMenuLib_jumpToFunc(FUNC_xxxxx);  //springen

LCDML.goRoot(); // zurück zum Haupmenu

LCDML.FuncEnd(1,0,0,0,0,0); // Funktion direkt verlassen

LCDML.Button_quit(); // Eine Ebene im Menu zurück Wandern

LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); // um +1 wandern

LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); // um -1 wandern

LCDML.Button_enter(); // neue Ebene Laden


@bocca
Das ist nicht möglich, die Lib wurde so entwickelt das auf jedem Kontroller nur 1 Menü möglich ist. Der Zeitauffwand um das umzuschreiben für mehrere Objekte / Menüs beträgt ca 80 - 100 Zeitstunden und ist nicht realisierbar. Inklusiver aller Tests. Bzw, die ganzen Makros sind nicht Multiobjektfähig.
Durch die Makros wird sehr viel Quellcode generiert, wenn ihr diesen jedes mal von Hand schreiben müsstet, würde niemand das Menü verwenden wollen ;-)



 


Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: bocca on Oct 16, 2014, 09:46 am
Hallo Jomelo,

danke für die schnelle Antwort.

Ich glaube, ich habe mich nicht genau genug ausgedrückt.

Ich habe nicht 3 Displays an einem Arduino, die ich gleichzeitig betreiben will, sondern je einen Arduino mit je einem Display.

Dummerweise haben die Displays unterschiedliche I2C Adressen.
D.h. an meinem ersten Arduino hängt ein Display mit Adresse 03F,
am zweiten Arduino ein Display mit Adresse 0x20 und
am dritten Arduino ein Display mit Adresse 0x27.

Da die I2C Adresse z.B. über "#define _LCDMenuLib_LCD_addr             0x3F" gesetzt wird, läuft der Code nur mit einem Display mit dieser Adresse 0x3F und ich müßte den Code 3x vorhalten und dann immer auf den richtigen Arduino aufspielen

Meine Idee war nun, daß ich als erstes mit einem I2CScanner die jeweilige I2C Adresse ermittele und diese dann genutzt wird um das angehängte Display anzusteuern.

Code: [Select]


/* scan i2c display adress */
/* works only with one I2C Device */

void Test_init_i2c() {
  byte error;
  byte address;
  int nDevices;
  nDevices = 0;
 
   Wire.begin();
 
  if (DEBUG) {
    Serial.println("scanning for I2C devices");
  }

  for (address = 1; address < 127 && nDevices < 1; address++ )
  {

    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0 && nDevices < 1)
    {
      if (DEBUG) {
        Serial.print("I2C device found at address 0x");
        if (_LCDMenuLib_LCD_addr < 16) Serial.print("0"); 
        Serial.print(_LCDMenuLib_LCD_addr, HEX);
        Serial.print(_LCDMenuLib_LCD_addr);
        Serial.println("  !");
      }
      _LCDMenuLib_LCD_addr = address;
      nDevices++;
    }
    else if (error == 4)
    {
      if (DEBUG) {
        Serial.print("Unknow error at address 0x");
        if (_LCDMenuLib_LCD_addr < 16) Serial.print("0");
       
        Serial.println(_LCDMenuLib_LCD_addr, HEX);
      }
    }
  }
    if (DEBUG) {
    Serial.println("scanning for I2C devices ended");
  }



D.h. ich würde _LCDMenuLib_LCD_addr als Variable (type uint8_t) mit der ermittelten Adresse füllen und erst dann das Menu initialisieren.
... aber irgendetwas habe ich offensichtlich noch nicht verstanden und mache etwas falsch.

Viele Grüße,
Kay.




Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: koka_tr on Oct 17, 2014, 03:15 am
Hi Jomelo,

Danke für die schnelle Antwort, aber ich denke ich hab mich auch nicht genau genug ausgedrückt. Was ich mir wünsche ist quasi in eine beliebige Menüebene zu springen. quasi ähnlich dem LCDML.goRoot() halt nur nicht in Root sondern z.B. Ebene 2 oder 3 eines Menüpunktes.

Code: [Select]

LCDMenuLib_add(0  , root         , 1  , "Home"               , FUNC_Zeit);
LCDMenuLib_add(1  , root         , 2  , "Anmeldung"          , FUNC_Password);
LCDMenuLib_add(2  , root_2       , 1  , "Einstellungen"     , FUNC);
LCDMenuLib_add(3  , root_2       , 4  , "Zurueck"            , FUNC_Back);
LCDMenuLib_add(4  , root_2_1       , 1  , "Test1"     , FUNC_Zahlen);
LCDMenuLib_add(5  , root_2_1       , 2  , "Test2"      , FUNC_Timer);
LCDMenuLib_add(6  , root_2_1       , 3  , "Hisotrie"          , FUNC_Werte);
LCDMenuLib_add(7  , root_2_1       , 4  , "Zurueck"            , FUNC_Back);


Denke so ist es verständlicher.. ich möchte bei "Anmeldung" in die FUNC_Password, hier wird eine Pinabfrage durchgeführt. Falls diese erfolgreich ist möchte ich quasi wieder in das Menü zurück und dort in die Ebene root_2 und dort möchte ich dann wieder ganz normal die Menüpunkte "Einstellungen" und "Zurueck" sehen.

Ist das irgendwie möglich? :)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Oct 17, 2014, 07:12 am
Die Frage wurde schon mal gestellt, schau mal einige Seiten zurück.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: koka_tr on Oct 17, 2014, 06:19 pm
Hi, skorpi08

falls du meine Frage meintest, ich habe nix derartiges gefunden.. also denke ich du meinst bocca's Frage.

VG
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: flansch on Oct 17, 2014, 11:46 pm
Hallo!

Ich hab das Menü mit einer 6-Taster-Konfiguration im Einsatz. Wenn nun gerade eine meiner Funktionen am Laufen ist und man die "Back/Quit/Exit"-Taste drückt, dann wird die Ausführung sofort abgebrochen und das Menü wird wieder angezeigt. Dabei wird aber der Code, der bei LCDML.FuncEnd hinterlegt ist, nicht mehr ausgeführt. Dadurch läuft dann z.B. ein Motor weiter, der in diesem Fall eigentlich gestoppt werden sollte.

Wie kann ich das Drücken von Back abfangen und meine Funktion sauber beenden?

Danke für Eure Tipps!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 18, 2014, 12:38 pm
@flansch

Das ist wohl ein Bug, bzw ist so nicht vorgesehen. Ich schau mal wie ich das lösen kann, da die Exit Taste die ausgeführte Funktion direkt beendet ohne das diese nochmal ausgeführt wird.

Ich schau mal wie man das umgehen kann.

Edit:
Das Problem sollte nun behoben sein.
Version 1.02 :  https://github.com/Jomelo/LCDMenuLib/releases/tag/v1_02
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Balse on Oct 20, 2014, 08:53 pm
Hey Jomelo

Erst mal: grossartige lib. Genau was ich gesucht habe!
Ich bin da aber auf ein kleines Problem gestossen.
Ich brauche die lib zum ersten mal und würde nicht fragen, wenn ich nicht gerade die letzte Frage zum Thema Quit Funktion gelesen hätte.
Ich habe die Version 1.02 installiert, und bei mir funktioniert Quit überhaupt nirgends. Auch die Zurück Funktion in dem example bringt mich leider nirgends hin.
Sprich: Ich kann in die Menus reinnavigieren, aber nicht wieder raus :-)
Mache ich was falsch, oder könnte dies mit dem Thema vom letzten post zu tuen haben???

Thank's in advance...
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: vnt17 on Oct 20, 2014, 10:39 pm
Mahlzeit,

erstmal vielen dank für die viele Arbeit..aber ich hänge schon direkt am Anfang.
Ich möchte das Menü mit 6 Tastern bedienen allerdings tut sich nichts. Ich habe die Taster zusammen mit pulldown Widerstand an die Eingänge angeschlossen und die Pins in LCDML_control eingetragen:

void LCDMenuLib_control_digital()
{
  #define _BUTTON_digital_enter         25   
  #define _BUTTON_digital_up            22
  #define _BUTTON_digital_down          23

Muss ich irgendwo die Eingabe von seriell auf digital umstellen? Dazu konnte ich keine option finden.

Taster funktioniert in einem anderen Sketch und die serielle Steuerung funktioniert auch.

Vermutlich ists mal wieder nur eine Kleinigkeit die ich übersehen habe.

Schonmal vielen dank für die Mühe!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Balse on Oct 21, 2014, 03:23 pm
Hello vnt17

Schau mal in deinem loop() nach. Sollte ca. so aussehen:
Code: [Select]
void loop()

  //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */
  LCDMenuLib_control_serial();        /* lcd menu control */ 
  LCDMenuLib_loop();                  /* lcd function call */

  //other function ... for example simple threads ..   
}


Alles was du machen musst, das // vor der entsprechenden Funktion löschen (// bezeichnet eine auszementierte Zeile)
Hoffe konnte helfen...
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: flansch on Oct 21, 2014, 10:06 pm
1) Also bei funktioniert nun Quit auch überhaupt nicht mehr, hab auf 1.01 zurückgestellt. Eine Idee damit umzugehen, dass die ausgeführte Funktion nicht mehr aufgerufen wird, wäre optional zusätzlich zur Ausführungs- auch eine Aufräumfunktion anzugeben. Diese würde dann beim Drücken von Quit automatisch ausgeführt und man könnte darin dann alles in den Ausgangszustand zurückversetzen. Und man könnte diese auch einfach bei LCDML.FuncEnd einsetzen:
Code: [Select]
#define _LCDMenuLib_cnt    4    //muss der letzten verwendeten ID im Menü entsprechen
  LCDMenuLib_init(_LCDMenuLib_cnt);
  LCDMenuLib_add(0  , root         , 1  , "Information"        , FUNC_information);
  LCDMenuLib_add(1  , root         , 2  , "Zeit Info"          , FUNC_timer_info, FUNC_timer_info_end);
  LCDMenuLib_add(2  , root         , 3  , "Einstellungen"      , FUNC);
  LCDMenuLib_add(3  , root_3       , 1  , "Werte veraendern"   , FUNC);
  LCDMenuLib_add(4  , root_3       , 2  , "Irgendwas"          , FUNC);
//.....

void FUNC_timer_info(void)
{
  if(!LCDML.FuncInit())
  {
    ...
  }
    
  ...
  
  if(LCDML.FuncEnd(0, 1, 0, 0, 0, 0))  
  {
    FUNC_timer_info_end ();
  }  
}

void FUNC_timer_info_end (void)
{
  ...
}

2) Nochwas ist mir aufgefallen: Ich hab meinen Code auf das lcdml Beispiel aufgebaut. Dort werden die Menüpunkte mit LCDMenuLib_element hinzugefügt, auf der ersten Seite dieses Themas aber mit LCDMenuLib_add. Die Funktionen tun letztlich ja das gleiche, oder gibt's da spezielle Vor- bzw. Nachteile?
3) Und wenn ich schon dabei bin, kann ich eigentlich dynamisch Menüpunkte hinzufügen? Die Texte würden dabei aus einem Array kommen und alle Menüpunkte sollten die gleiche Funktion aufrufen, mit dem Arrayindex bzw. dem Text als Parameter.


PS: beim Einloggen ins Forum bekam ich nun den Hinweis, dass ich 6 neue Mitteilungen hätte, mein Postfach ist aber komplett leer (d.h. auch alle früheren Nachrichten sind verschwunden). Könnt Ihr das auch beobachten?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 22, 2014, 10:11 am
zu 1. Ja stimmt, ich war zu schnell, hab das unter github entfernt und werde das mal ordenlich testen, es brauch seine Zeit.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: stinkyBrain on Oct 22, 2014, 12:41 pm
Quote
Probier es erstmal sebst:

1. Download dieser LiquidCrystal Lib:  https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads  (version 1.2.1)
2. Alte LiquidCrystal Lib aus dem Ordner verschieben, umbennen reicht nicht.
3. neue Lib einfügen und erstmal das Beispiel mit der Adresse 0 oder 0x00  (beides gleich)  testen und schauen ob auf dem Display etwas angezeigt wird.
4. In der  LCDMenuLib___config.h im LCDMenuLib Ordner  die Zeile 63 auskommentieren und in Zeile 75 die Zeile einkommentieren:
Code: [Select]


//-> diese Zeile auskommentieren
//# define _LCDMenuLib_cfg_lcd_type 0 // 4Bit (tested)
//-> diese Zeile einkommentieren
# define _LCDMenuLib_cfg_lcd_type 10 // I2C (tested)


5. I2C Beispiel der LCDMenuLib laden und die Adresse von 0x20 auf 0x00 ändern und erneut testen.
Lieber Jomelo!


Ich habe nun so ziemlich jedes moegliche Szenario durchgespielt, bleibe aber immer wieder an der selben Stelle haengen.

Felhermeldung:
Quote
Menu_Regulator:89: error: no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C(int)'
/Applications/Arduino.app/Contents/Resources/Java/libraries/LiquidCrystal_I2C_V1.0/LiquidCrystal_I2C.h:56: note: candidates are: LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, uint8_t)
/Applications/Arduino.app/Contents/Resources/Java/libraries/LiquidCrystal_I2C_V1.0/LiquidCrystal_I2C.h:54: note:                 LiquidCrystal_I2C::LiquidCrystal_I2C(const LiquidCrystal_I2C&)

Ich habe im Internet geschaut und dieser Fehler ist bei anderen auch aufgetreten. Ihre Loesungen haben mir jedoch nicht wirklich weitergeholfen. Ich verzweifle bald, verstehe wirklich nicht wieso das einfach nicht funktionieren will...
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 22, 2014, 07:01 pm
@flansch
Ich hab das Problem lösen können, aber die orginal Funktionalität wird dadurch leicht verändert. Der Exit / Quit Button führt nun nicht in jedem Beispiel direkt aus der Funktion heraus, da ansonsten der Code zum sauberen beenden der Funktion nicht mehr ausgeführt werden kann. Um dieses sauber zu lösen wird eine weitere "FuncEnd" Funktion benötigt, die den Quit Button abfängt.

Ein Beispiel:
Code: [Select]

// check if the function ends normaly
  if(g_func_timer_info <= 0)
  {
    // end function for callback
    if(LCDML.FuncEnd(1,0,0,0,0,0)) // (direct, enter, up, down, left, right)  
    {
      // do something bevor this function is closed    
      // normaler ausstieg aus der Funktion, der untere Teil spielt dann keine Rolle, auch wenn dieser nochmals ausgefürt wird
    }  
  }

  // check if the function end - hard
  if(LCDML.FuncEndQuitButton())
  {
    // do something bevor this function is closed  
    //  harter Ausstieg aus der Funktion, aber kann sauber abgefangen werden  
  }  

Die nomale Func End Funktion hat hier wenn Quit betätigt wird keine Bedeutung, da die Zeit noch nicht heruntergelaufen ist.
Ich denke die Lösung stellt einen sauberen Weg zum beenden der Funktion her. Ich werde die Dokumentation im ersten Beitrag dahingehend anpassen.
Download der Beta Version:
https://github.com/Jomelo/LCDMenuLib/releases/tag/v1_02_beta (https://github.com/Jomelo/LCDMenuLib/releases/tag/v1_02_beta)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 22, 2014, 07:08 pm
@stinkyBrain
Die Fehlermeldung sagt aus, dass du die LiqudiCrystal Lib verwendest oder diese nicht gefunden werden kann. Du musst die alte LiqudCrystal lib außerhalb des Arduino Verzeichnis speichern oder löschen ein Umbennen reicht nicht aus.
Und du musst die Arduino Software einmal schließen nachdem du eine neue Lib hinzugefügt hast, da er ansonsten noch alte Dateien im Cach hat.

Edit:
Ich muss gerade feststellen das ich den gleichen Fehler habe aber nicht bei allen Versionen. Ich versuch das mal zu herauszufinden wo dran es liegt und meld mich wieder.

Edit 2:
Bis auf einen kleinen Fehler im Beispiel ist mir nichts aufgefallen. Falls du Windows verwendest kann ich dir meine Arduino Version Zippen und zum Download anbieten.

Hier ist die Version ohne Fehler im I2C Beispiel
https://github.com/Jomelo/LCDMenuLib/releases/tag/v1_03_beta (https://github.com/Jomelo/LCDMenuLib/releases/tag/v1_03_beta)

Mensch irgendwie ist der Wurm drin im Moment :smiley-mr-green:
 (http://"http://\"http://\\"http://\\"http://\\"http://\\"http://forum.arduino.cc/index.php?action=profile;u=291374"""""")
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: koka_tr on Oct 30, 2014, 03:30 am
HI Jomelo,

ich hätte eine allgemein Frage, gibt es eine ausführlichere Beschreibung deines Menüs?

z.B. kurz dargestellt was zeitlich wie bearbeitet wird mit einer Art Flussplan oder einfach eine kurzer Text was quasi wie beim einschalten und danach passiert?

Wie verhält sich das Menü bei einem gesetzten Interrupt ? Friert es dann quasi kurz ein oder hast du dir da was überlegt?

Nutzt du selber ein Interrupt in dem Menü?

Vielen Dank und schöne Grüße;
Koka
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: flybysun on Oct 31, 2014, 03:40 pm
Hallo Jomelo,

von mir auch ein riesen Danke und großes Lob für das Projekt. :)

Ich möchte das Menu gerne in einem Projekt verwenden in dem ich einen Aquariencomputer aufbaue.  Zunächst lese ich einen DS1307 RTC über I²C aus. Setzen der Zeit usw, geschieht menügeführt über deine lib. Das funktioniert soweit auch super. Zudem benutze ich zur Beleuchtung zwei PCA9626 LED-Treiber, welche ich ebenfalls über I²C ansteuere. Funtkionert soweit auch.

Ich habe aber öfter das Problem, dass sich das komplette Programm aufhängt. Im Verdacht habe ich irgendwie den I²C Bus. Ich bin aber auch nicht sicher, ob ich die Zeitabfrage richtig platziert habe. ich habe sie in die FUNC_init_screen gepackt. Das sieht momentan so aus:

Code: [Select]

void FUNC_init_screen(void)
{
  /* setup function */
  if(!LCDML.FuncInit())
  {
  lcd.clear();
  }

  DateTime datetime=RTC.now(); // aktuelle Zeit abrufen
  second_new=datetime.second();
  if (second_new!=second_old)
  {
    second_old=second_new;
   
    lcd.noBlink();
    lcd.setCursor(4,0);
    // Stunde:Minute:Sekunde
    if(datetime.hour()<10)lcd.print(0);
    lcd.print(datetime.hour(),DEC);
    lcd.print(":");
    if(datetime.minute()<10)lcd.print(0);
    lcd.print(datetime.minute(),DEC);
    lcd.print(":");
    if(datetime.second()<10)lcd.print(0);
    lcd.print(datetime.second(),DEC);

    lcd.setCursor(1,1);
    // Wochentag, Tag.Monat.Jahr
    lcd.print(get_day_of_week(datetime.RTCdayOfWeek()));
    lcd.print(", ");
    if(datetime.day()<10)lcd.print(0);
    lcd.print(datetime.day(),DEC);
    lcd.print(".");
    if(datetime.month()<10)lcd.print(0);
    lcd.print(datetime.month(),DEC);
    lcd.print(".");
    lcd.print(datetime.year(),DEC);
    Check_Alarm(datetime);
  }
 
  /* end function for callback */
  if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1)) /* (direct, up, down, left, right) */ 
  {
    /* do something bevor this function is closed */     
  }     
}


In der Check_Alarm(datetime) prüfe ich ob die Alarmzeit erreicht ist (in der Funktion dimmt dann das Licht heller).

Wenn das Programm hängt, dann immer dann wenn ich den LED-Treiber ansteuer. Ich habe das vorher ohne LCD-Menu usw getestet und hatte den Baustein gut im Griff. Interessant ist auch, dass vor einem Absturz gerne mal das Display verrückt spielt (zeichen an falscher Position)

Ist es prinzipiell richtig das ganze vom Init-Screen zu starten, oder besser von der Loop aus? Von da aus habe ich es aber irgendwie nicht hinbekommen.

Danke für die Hilfe schon mal, wenn es hilft kann ich auch den gesamten Code hochladen.

Viele Grüße



Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 31, 2014, 06:22 pm
@koka_tr
Bisher gibt es noch keinen Ablaufplan, wofür benötigst du diesen?

Im Menü werden keine Interrupts verwendet, sprich sobald du einen verwendest wird der Programmablauf kurz unterbrochen, daher sollen Interrupts allgemein auch ohne Verwendung des Menüs sehr kurz gehalten werden.

Beim Ablauf gibt es zwei sichtweisen:
1. Willst du wissen wie der Ablauf ist um die Lib zu verwenden, bzw. dich schneller einzuarbeiten
2. Oder willst du wissen wie der interne Ablauf (Prototypen generierung, PROGMEM, Macros, Funktionsaufrufe) ?


@flybysun
Dein Problem klingt nach einer elektronischen Störung durch Spannungsspitzen oder Übersprechen der Leitungen.
Normalerweise sollte der Ablauf des Menüs keinen Einfluss auf die Funktionsweise des LCDs haben. Ich hab nun noch nicht so viel mit I²C gemacht, vielleicht können dir mehr Leute helfen, wenn du die Frage allgemein im Forum stellst.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: flybysun on Oct 31, 2014, 10:32 pm
Ja, ich hab so etwas auch schon befürchtet und muss der Sache mal genauer nachgehen.
Wie siehst du das denn mit der Einbindung der Zeitabfrage? Würdest du das auch mit der Init_Screen-Funktion machen, oder doch besser über die Loop und dann über threads oder ähnlich? Wie hast du das mit den Zeiten (automatische Rückkehr zum Init_Screen) eigentlich in der lib realisiert wenn du keine Interrupts benutzt?

Was koka_tr geschrieben hat, kann ich übrigens auch bestätigen. Die LCDMenuLib ist dir wirklich sehr gut gelungen und wenn man einmal verstanden hat wie sie funktioniert, ist sie relativ einfach zu benutzen.
Für den Anfang wäre aber eine Art Ablaufplan zum Einbinden oder ein kleines Howto wirklich sehr hilfreich, da es nicht so leicht ist, sich hineinzudenken (ging mir jedenfalls so).

Aber hey, dafür ist ja das Forum da ;)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 01, 2014, 12:59 pm
So,
also das Menü ist so aufgebaut, dass es nie steht und an keiner Stelle irgendwo ein "delay" verursacht. Die Funktionen die aufgerufen werden, sind in einer Variable im Hintergrund zwischengespeichert, so dass die gestartete Funktion beim nächsten Durchlauf erneut aufgerufen wird. Ein Durchlauf wird immer in der Loop Funktion gestartet mit LCDMenuLib_loop();.

Wenn nun ein Ereignis z.B. durch einen abgelaufene Zeit oder einen Taster ausgelöst wird, wird eventuell je nach Bedingung der interne Ablauf unterbrochen und die Funktion läuft noch einmal bis zur "FuncEnd" Funktion führt den enthaltenen Code aus und wird beendet.

Das ganz ist mal grob in der folgenden PDF Datei abgelegt. Vieles von den Dingen die in den Kästchenstehen laufen im Hintergrund ab und werden über Macros generiert. In der Dokumentation sind längst nicht alle Verzweigungen eingezeichnet, das benötigt eigentlich niemand. Die Dokumentation ist noch nicht komplett Vollständig. Irgendwann, wenn Zeit ist wird das weiter angepasst.


@flybysun
Ich weiß nicht genau was der beste Weg ist. Deine Zeitabfrage muss ja kontinuierlich aufgerufen werden, damit sie überprüfbar ist.

@All
Im Moment ist die Version 1.03 die neuste Version, bei dieser hat sich die Funktion des Quit Buttons leicht verändert. Um Sicherzustellen, dass der Code, der unter "FuncEnd" eingefügt wird, beendet der Quit Button nicht mehr immer direkt die gerade ausgeführte Funktion. Sollte dieses Verhalten weiterhin gewünscht sein, muss am ende jeder Funktion der folgende Code eingefügt werden:
Code: [Select]

// check if the function ends hard
  if(LCDML.FuncEndQuitButton())
  {
    // do something bevor this function is closed     
  }

Der Quellcode der in diese If Schleife eingefügt werden kann wird definitiv ausgeführt, wenn der Quit Button betätigt wird.

Download neuste Version:
https://github.com/Jomelo/LCDMenuLib/releases/tag/v1_03 (https://github.com/Jomelo/LCDMenuLib/releases/tag/v1_03)

Sobald die Edit Funktion im Forum wieder geht, werde ich den ersten Beitrag bearbeiten und auch die Dokumentation dort einfügen.

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Djam on Nov 03, 2014, 02:34 pm
Hi, and thanks for the Lib, she works great with my rotary encoder + switch.

I have some question about:

-goBack function : I want return to the previous Layer when I click on the encoder Switch, that work with this function:

Code: [Select]
void FUNC_back(void)
{    
        
LCDML.FuncInit();            /* setup function */  
if( LCDML.FuncEnd(0, 1, 0, 0, 0, 0))/* (direct, enter, up, down, left, right) */
{ LCDML.goBack(); }  

    }


But I need to click two time on the switch. there's a different way to make what I want or it's not possible?


-I want to change the cursor with LCD create Char, with this one:

Code: [Select]
byte Menu_SELECT[8] = {0, 4, 6, 7, 6, 4, 0, 0};// ►

///////

lcd.createChar(2, Menu_SELECT);


If it's possible, What I must do for undefine this ligne # define _LCDMenuLib_cfg_cursor 0x7E, and replace it with my char ?

-And, I want to make something like you say HERE (http://forum.arduino.cc/index.php?topic=73816.msg1785907#msg1785907), but that don't work fine.
It's fine when I don't touch encoder, but when I navigate in the menu the value go anywhere..

Like This:
Code: [Select]

Humidity         xx%
xx%p. BED      xx°
XXmp. AIR      xx°

.....

 

And after three or four time I turn encoder, all disappear on the screen...

I have to change something in the lib to get this kind of thing I suppose? or it's absolutely impossible?

Something here:

Code: [Select]
#define LCDMenuLib_element(name, item_old, item_new, content, function)\
const char g_LCDMenuLib_lang_ ## name ##_var[] PROGMEM = {content};\
void function(void);\
LCDMenu item_new(name); \
void LCDMenuLib_##name##_function() { g_LCDMenuLib_functions[name] = function; item_old.addChild(item_new); }

#define LCDMenuLib_add(name, item_old, item_new, content, function)\
const char g_LCDMenuLib_lang_ ## name ##_var[] PROGMEM = {content};\
void function(void);\
LCDMenu item_old ## _ ## item_new(name); \
void LCDMenuLib_##name##_function() { g_LCDMenuLib_functions[name] = function; item_old.addChild(item_old ## _ ## item_new); }


Here the code I use:

Code: [Select]



/* include libs */
#include <LiquidCrystal.h>
#include <LCDMenuLib.h>
#include "DHT.h"

//DHT Sensor
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

/* settings for lcd */
#define _LCDMenuLib_LCD_cols             20
#define _LCDMenuLib_LCD_rows             4

/* pin settings */  
#define _LCDMenuLib_LCD_rs               7
#define _LCDMenuLib_LCD_e                4
#define _LCDMenuLib_LCD_dat0             3
#define _LCDMenuLib_LCD_dat1             2
#define _LCDMenuLib_LCD_dat2             1
#define _LCDMenuLib_LCD_dat3             0
//#define _LCDMenuLib_LCD_backlight         19
//#define _LCDMenuLib_LCD_backlight_pol     POSITIVE // NEGATIVE

/* lib config */
#define _LCDMenuLib_cfg_initscreen       0      /* 0=disable, 1=enable */
#define _LCDMenuLib_cfg_initscreen_time  0      /* 0=time disabled, >0 wait time in ms */
#define _LCDMenuLib_cfg_scrollbar 0      /* 0=no scrollbar, 1=complex scrollbar, 2=easy scrollbar */
#define _LCDMenuLib_cfg_lcd_standard 0      /* 0=HD44780 standard / 1=HD44780U standard */
#define _LCDMenuLib_cfg_press_time       200    /* button press time in ms */
#define _LCDMenuLib_cnt    19  
/* init lcdmenulib */
LCDMenuLib_init(_LCDMenuLib_cnt);

#define ENC_CTL DDRB
#define ENC_WR PORTB
#define ENC_RD PINB
volatile uint16_t counter=0;
int ENC_SW = 14;

/* LCDMenuLib_element(id, prev_layer_element, new_element_num, lang_string, callback_function) */
LCDMenuLib_add(0  , root         , 1  , "Humidity"           , FUNC_information);
LCDMenuLib_add(1  , root         , 2  , "Temp. AIR"          , FUNC_p2);
LCDMenuLib_add(2  , root         , 3  , "Temp. BED"          , FUNC);
LCDMenuLib_add(3  , root         , 4  , "Fan Speed"          , FUNC);
LCDMenuLib_add(4  , root         , 5  , "Configuration"      , FUNC);
LCDMenuLib_add(5  , root_5       , 1  , "Set PID BED"        , FUNC);
LCDMenuLib_add(6  , root_5_1     , 1  , "Set PID BED"        , FUNC);
LCDMenuLib_add(7  , root_5_1     , 2  , "KP"                 , FUNC);
LCDMenuLib_add(8  , root_5_1     , 3  , "KI"                 , FUNC);
LCDMenuLib_add(9  , root_5_1     , 4  , "KD"                 , FUNC);
LCDMenuLib_add(10 , root_5_1     , 5  , "Back"               , FUNC_back);
LCDMenuLib_add(11 , root_5       , 2  , "Set PID Humidity"   , FUNC);
LCDMenuLib_add(12 , root_5_2     , 1  , "Set PID Humidity"   , FUNC);
LCDMenuLib_add(13 , root_5_2     , 2  , "KP"                 , FUNC);
LCDMenuLib_add(14 , root_5_2     , 3  , "KI"                 , FUNC);
LCDMenuLib_add(15 , root_5_2     , 4  , "KD"                 , FUNC);
LCDMenuLib_add(16 , root_5_2     , 5  , "Back"               , FUNC_back);
LCDMenuLib_add(17 , root_5       , 3  , "Sampling Interval"  , FUNC);//Fonction Réglage intervalle sauvegarde donné sur SD
LCDMenuLib_add(18 , root_5       , 4  , "Set CLOCK"          , FUNC);//Fonction Réglage Heure
LCDMenuLib_add(19 , root_5       , 5  , "Back"               , FUNC_back);
LCDMenuLib_createMenu(_LCDMenuLib_cnt);


void setup()
{    
LCDMenuLib_setup(_LCDMenuLib_cnt);  
PCMSK0 |= (( 1<<PCINT0 )|( 1<<PCINT1 ));
PCICR |= ( 1<<PCIE0 );
PCMSK1 |= ( 1<<PCINT8 );
PCICR |= ( 1<<PCIE1 );  
dht.begin();
}

void loop()
{  
  int Temperature = dht.readHumidity();
  LCDMenuLib_loop();
}


ISR(PCINT0_vect)
{
static uint8_t old_AB = 3;
uint8_t encport;
uint8_t direction;
static const int8_t enc_states [] PROGMEM = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
old_AB <<=2;
encport = ENC_RD & 0x03;
old_AB |= encport;
direction = pgm_read_byte(&(enc_states[( old_AB & 0x0f )]));
if( direction && ( encport == 3 )) {
  if( direction == 1 ) {
    LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);
    }else{
    LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); }
  }
}

ISR (PCINT1_vect)
{
 if(digitalRead(ENC_SW)== LOW) {
    LCDML.Button_enter();
   }
}


And here the Loop to display some info in the Menu first layer, and doesn't work

Code: [Select]
void loop()
{  
  int Humidity = dht.readHumidity();
  int Temp_DHT = dht.readTemperature();
  LCDMenuLib_loop();
  if(LCDML.getLayer() == 0){
  lcd.setCursor(15,0);
  lcd.print(Humidity);
  lcd.setCursor(15,1);
  lcd.print(Temp_DHT);
  }
}


PS Sorry My very very bad english, and for my total ignorance of the German language (and maybe about arduino ^^)
By the way, Thank for your answer (if you understand me....)

++
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jortox on Nov 24, 2014, 08:48 am
Danke erstml fur die gute Lib ;)

ich wollte mein Menu mit einem Clickencoder steuern und habe einiges versucht da ich aber ein Anfänger bin weis ich nicht richtig was ich eigenlich mache.

Bin jetzt diesen Tread schon zwei mal durch gegangen hab aber nichts gefunde oder ubersehen.

Wäre dankbar uber ein kleine Erklärung wie ich es hinbekomme.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Nov 24, 2014, 07:22 pm
Hi,
was ist denn ein Clickencoder ?
Ich hab so ein Ding bzw den Namen noch nie gehört. Welche Funktionen hat der Encoder ? Hast du einen Link parat ?

Welche Menüfunktionen willst du genau steuern ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Serenifly on Nov 24, 2014, 07:24 pm
Wohl ein Drehgeber/Inkrementalgeber mit eingebautem Taster.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jortox on Nov 24, 2014, 08:06 pm
Ja das ist ein Drehgeber(Inkrementalgeber) mit eingebautem Knopf


Edit:
Also ich möchte einfach das wen man den Drehgeber nach links bzw. rechts dreh das im Display der "courser " nach oben bzw. unten geht und dann noch ein Enterbutton
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Djam on Nov 26, 2014, 07:19 pm
Hi Jortox, if you want an encoder with this menu, take this code:

Encoder Wiring :

(https://ccrma.stanford.edu/workshops/2006/PID/sensors/encoder_filter.png)

Phase A to pin 8 (ENC CW)
Phase B to pin 9 (ENC CCW)

For Switch, just pullpup Resitor and Pin A0 Aka 14 (ENC SW)

Header

Code: [Select]
#define ENC_CTL DDRB
#define ENC_WR PORTB
#define ENC_RD PINB
int ENC_SW = 14;


Void Setup:

Code: [Select]
PCMSK0 |= (( 1<<PCINT0 )|( 1<<PCINT1 ));
PCICR |= ( 1<<PCIE0 );
PCMSK1 |= ( 1<<PCINT8 );
PCICR |= ( 1<<PCIE1 ); 


And paste  in your code:

Code: [Select]
ISR(PCINT0_vect)
{
static uint8_t old_AB = 3;
uint8_t encport;
uint8_t direction;
static const int8_t enc_states [] PROGMEM = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
old_AB <<=2;
encport = ENC_RD & 0x03;
old_AB |= encport;
direction = pgm_read_byte(&(enc_states[( old_AB & 0x0f )]));
if( direction && ( encport == 3 )) {
  if( direction == 1 ) {
    LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);
    }else{
    LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); }
  }
}

ISR (PCINT1_vect)
{
 if(digitalRead(ENC_SW)== LOW) {
    LCDML.Button_enter();
   }
}


Don't use (or comment) this in the Loop Void :

  //LCDMenuLib_control_analog();      /* lcd menu control - config in tab "LCDML_control" */
  //LCDMenuLib_control_digital();     /* lcd menu control - config in tab "LCDML_control" */


Work very well with this Librarie.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jortox on Nov 27, 2014, 07:52 pm
ich habe das mit dem Encoder hinbekommen - bin noch mal alle posts durchgegangen :)

mein Problem ist jetzt das mit dem "zurueck" nicht funktioniert :(

habe den Code vom Tread genommen und alles so gemacht wie beschrieben gedoch wechselt er nicht zuruck sondern bleibt auf dem Nivo.


Code: [Select]
#define _LCDMenuLib_cfg_press_time       1000    /* button press time in ms */

Code: [Select]
LCDMenuLib_add(4  , root_3       , 2  , "zurueck"            , FUNC_back);


Code: [Select]
void FUNC_back(void)
{         
  LCDML.FuncInit();            /* setup function */
  LCDML.Button_quit();         /* quit button */   
  LCDML.FuncEnd(1,0,0,0,0,0);  /* direct func end */
}


habe ich irgend was vergessen?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trainer81 on Dec 11, 2014, 02:01 pm
Hallo Jomelo,

ich bin dabei eine Aquarium LED Steuerung zu bauen und bin dabei auf deine LCDMenuLib gestossen.
Ein ganz großes danke von mir für diese echt gelungene Libary!!!
Werde dies gut speichern und auch in anderen Projekten verwenden...
Jetzt habe ich aber mal eine Frage.
Ich habe bereits über die Funktion "LCDML.goRoot(); // first go to root-level      LCDMenuLib_jumpToFunc(Func...); //...then jump to Func... gelesen. Bekomme es aber leider nicht hin aus dem IntScreen eine Funktion aufzurufen die so "LCDMenuLib_add(32 , root_3_3     , 3  , "Funkzeit holen"     , FUNC_funkZeitHolen);" im Menü eingebunden ist. Kannst Du mir vieleicht auf die sprünge helfen?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: jtree on Dec 17, 2014, 11:22 am
Hallo Jamelo,

ich sitze gerade an einem Projekt bei welchem das Display DOGM204 über I2C (Adresse 0x3D) angesteuert werden soll.
Dazu habe ich mir deine Bibilothek LCDMenuLib v1.0.1 (https://github.com/Jomelo/LCDMenuLib/releases/tag/v1_01) gezogen und eingebunden. Das Beispiel "lcdml" lässt sich ohne Fehler kompilieren.
Um I2C nutzen zu können, habe ich dann die Bib LiquidCrystal New 1.2.1 (https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads) eingebunden und in der Datei "LCDMenuLib___config.h" _LCDMenuLib_cfg_lcd_type 10 definiert.
Will ich dann das Beispiel "lcdml_i2c" kompilieren, kommt die Fehlermeldung
Code: [Select]
LCDMenuLib_createMenu(_LCDMenuLib_cnt);

no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C(int)'
candidates are: LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, uint8_t)
LiquidCrystal_I2C::LiquidCrystal_I2C(const LiquidCrystal_I2C&)


Ich kann mir diesen Fehler nicht erklären, da ich bis auf die o.g. Änderung in ...config.h noch nichts geändert habe. Definieren der Display-Adresse in ...config.h behebt die Fehlermeldung leider auch nicht.

Weitere evtl. notwendige Infos zu meinem System:
- Win8
- Arduino Software 1.0.6
- Arduino Board Uno SMD R2
- Anschluss des Displays an A4/SDA, A5/SCLK, GND, VCC (grundsätzliche I2C-Kommunikation mit dem Display mit selbstgeschriebenen Funktionen bereits möglich)


Gruß
jtree

___________________________________________________________

edit: Hab den Fehler jetzt doch noch selber finden können. Ursache: Headerfiles im Library-Ordner mit gleichem Namen machen offensichtlich Mist  :D

 
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 19, 2014, 02:25 pm
So, ich hoffe dass ich nun wieder Email vom Forum erhalte, sobald hier etwas geschrieben wird, in letzter Zeit ist da einiges untergegangen.

@Jortox
Ich schau mir das mal in Ruhe an bis Sonntag, ich hab dir auch eine Private Nachricht hinterlassen

@Trainer81
Ich schau mir das auch mal an. Ich hab noch nie getestet ob das auch aus dem Initscreen funktioniert.

@jtree
Probier mal die Versio:  https://github.com/Jomelo/LCDMenuLib/releases/tag/v1_03   zu verwenden und zu übersetzen. Die Fehlermeldung sagt mir so nichts, aber ich schau mal ob ich mit der Version 1.06 der Arduino Umgebung ähnliche Fehler erhalte.

In den laufenden Tagen werde ich die Lib auch in Details auf dem Teensy 3.1 Board teste, da ich dieses in meinem nächsten Projekt benötige, falls da noch Fehler auffallen werde ich diese alle in der nächsten Version beheben. 
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jules9285 on Dec 30, 2014, 03:56 pm
Hallo Jomelo,

Ich bekomme eine ähnliche Fehlermeldung wie jtree  Wenn ich den Beispielskelch lcdml_i2C kompilieren will


Code: [Select]



lcdml_i2c:67: error: no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C(int)'
/Users/Julian/Documents/Arduino/libraries/LiquidCrystal_I2C2004V1/LiquidCrystal_I2C.h:57: note: candidates are: LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, uint8_t)
/Users/Julian/Documents/Arduino/libraries/LiquidCrystal_I2C2004V1/LiquidCrystal_I2C.h:55: note:                 LiquidCrystal_I2C::LiquidCrystal_I2C(const LiquidCrystal_I2C&)







Wenn ich die Liquid Crystal lib. benutze, die du zum download anbietest, funktioniert das kompilieren. nur leider zeigt dann mein display nichts an außer Zeile 0 und 2 schwarz und Zeile 1 und 3 blank.

Wenn ich mit dieser lib. versuche bisherige Sketche laufen zu lassen ist es das selbe, oder sie lassen sich nicht kompilieren.

Wenn ich die Lib die es hier gibt nutze: https://github.com/zhaojinghua/Arduino/tree/master/libraries, funktioniert mein Display mit andern gebauten Sketchen, aber nicht mehr mit deinem.


Hast du eine Idee, wie ich dieses Problem lösen kann?

Vielen Dank im Voraus für die Unterstützung!

FG

Jules
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Dec 30, 2014, 08:23 pm
Ich schau mir das am Wochenende nach Silvester mal genau an. Hab gerade den Weihnachtsstress überstanden und bereite mich auf das nächste Jahr vor ;-)

Die Lib die du genannt hast, kann ich auch als ersatz für die andere I2C Lib einsetzen, wenn diese dann bei allen läuft, oder ich erstell eine I2C Varainte 2 Version, mal schauen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jules9285 on Dec 30, 2014, 08:28 pm
Super, vielen Dank und guten Rutsch!

Gruß Jules
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Trainer81 on Jan 04, 2015, 10:46 pm
Hallo nochmal Jomelo,

hast Du schon etwas testen können wegen der LCDMenuLib_jumpToFunc(Func...);  Funktion aus dem Intscreen heraus?
Gibt es denn irgend eine Möglichkeit die geschriebenen Funktionen aus dem Intscreen oder dem Loop zu starten?
Ich kriege es leider nicht hin...

Gruß Trainer
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: DEAFBOY on Jan 08, 2015, 03:39 pm
Ich kriege Fehlermeldung  :smiley-confuse:

(http://abload.de/thumb/arduinofehlermeldungwiuk4.jpg) (http://abload.de/image.php?img=arduinofehlermeldungwiuk4.jpg)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jan 08, 2015, 05:53 pm
Ich hab im Moment wenig zeit bisher bin ich zu nichts gekommen. Ich hoffe ich schaffe am Wochenende was, wobei ich nur Sonntag zuhause bin.
Im Studium nimmt man sich vor: "Wenn man erstmal am arbeiten ist, hat man mehr Zeit vor allen an den Wochenenden." Nun bin ich am arbeiten und denke immer: "Wo hast du früher nur die Zeit hergenommen"  :smiley-roll-sweat:

Ich setz mich dran, sobald ich ich bisschen Zeit finde

@DEAFBOY
Die Fehlermeldung hatte ich so noch nie, sind das die ganzen Fehler bzw wie lautet der erste Fehler ?
Hast du noch andere Libs eingebunden bzw etwas an der Lib verändert ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: computerzoo on Feb 08, 2015, 11:35 pm
Hallo,
ich habe auch kleine Probleme, um eine Funktion direkt aufzurufen:
Anbei ein Auszug aus der Init der LCDMenuLib:
Code: [Select]

#define _LCDMenuLib_cnt                32  // menu element count - last element id
LCDMenuLib_init(_LCDMenuLib_cnt);          // init lcdmenulib
LCDMenuLib_add(0 , root     , 1, "Fire"                          ,FUNC_Fire);
LCDMenuLib_add(1 , root     , 2, "SoftTwinkles"                  ,FUNC_SoftTwinkles);
LCDMenuLib_add(2 , root     , 3, "Confetti"                      ,FUNC_Confetti);
LCDMenuLib_add(3 , root     , 4, "Dots"                         ,FUNC_Dots);
LCDMenuLib_add(4 , root     , 5, "Statisch"                     ,FUNC_Statisch);
LCDMenuLib_add(5 , root     , 6, "Plasma"                       ,FUNC_Plasma);
......
LCDMenuLib_add(28, root_10_7 , 1, "LED-Strip 1"                  ,FUNC);
LCDMenuLib_add(29, root_10_7 , 2, "LED-Strip 2"                  ,FUNC);
LCDMenuLib_add(30, root_10_7 , 3, "LED-Strip 3"                  ,FUNC);
LCDMenuLib_add(31, root_10_7 , 4, "\x07" "zur" "\xF5" "ck"       ,FUNC_back);              // zurück aus LED Einstellung
LCDMenuLib_add(32, root_10   , 8, "\x07" "zur" "\xF5" "ck"       ,FUNC_back);              // zurück aus Setup
LCDMenuLib_createMenu(_LCDMenuLib_cnt);


Wenn ich nun z.B. mit:
Quote
LCDMenuLib_jumpToFunc(FUNC_Confetti);
oder:
Quote
LCDML.jumpToElement(2);
die FUNC_Confetti direkt aufrufen will, dann springt er jeweils in eine Funktion später im Menu; in diesem Fall FUNC_Dots.
Jetzt habe ich gedacht, dass es reicht in der LCDMenuLib_makros.h in der Funktion
Code: [Select]
/* ************************************************ */
/* LCDMenuLib_jumpToFunc */
/* ************************************************ */
#define LCDMenuLib_jumpToFunc(name)\
for(uint8_t i=0; i<=255;i++) {\
if(name == g_LCDMenuLib_functions[i]) {\
LCDML.jumpToElement(i);\
break;\
}\
}\
return;

einfach LCDML.jumpToElement(i-1); abzuändern, allerdings funktioniert dann nur der direkte Aufruf mit LCDML.jumpToElement problemlos.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: speechbubble21 on Feb 16, 2015, 03:32 pm
Hallo
ich arbeite gerade an einem Projekt, bei dem ich auch ein LCD mit einem Menü brauche.
Allerdings arbeote ich mit einem Raspberry Pi und Pyhthon.
Gibt es eine Möglichkeit die Library in Python zu nutzen?
Meine Python Version ist (2.7.3)
Sollte das nicht gehen, kennt vielleicht jemand eine gute lib für Python?

LG Andi
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 21, 2015, 05:14 pm
@speechbubble21
Moin, ich hab bisher noch kein Display an mein Raspberry Pi angeschlossen. Mit Python kenne ich mich gut aus. Dort sollte es doch auch einfach möglich sein aus einem Array so ein Menü zu erstellen.

@computerzoo
Ich glaube da ist noch ein Bug vorhanden der durch die Umstellung der Funktion  "LCDMenuLib_add(...)" entstanden ist. Ich überprüfe das morgen mal. Normalerweise wird die "-1" bei der Jump Funktion nicht benötigt. Bzw früher lief es mal.

@DEAFBOY
Ich werde das auch morgen mal testen, vor allem mit der neuen Version 1.6.0. Bisher habe ich alles noch mit 1.0.5 getestet gehabt.


Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HotSystems on Feb 21, 2015, 11:27 pm
Moin,

ich bin durch Zufall auf dieses super Menü gestoßen und wollte das natürlich gleich testen. Leider kommt schon beim Kompilieren eine Fehlermeldung.
Diese kann ich jedoch nicht einordnen da Arduino-Newcomer. Ich hoffe, mir kann jemand einen Tipp geben.

Die Libraries habe ich nach Anleitung "installiert".
Ich setze Arduino 1.0.6 auf Windows 7 mit einem UNO ein.

Nachfolgender Fehler wird gemeldet:

lcdml_i2c.ino:49: warning: only initialized variables can be placed into program memory area
lcdml_i2c.ino:50: warning: only initialized variables can be placed into program memory area
bis
lcdml_i2c.ino:67: warning: only initialized variables can be placed into program memory area
lcdml_i2c:67: error: '_LCDMenuLib_LCD_rs' was not declared in this scope
lcdml_i2c:67: error: '_LCDMenuLib_LCD_e' was not declared in this scope
lcdml_i2c:67: error: '_LCDMenuLib_LCD_dat0' was not declared in this scope
lcdml_i2c:67: error: '_LCDMenuLib_LCD_dat1' was not declared in this scope
lcdml_i2c:67: error: '_LCDMenuLib_LCD_dat2' was not declared in this scope
lcdml_i2c:67: error: '_LCDMenuLib_LCD_dat3' was not declared in this scope
LCDML_function.ino: In function 'void FUNC_init_screen()':
LCDML_function.ino:13: warning: only initialized variables can be placed into program memory area
LCDML_function.ino: In function 'void FUNC_information()':
LCDML_function.ino:42: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:44: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:46: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:48: warning: only initialized variables can be placed into program memory area
LCDML_function.ino: In function 'void FUNC_timer_info()':
LCDML_function.ino:83: warning: only initialized variables can be placed into program memory area
LCDML_function.ino: In function 'void FUNC_p2()':
LCDML_function.ino:124: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:126: warning: only initialized variables can be placed into program memory area

Diverse andere Sketche (I2C-LCD-Display, I2C-RTC, I2C-Lux-Sensor usw.) laufen hier fehlerfrei. Daher kann ich mir diesen Fehler nicht erklären.

Danke für jede Hilfe.

Dieter
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 22, 2015, 12:56 am
Ich arbeite dran, die Fehler liegen an der Version 1.0.6 bzw 1.6.0. Ich denke dass ich morgen mehr sagen kann
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HotSystems on Feb 22, 2015, 10:52 am
Moin,

war wohl gestern "zu spät". Habe übersehen, das LCD zu definieren.
Jetzt ist es soweit ok und ich kann mit dem Testen loslegen.

Soweit sieht das Menü super aus, dafür schon mal vielen Dank.

Noch einen schönen Sonntag.

Gruß
Dieter
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 22, 2015, 03:10 pm
Moin,
so hab mir nun einiges mal angeschaut.


Die Fehler mit der "jumpToFUNC..." Funktion sind hier behoben:  https://github.com/Jomelo/LCDMenuLib/releases/tag/v1_04_beta

Mit der Arduino Version 1.6.0 kann die neue Beta 1_04  nur verwendet werden, wenn in der LCDMenuLib___config  die die Konstate mit dem Wert 2 einkommentiert wird. Dies liegt daran da die Entwickler bei der LiquidCrystal Lib  die Zeilen und Spalten in der definition getauscht haben. Ich schaue mal ob ich hier eine elegante Lösung finde, sodass die Abwärtskompatibilität erhalten bleibt.

Bei den I2C Varianten bin ich bisher noch nicht weiter, da die von mir zuletzt verwendete Libiray ab der Arduino Version 1.6.0 nicht mehr übersetzt wird.

Den Fehler den "DEAFBOY" gefunden hat, hab ich ebenfall behoben, hier wurde der (*FuncPtr) Zeiger doppelt angelegt.   



Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: hoppi on Feb 23, 2015, 03:48 pm
Guten Tag,

ich bin ebenfalls auf dieses Umfangreiche LCD-Menü gestoßen.
Leider lässt sich der Code nicht kompilieren. Es erscheinen immer folgende Fehlermeldungen:
Hinweis: Ich verwende ein I2C LCD-Display sowie die Arduino-Version 1.6.0

Über eure Hilfe würde ich mich als Anfänger  :smiley-roll-blue:  sehr freuen.
Danke im Vorraus



Fehlermeldung:


C:\Users\Arduino\libraries\LCDMenuLib\LCDMenuLib.cpp:560:9:
error: prototype for 'boolean LCDMenuLib::checkButtons()' does not match any in class 'LCDMenuLib'
boolean LCDMenuLib::checkButtons()
         ^
In file included from C:\Users\Arduino\libraries\LCDMenuLib\LCDMenuLib.cpp:58:0:
C:\Users\Patrick\Documents\Arduino\libraries\LCDMenuLib/LCDMenuLib.h:197:12:
error: candidate is: uint8_t LCDMenuLib::checkButtons()
    uint8_t checkButtons();
            ^
C:\Users\Arduino\libraries\LCDMenuLib\LCDMenuLib.cpp:744:9:
error: prototype for 'boolean LCDMenuLib::FuncInit()' does not match any in class 'LCDMenuLib'
 boolean LCDMenuLib::FuncInit(void)
         ^
In file included from C:\Users\Arduino\libraries\LCDMenuLib\LCDMenuLib.cpp:58:0:
C:\Users\Patrick\Documents\Arduino\libraries\LCDMenuLib/LCDMenuLib.h:187:13:
error: candidate is: uint8_t LCDMenuLib::FuncInit()
    uint8_t  FuncInit();
             ^
Fehler beim Kompilieren.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Serenifly on Feb 23, 2015, 04:55 pm
Das liegt daran dass boolean jetzt ein typedef für bool ist und nicht mehr für uint8_t. Dadurch ist das nicht mehr austauschbar.

Das hätte aber eigentlich immer schon so sein sollen. Keine Ahnung wieso man das jemals anders gemacht hat. Ist schließlich C++. Dass man da unsigned char nimmt stammt aus frühen C Zeiten und zieht einige Einschränkungen nach sich.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Feb 23, 2015, 06:23 pm
Moin, der Fehler ist bereit in der 1_04beta behoben.

Download 1_04 beta (https://github.com/Jomelo/LCDMenuLib/releases/tag/v1_04_beta)

Zu beachten gilt hier allerdings, dass in der LCDMenuLib___config.h die Definition "#define _LCDMenuLib_arduino_version 1" einkommentiert und die definition "#define _LCDMenuLib_arduino_version 0" auskommentiert werden muss.

Danach sollte die Lib auch problemlos mit der Version 1.6.0 mit dem 4Bit und 8Bit Modus laufen. I2C folgt in der nächsten Beta Version.

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: WernerSch on Mar 04, 2015, 07:10 am
Hallo

ich habe zwar noch nicht viel gemacht aber der test hat mich schon überzeugt. Da hast du ein super Job gemacht.
Gibt es dafür auch ne kleine Anleitung wo man sieht welche Befehle es gibt und was die machen?

Ich habe die Lib mit einem I2C Bus Display getestet.  Die LCDMenuLib___config habe ich angepasst. der Punkt
//#   define _LCDMenuLib_cfg_lcd_type   15   // I2C with e,rw,rs,dat4,dat5,dat6,dat7,backlight
funktioniert. Man muss nur die Pins entsprechend dem Board was man hat anpassen.

gruß
Werner
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: WernerSch on Mar 04, 2015, 09:25 am
Hallo

kann mir jemand kurz erklären wie das mit dem Initscreen funktioniert? Habe hier nichts so richtig gefunden.
Kann ich da für eine gewisse Zeit einen Begrüßungstext anzeigen lassen? Hat die Funktion einen betimmten Namen?

Gruß
Werner
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: VS14 on Mar 13, 2015, 12:07 pm
Hallo Jomelo

ich habe voriges Jahr deine Lib verwendet und es hat alles super funktioniert.
Nun bin ich an einem anderen Projekt aber ohne Display und wollte die Hilfsfunktion der Zeit verwenden ist das irgendwie möglich
Gruß
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Mar 13, 2015, 12:53 pm
Jap das geht, such hier im Forum mal nach "simpleThreads". Dort sind die Zeit Funktionen gesondert angelegt.Ich hab von der lib noch ne neuere Version, ich lade die gleich mal hoch, wenn ich zuhause bin. (Ca. 16 uhr)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: sterni on Mar 17, 2015, 02:57 am
Hallo Jomelo,

super Arbeit die du hier leistest - gefällt mir sehr gut dein Menü, genau das was ich für mein Projekt haben möchte :D

*** EDIT ***
Problem gelöst  - es lag and der Funktion mit callback.
Code: [Select]

  if(LCDML.FuncEnd(0, 1, 1, 1, 1, 1))  // (direct, enter, up, down, left, right)
  {
    // do something bevor this function is closed     
  } 


wusste nicht das hier der Loop unterbrochen wird ...
geändert in

Code: [Select]

if(LCDML.FuncEndQuitButton())
  {
    stepper1.stop();
  }

und bricht nun so ab wie ich mir das vorgestellt habe.

Jedoch hat sich jetzt eine neue Sache aufgetan.
Wenn ich das jetzt so verwenden möchte das ich überprüfe ob der Button gedrückt wird oder nicht - verfährt mein Stepper nicht direkt sondern wieder nur im Einzellschritt mit Pause.

Eventuell wieder ein Missverständnis von mir?

Code: [Select]

  // here you have to enter the loop code
  if(LCDML.checkButtons())
  {
    while(LCDMenuLib_checkButtonLeft())
    {
        stepper1.runSpeed();
    }
  }


LG
Sterni
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Mar 17, 2015, 07:08 pm
Hi,

jap ein Missverstäntniss.
Die Menü Funktion läuft bereits schon in der Schleife, du musst keine eigene Schleife erstellen.

Ich denke so sollte es laufen, anstatt "while" ein "if"

Code: [Select]

if(LCDMenuLib_checkButtonLeft())
    {
        stepper1.runSpeed();
    }
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: WernerSch on Mar 18, 2015, 09:04 pm
Hallo

also die Library ist wirklich klasse gemacht. Läuft auch bei mir mit einem 20 x 4 Display. Nur muss ich die Bedienung mit einem Encoder machen. Ich habe sehr aufmekrsam alles darüber hier gelesen. Nur kriege ich es nicht zum laufen bei mir. Giovanni85 hat da wohl viel gemacht meldet sich leider aber nicht. Gibt es eine lauffähige Version dafür?

Gruß
Werner
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Mar 19, 2015, 07:00 am
Ich hatte schon immer mal vor ein Beispiel hier für zu erstellen. Ich werde das mal morgen machen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: WernerSch on Mar 19, 2015, 07:31 am
Na das hört sich ja super an. Bin schon gespannt

Gruß
Werner
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Massimog on Mar 20, 2015, 12:29 am
i have a LCD display 40x4 but cant configure it with this library.This display have 2 enable pin, E1 and E2.How i can use E2 pin?

this LCD library supports 40x4 display with two enable pins
https://www.pjrc.com/teensy/arduino_libraries/LiquidCrystalFast_1.1.zip

with these changes works fine with 40x4 display

menu.ino
Code: [Select]

#define _LCDMenuLib_LCD_cols             40
#define _LCDMenuLib_LCD_rows            4
#define _LCDMenuLib_LCD_ee               7
#define _LCDMenuLib_LCD_rw               6    


LCDMenuLib___config.h
Code: [Select]

# define _LCDMenuLib_arduino_version 1 // for new arduino version like 1.6.0 or higher
# define _LCDMenuLib_cfg_lcd_type 8 // 4Bit with rw, con doppio enable pin


LCDMenuLib.h
Code: [Select]

# define _LCDMenuLib_cfg_max_string_length 40 // max string length witch can be display



LCDMenuLib_class.h
Code: [Select]

 //LCD type
# define _LCDML_lcd_type LiquidCrystalFast

 //LCD include
# include <LiquidCrystalFast.h>

# elif(_LCDMenuLib_cfg_lcd_type == 8) //4Bit rw con enable pin
# define _LCDML_lcd_obj LiquidCrystalFast lcd(_LCDMenuLib_LCD_rs, _LCDMenuLib_LCD_rw, _LCDMenuLib_LCD_e, _LCDMenuLib_LCD_ee, _LCDMenuLib_LCD_dat0, _LCDMenuLib_LCD_dat1, _LCDMenuLib_LCD_dat2, _LCDMenuLib_LCD_dat3);


(http://i58.tinypic.com/dfeis4.jpg)
(http://postimg.org/image/n707tyw45/)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: WernerSch on Mar 27, 2015, 06:40 pm
Ich hatte schon immer mal vor ein Beispiel hier für zu erstellen. Ich werde das mal morgen machen.
hast du schon was erreicht in Sachen Encoder?

Gruß
Werner
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: nanowii on Mar 29, 2015, 05:33 pm
Hallo Jomelo.
Erst mal vielen Dank für deine unermüdliche Arbeit. Ich möchte das Menü für ein kleines Projekt verwenden und habe noch ein paar Fragen.

Die Einstellung des LCD Typs und der Entwicklungsumgebung findet in der Datei LCDMenuLib___config.h statt. Wenn man jedoch verschiedene Projekte mit unterschiedlichen LCD Typen hat, müsste  man jedes Mal die Lib ändern. Ich habe das jetzt für mich so gelöst:

Code: [Select]

#ifdef _LCDMenuLib_cfg_lcd_type
    #undef _LCDMenuLib_cfg_lcd_type
    #define _LCDMenuLib_cfg_lcd_type 2
#endif
#ifdef _LCDMenuLib_arduino_version
    #undef _LCDMenuLib_arduino_version
    #define _LCDMenuLib_arduino_version 1
#endif


Ist das so gewollt?

In meiner Entwicklungsumgebung (Microsoft Visual Studio 2013 mit Visual Micro Plugin) gibt es noch ein paar Compiler Warnungen:

LCDMenuLib.cpp:In member function 'void LCDMenuLib::display()'
LCDMenuLib.cpp:478:32: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
LCDMenuLib.cpp:490:32: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
LCDMenuLib.cpp:In member function 'void LCDMenuLib::Button_quit(uint8_t)'
LCDMenuLib.cpp:710:76: warning: suggest parentheses around '&&' within '||' [-Wparentheses]

Vielleicht kannst du das in der nächsten Version noch beheben.

Ansonsten harmoniert das Menü bis jetzt ohne Probleme mit Kompass- und GPS-Abfragen in Verbindung mit TinyGPS, welche über eine Timer Lib gesteuert werden. Super Sache.
Gruß
nanowii
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Mar 30, 2015, 12:52 pm
In der Betaversion ist noch einiges nicht ganz sauber gelöst. Ich plane den InitScreen auszulagern, da dieser eigentlich nur Speicher frist. Durch externe Funktionen lässt sich das sauberer lösen.

Zum Encoder:
Im Anhang befindet sich ein Beispiel (Code / Schaltplan).

Der Schaltplan zeigt den Anschluss des Encoders an den Arduino mit und ohne interne Pullup Widerstände. Im Beispiel Code verwende ich den Aufbau mit internen Pullup Widerständen.

Durch das Wegfallen des "Back" Buttons hab ich das Menü so angepasst, dass es auf jeder Ebene einen "zurück" Punkt gibt. Mit diesem ist es möglich jede Ebene wieder zu verlassen. Auf der ersten Ebene gibt es auch einen "zurück" Punkt, mit dem der Initscreen aufgerufen werden kann.

Ich hoffe das Hilft euch erstmal weiter.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Mickle94 on Mar 30, 2015, 11:43 pm
Hallo Jomelo,
zuerst einmal möchte ich dir danken für das Projekt hier du hast mir nen Haufen arbeit gespart  :D
Ich habe dennoch eine  Frage zu Lib.

Hast du in diese Library eine Taster Entprellung schon implementiert.
Entschuldige wenn ich die Frage in den 36 Seiten Forum Post überlesen haben sollte.

Mit Freundlichem Gruß

Mickle94
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Mar 31, 2015, 12:06 am
Jup, iss es.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Mickle94 on Mar 31, 2015, 04:07 pm
Hallo Leute

Hab leider nen Problem beim in Betrieb nehmen beim Kompilen bekomme ich folgende Fehlermeldung.

Code: [Select]
Arduino: 1.6.1 (Windows 7), Platine: "Arduino Uno"

C:\Program Files (x86)\Arduino\libraries\LCDMenuLib\LCDMenuLib.cpp:560:9: error: prototype for 'boolean LCDMenuLib::checkButtons()' does not match any in class 'LCDMenuLib'

 boolean LCDMenuLib::checkButtons()

         ^

In file included from C:\Program Files (x86)\Arduino\libraries\LCDMenuLib\LCDMenuLib.cpp:58:0:

C:\Program Files (x86)\Arduino\libraries\LCDMenuLib/LCDMenuLib.h:197:12: error: candidate is: uint8_t LCDMenuLib::checkButtons()

    uint8_t checkButtons();

            ^

C:\Program Files (x86)\Arduino\libraries\LCDMenuLib\LCDMenuLib.cpp:744:9: error: prototype for 'boolean LCDMenuLib::FuncInit()' does not match any in class 'LCDMenuLib'

 boolean LCDMenuLib::FuncInit(void)

         ^

In file included from C:\Program Files (x86)\Arduino\libraries\LCDMenuLib\LCDMenuLib.cpp:58:0:

C:\Program Files (x86)\Arduino\libraries\LCDMenuLib/LCDMenuLib.h:187:13: error: candidate is: uint8_t LCDMenuLib::FuncInit()

    uint8_t  FuncInit();

             ^

Fehler beim Kompilieren.


Muss ich noch in der Lib weitere Einstellungen vornehmen?  
Benutze Einen Arduino UNO
und Arduino 1.6.1
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Mar 31, 2015, 04:47 pm
stell mal bitte in der lcdmenulib___config.h den ersten parameter auf 1. Da steht nen kommentar hinter, das dieser für die version 1.6.x ist.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Mickle94 on Mar 31, 2015, 05:05 pm
Ich finde in der LCDMenuLib___config.h keinen parameter dieser Art.

Code: [Select]
/************************************************************************/
/* */
/* LCDMenuLib */
/* */
/************************************************************************/
/* Autor: Nils Feldkämper */
/* Create: 03.02.2008 */
/* Edit: 23.02.2014 */
/************************************************************************/
/* License: all Free */
/************************************************************************/

/************************************************************************/
/* Description: */
/* With this library, you can create menus with layers on base on the   */
/* Nested-Set-Model. For every menu element can be create a function    */
/* to control the content. This function is called automatical from the */
/* library and runs in a loop, without blocking other programm parts.   */
/* */
/* Support:  -- englischen Link einfügen --                             */
/*                                                                      */
/************************************************************************/

/************************************************************************/
/* Description (german): */
/* Mit der Lib können LCD Menüs über mehrere Ebenen mit Hilfe des    */
/* Nested Set Models generiert werden. Jeder Menüpunkt kann mit einer   */
/* Funktion hinterlegt werden die durch die Lib aufgerufen wird, sobald */
/* der Menüpunkt aktiviert wird. */
/* */
/* Support (german): http://forum.arduino.cc/index.php?topic=73816.0 */
/************************************************************************/

/************************************************************************/
/* Features: */
/* - max 254 menu elements */
/* - max 254 menu elements per layer     */
/* - max 6 layers from root, configurable in LCDMenuLib.h */
/* - max support for 6 buttons up, down, left, right, back/quit, enter  */
/* - min 3 buttons needed up, down, enter                               */
/* - separation of structural and functional level                      */
/* - support for initscreen which is shown after x secounds or at begin */
/* - scrollbar when more menu elments in a layer then rows              */
/* - last cursor pos is saved */
/* - possibility to jump from one menu elment directly to another       */
/* - support for many different lcd librarys in LCDMenuLib___config.h   */
/* - 4bit lcd support */
/* - 8bit lcd support */
/* - i2c lcd support */
/* - shift register lcd support */
/* - DogLcd support */
/* */
/* - many small function for other things */
/* */
/* - no support for gaphic displays yet */
/************************************************************************/
#ifndef LCDMenuLib___config_h
# define LCDMenuLib___config_h
//
// ====================================================================================================
// 0:10  LiquidCrystal (orginal) or LiquidCrystal_new Version 1.2.1 (normal)
// ====================================================================================================
# define _LCDMenuLib_cfg_lcd_type 0 // 4Bit (tested)
//# define _LCDMenuLib_cfg_lcd_type 1 // 4Bit with rw (tested)
//# define _LCDMenuLib_cfg_lcd_type 2 // 4Bit with backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 3 // 4Bit with rw,backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 4 // 8Bit (tested)
//# define _LCDMenuLib_cfg_lcd_type 5 // 8Bit with rw (tested)
//# define _LCDMenuLib_cfg_lcd_type 6 // 8Bit with backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 7 // 8Bit with rw,backlight (tested)

// ====================================================================================================
// 10:20  LiquidCrystal_I2C from LiquidCrystal_new Version 1.2.1 (I2C)
// ====================================================================================================
//# define _LCDMenuLib_cfg_lcd_type 10 // I2C (tested)
//# define _LCDMenuLib_cfg_lcd_type 11 // I2C with backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 12 // I2C with e,rw,rs
//# define _LCDMenuLib_cfg_lcd_type 13 // I2C with e,rw,rs,backlight
//# define _LCDMenuLib_cfg_lcd_type 14 // I2C with e,rw,rs,dat4,dat5,dat6,dat7
//# define _LCDMenuLib_cfg_lcd_type 15 // I2C with e,rw,rs,dat4,dat5,dat6,dat7,backlight

// ====================================================================================================
// 20:30 LiquidCrystal_SR from LiquidCrystal_new Version 1.2.1 (ShiftRegister)
// ====================================================================================================
//# define _LCDMenuLib_cfg_lcd_type 20 // SR

// ====================================================================================================
// 30:40 LiquidCrystal_SR from LiquidCrystal_new Version 1.2.1 (ShiftRegister 2W)
// ====================================================================================================
//# define _LCDMenuLib_cfg_lcd_type 30 // SR2W

// ====================================================================================================
// 40:50 LiquidCrystal_SR from LiquidCrystal_new Version 1.2.1 (ShiftRegister 3W)
// ====================================================================================================
//# define _LCDMenuLib_cfg_lcd_type 40 // SR3W (tested)
//# define _LCDMenuLib_cfg_lcd_type 41 // SR3W with backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 42 // SR3W with control lines (tested)
//# define _LCDMenuLib_cfg_lcd_type 43 // SR3W with control lines, backlight (tested)

// ====================================================================================================
// 100:110 DogLcd
// ====================================================================================================
//#define _LCDMenuLib_cfg_lcd_type 100


#endif


Danke Für deine Hilfe :)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Mickle94 on Mar 31, 2015, 06:00 pm
Hallo Jomelo,
Problem erstmal behoben
hatte nicht gesehen das Arduino 1.6 nur mit der Btea funktioniert.

Thanks :)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: WernerSch on Mar 31, 2015, 07:39 pm
Zum Encoder:
Im Anhang befindet sich ein Beispiel (Code / Schaltplan).

Der Schaltplan zeigt den Anschluss des Encoders an den Arduino mit und ohne interne Pullup Widerstände. Im Beispiel Code verwende ich den Aufbau mit internen Pullup Widerständen.

Durch das Wegfallen des "Back" Buttons hab ich das Menü so angepasst, dass es auf jeder Ebene einen "zurück" Punkt gibt. Mit diesem ist es möglich jede Ebene wieder zu verlassen. Auf der ersten Ebene gibt es auch einen "zurück" Punkt, mit dem der Initscreen aufgerufen werden kann.

Ich hoffe das Hilft euch erstmal weiter.
[/quote]

Hallo

danke erst mal für die Hilfe. Das sieht schon sehr gut aus. Der Drucktaster wird anscheinend gut erkannt. Nur bei der Drehfunktion braucht er einige Impulse bis das Menue mal reagiert. Sind aber wohl immer eine unterschiedliche Anzahl von Impulsen. An was kann das noch liegen?

Gruß
Werner
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Mar 31, 2015, 08:21 pm
Bei der Encoder Funktion gibt es eine Zeit die im Moment auf 20ms steht, das ist wohl deutlich zu langsam, setzt die Zeit mal auf 5 ms. Beim Testen habe ich meinen Encoder immer langsam gedreht  8)

20ms => 50 Hz
5ms => 200 Hz

Code: [Select]

void LCDMenuLib_control_encoder()
{   
  if(LCDML.Timer(g_LCDMenuLib_press_time, 5)) {   // Zeit hier angepasst   
    unsigned char a = digitalRead(_LCDMenuLib_encoder_A);
    unsigned char b = digitalRead(_LCDMenuLib_encoder_B);
   
    if(!a && g_LCDMenuLib_encoder_A_prev) {
      if(!b) {
        LCDML.Button_up_down_left_right(_LCDMenuLib_button_up);
        g_LCDMenuLib_enc_cnt++;
      } else {
        LCDML.Button_up_down_left_right(_LCDMenuLib_button_down);
        g_LCDMenuLib_enc_cnt--;
      }
    }
    g_LCDMenuLib_encoder_A_prev = a;
  } 
  if(LCDML.Timer(g_LCDMenuLib_encoder_button, _LCDMenuLib_cfg_press_time)) {
    if(!digitalRead(_LCDMenuLib_encoder_T)) {
      LCDML.Button_enter();
    }
   }
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: WernerSch on Apr 02, 2015, 08:09 am
Bei der Encoder Funktion gibt es eine Zeit die im Moment auf 20ms steht, das ist wohl deutlich zu langsam, setzt die Zeit mal auf 5 ms. Beim Testen habe ich meinen Encoder immer langsam gedreht  8)

20ms => 50 Hz
5ms => 200 Hz

Code: [Select]



Mit langsam drehen hat bei mir nicht geholfen, aber die Frequenz umstellen. Das wars :-)
Machst hier wirklich einen tollen zuverlässigen Job.
Danke nochmal. Ich bin voll happy weil ich genau das habe was ich brauche

gruß
Werner
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Apr 09, 2015, 07:20 pm
Mit der 1.6.3 Version habe ich die Lib noch nicht getestet. Im Moment kommen einfach zu schnell neue Versionen heraus. Am WE werde ich mir das mal anschauen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: turnon on Apr 09, 2015, 10:07 pm
Hallo erst mal vielen Dank für deine Arbeit!  Echt Hammer Menü!

Ich habe ein Display von ElecFreaks  das LCD Key Shield V1.2
Das ist ein 1602 Display mit einen Encoder darauf das wäre einfach Mega mäßig wenn das auf meinem Display laufen würde! Ist dies prinzipiell möglich?
Und wo müssen die Anpassungen vorgenommen werden?

Schon mal vielen Dank im vor raus !

Gruß turnon
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HotSystems on Apr 18, 2015, 12:42 am
Hallo,

ich nutze jetzt schon seit einiger Zeit diese Super Lib, habe allerdings zwei "kleinere" Probleme damit.
(Arduino 1.0.6, Arduino UNO und Windows 7)

1. Beim kompilieren meiner angepassten Anwendung werden nachfolgende Fehlermeldungen gezeigt:

Komplett_Menu_V1_4b.ino:89: warning: only initialized variables can be placed into program memory area
Komplett_Menu_V1_4b.ino:90: warning: only initialized variables can be placed into program memory area
Komplett_Menu_V1_4b.ino:93: warning: only initialized variables can be placed into program memory area
Komplett_Menu_V1_4b.ino:94: warning: only initialized variables can be placed into program memory area
Komplett_Menu_V1_4b.ino:95: warning: only initialized variables can be placed into program memory area
Komplett_Menu_V1_4b.ino:116: warning: only initialized variables can be placed into program memory area
Komplett_Menu_V1_4b.ino:144: warning: only initialized variables can be placed into program memory area
LCDML_function.ino: In function 'void FUNC_information()':
LCDML_function.ino:43: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:45: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:47: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:49: warning: only initialized variables can be placed into program memory area
LCDML_function.ino: In function 'void FUNC_timer_info()':
LCDML_function.ino:81: warning: only initialized variables can be placed into program memory area
LCDML_function.ino: In function 'void FUNC_TimerCon()':
LCDML_function.ino:124: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:126: warning: only initialized variables can be placed into program memory area
LCDML_function.ino: In function 'void FUNC_p2()':
LCDML_function.ino:170: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:172: warning: only initialized variables can be placed into program memory area
LCDML_function.ino: In function 'void FUNC_ST_on()':
LCDML_function.ino:571: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:579: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:581: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:583: warning: only initialized variables can be placed into program memory area
LCDML_function.ino: In function 'void FUNC_Timer_Pos()':
LCDML_function.ino:627: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:629: warning: only initialized variables can be placed into program memory area
LCDML_function.ino:631: warning: only initialized variables can be placed into program memory area

Diese Meldungen werden angezeigt aber die Kompilierung läuft durch und es funktioniert danach im Arduino.

Ein weiteres Problem betrifft die Programmierung, bei der es an einer Stelle nicht so will, wie ich es möchte. :-) Mein Projekt ist eine Schaltuhr mit mehreren Schaltausgängen die wahlweise auf verschieden Ausgangsfunktionen gesetzt werden sollen. Derzeit sind es 8 Ausgänge mit Ein/Aus-Schaltzeiten, die aktuell in einem EEProm (hardcodiert) gespeichert werden. Die jeweiligen Schaltzyklen kann ich per Menü und Taster (analog) abrufen, in Variablen speichern und im LCD anzeigen sowie auch zum Schalten verwenden. Mein Problem hier ist, wie kann ich die jeweilige Variable (Stunden und Minuten) getrennt per Taster erhöhen bzw. verkleinern, um sie danach wieder im EEProm abzulegen.

Routine zum Verarbeiten und Anzeigen der Schaltzeiten.

Code: [Select]

void FUNC_SetTimer(void)
 {   
   /* --------- INIT ---------
   * Initialisierung dieser Funktion
    * wird nur einmal beim Start dieser Funktion ausgefuert
    * danach nur erneut, wenn die Menu Funktion verlassen wurde
    * wenn keine Variablen initialisiert werden müssen, kann diese
    * Funktion anstatt mit if(!LCDML.FuncInit()) ....     mit
    * LCDML.FuncInit();  aufgerufen werden     
    */   
   if(!LCDML.FuncInit()){
     /* Init Function */           
     lcd.setCursor(0,2);
     lcd.print("                    ");
     lcd.setCursor(0,0);       //Start at character 0 on line 0
     lcd.print("  <Timer  stellen>"); 
     
     ReadSwitchTime(1);        //Auslesen und anzeigen der 1. Schaltzeit
     g_button_value=1;
     }
     
   /* --------- LOOP ----------
   * Hier sollte der Code stehen der ständig neu geladen wird
    * z.B. eine Uhrzeit oder änliches.
    */   
   {
   if(LCDML.checkButtons()){
     if(LCDMenuLib_checkButtonUp()){
       LCDMenuLib_resetButtonUp();
       if (g_button_value < 8){
         g_button_value++;
         ReadSwitchTime(g_button_value);        //Auslesen und anzeigen der Schaltzeiten
       }
     }

     if(LCDMenuLib_checkButtonDown()){
       LCDMenuLib_resetButtonDown();
       if (g_button_value > 1){
         g_button_value--;
         ReadSwitchTime(g_button_value);        //Auslesen und anzeigen der Schaltzeiten
       }
     }
 
   /* --------- STOP  ---------     
    * LCDML.FuncEnd(direct, enter, up, down, left, right)
    * Falls in dieser Funktion keine Variablen zurückgesetzt werden
    * müssen, kann diese Funktion auch vereinfacht mit LCDML.FuncEnd(0, 1, 1, 1, 1, 1);
    * aufgerufen werden. Die Endbedingungen können durch 1 aktiviert oder 0 deaktiviert 
    * werden
    * Wenn alles 0 ist, hängt das gesammte Programm in dieser Funktion fest
    */
   if(LCDML.FuncEnd(0, 1, 0, 0, 0, 0))
   {
   /* Bei allen Parameter gilt bei '0': nichts machen.
     * Parameter 'direct':
     * Die Funktion wird direkt beendet ohne auf weitere Ereignisse zu warten
     * Parameter 'enter', 'up', 'down', 'left', 'right':
     *   Wenn z.B. 'enter' = 1 ist, muss einmal die Enter Taste gedrückt werden,
     *   damit die Funktion beendet wird.
     *   Wenn z.B. 'enter' = 2 ist, muss zweimal die Enter Taste gedrückt werden,
     *   damit die Funktion beendet wird.
     * Dieses gilt bei den anderen Buttons 'up', 'down', ... genauso.
     */
 
     /* Falls noch Variablen zurückgesetzt werden müssen, bevor diese Funktion
      * verlassen wird, kann dies in dieser If Schleife geschehen
      */
      g_button_value=0;
     }     
    }
  }
 }



Mit den Tastern Up/Down kann ich die 8 Schaltzeiten zur Anzeige bringen.

Hier werden die Variablen zusammen gesetzt.

Code: [Select]

void ReadSwitchTime(int _SetSw)
 {
 lcd.setCursor(0, 1);
 lcd.print("  T");
 lcd.print(_SetSw);
 lcd.print(": ");
 _SetSw--;    // = _SetSw - 1;
 printDigits(_Sstd1[_SetSw]);
 lcd.print(":");
 printDigits(_Smin1[_SetSw]);
 lcd.print(" - ");  
 printDigits(_Sstd2[_SetSw]);
 lcd.print(":");  
 printDigits(_Smin2[_SetSw]);
 lcd.print("  ");
 lcd.setCursor(0, 3);
 lcd.print("                    ");  
 }
 


Mit diesen Funktionen kann ich die Variablen auf und abzählen, funktioniert an anderer Stelle. Nur wo muss ich diese Funktion einbauen (und wie) damit ich die gewünschten Variablen (Std. und Min.) verändern kann?


Code: [Select]

   if(LCDMenuLib_checkButtonUp()){
     LCDMenuLib_resetButtonUp();
     lcd.setCursor(CuPos,2);
     lcd.print(_Zahl);
     _Zahl++;
     lcd.setCursor(CuPos,2);
     lcd.print(_Zahl);
   }

   if(LCDMenuLib_checkButtonDown()){
     LCDMenuLib_resetButtonDown();
     lcd.setCursor(CuPos,2);
     lcd.print(_Zahl);
     _Zahl--;
     lcd.setCursor(CuPos,2);
     lcd.print(_Zahl);
   }



In der ersten Funktion (FUNC_SetTimer) funktioniert es nicht, da ich die UP/Down-Tasten ja schon verwende. Ich hoffe, ihr könnt helfen. Vielen Dank schon mal.

Gruß
Dieter
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HotSystems on Apr 22, 2015, 03:42 pm
Hallo,

hat denn keiner hier eine Idee?
Da die meisten Fehler aus der Menü-Lib kommen, komme ich hier nicht weiter.

Ich bin für jede Hilfe dankbar.

Gruß
Dieter
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: michael_x on Apr 22, 2015, 04:39 pm
Quote
warning: only initialized variables can be placed into program memory area
...
Diese Meldungen werden angezeigt aber die Kompilierung läuft durch und es funktioniert danach im Arduino.
Ja, das ist so bei Arduino 1.0.6.


Dein anderes Problem verstehe ich wohl nicht:
Natürlich haben Buttons je nach Menü-Zustand andere Funktionen
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HotSystems on Apr 22, 2015, 05:27 pm
OK,

dann scheint es ja kein "echtes" Problem zu sein und ich warte bis das Menü auch mit "I2C" komplett fertig ist, um es dann in der Arduino 1.6x einzusetzen.

Was die Buttons betrifft, habe ich schon ein wenig weiter "gebastelt" und glaube es jetzt auch zur Funktion zu bekommen.
Da ich die Up/Down-Buttons in dieser Funktion mehrfach benötige, muss ich halt ein Flag setzen, damit er weiß, wo er rauf und runter zählen soll.

Vielen Dank nochmals für die Info.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Serenifly on Apr 22, 2015, 06:01 pm
Ist ja auch nur eine Warnung. Und die wird durch einen Bug in der antiken Version des avr gcc Compilers deiner IDE verursacht. Inzwischen hat man das aktualisiert.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HotSystems on Apr 22, 2015, 06:33 pm
Ja, prima und danke.

Dann hoffe ich, dass die Lib auch bald mit I2C "fertig" für die 1.6.x ist und ich umsteigen kann.

Evtl. kann ja Jomelo etwas zu dem Stand I2C und Arduino 1.6.x sagen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Apr 23, 2015, 02:22 pm
Moin,

in der Arduino Umgebung (1.6.x) hat sich wohl die Schnittstellen oder die Einbindung der Libs verändert, dadurch kann im Moment kein I2C verwendet werden. Der Ersteller der New LiquidCrystal Lib sucht gerade nach Lösungsmöglichkeiten die bei allen Versionen laufen.

Kennt ihr noch eine andere I2C Lib die mit den Arduino Versionen 1.6.x laufen ?

Es wird Anfang Mai oder vorher ein neues Update der LCDMenuLib geben.
Die Eckdaten sind:


 
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: computerzoo on Apr 26, 2015, 01:50 am
Klingt sehr interessant, freue mich auf die nächste Ausbaustufe.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: JohannesZ on May 05, 2015, 09:56 pm
Hallo erstmal, ich bin auch relativ neu in Sachen Arduino und versuche mich gerade an dem Menü allerdings bekomme ich immer eine Fehlermeldung beim Kompilieren und komme einfach nicht weiter... Vielleicht kann mir ja einer von Euch helfen.

Grüße

JohannesZ
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 06, 2015, 07:17 am
Welche arduino und lib version verwendest du?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: JohannesZ on May 06, 2015, 01:27 pm
Hallo, ich verwende den Arduino Mega 2560. Als lib nehme ich wie bei Punkt 5 beschrieben die lcdml.

Gruß
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Mickle94 on May 06, 2015, 01:59 pm
was  Jomelo,
Warscheinlich meinte ist welche Version du von Arduino hast also Arduino 1.6 oder welche version ?


Bei Arduino 1.6 musst du die 1_04 beta nutzen (diese Hat kein I²C derzeit)
Bei älteren Arduino Versionen kannst du 1.0.1 nutzen.


Gruß Mickle94
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: JohannesZ on May 06, 2015, 04:55 pm
Jap, das war es. Jetzt geht es... Vielen Dank! :)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Mickle94 on May 07, 2015, 08:07 pm
Hallo Jomelo,

ich habe heute versucht ein I²C Display in berieb zu nehmen.

Jetzt bekomme ich beim Kompilieren folgende Fehler.

Code: [Select]
lcdml_i2c.cpp:152:5: error: invalid preprocessing directive #pin
lcdml_i2c.cpp:153:5: error: invalid preprocessing directive #do



Ich benutze ein I²C display mit e,rw,rs,dat4,dat5,dat6,dat7,backlight
welche ich auch im Config eingestellt und im Programm definiert habe.

Mein Arduino läuft auf 1.0.1.


Als Programm nutze ich das I²C Beispiel.






Ich hoffe du kannst mir weiterhelfen.


Gruß
Mickle94
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 07, 2015, 10:29 pm
Ich stell immer Fragen, also:  8)
- Welche I2C Lib verwendest du?
- Kannst du dein Display mit der I2C Lib ohne die LCDML Lib in Betrieb nehmen?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Mickle94 on May 08, 2015, 12:50 pm
I2c Lib ist die im ersten Post beschriebene LiquidCrystal_V1.2.1

Ja mit dieser Lib kann ich das Display in betrieb nehmen.


Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 10, 2015, 02:06 pm
Hast du in der LCDMenuLib___config.h  die richtigen Einstellungen für I2C eingestellt?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: nicotin1602 on May 10, 2015, 10:16 pm
Habe das gleiche Problem! IDE: 1.0.1, LC_V1.2.1 habe die config geändert:
Code: [Select]
/************************************************************************/
/* */
/* LCDMenuLib */
/* */
/************************************************************************/
/* Autor: Nils Feldk‰mper */
/* Create: 03.02.2008 */
/* Edit: 23.02.2014 */
/************************************************************************/
/* License: all Free */
/************************************************************************/

/************************************************************************/
/* Description: */
/* With this library, you can create menus with layers on base on the   */
/* Nested-Set-Model. For every menu element can be create a function    */
/* to control the content. This function is called automatical from the */
/* library and runs in a loop, without blocking other programm parts.   */
/* */
/* Support:  -- englischen Link einf¸gen --                             */
/*                                                                      */
/************************************************************************/

/************************************************************************/
/* Description (german): */
/* Mit der Lib kˆnnen LCD Men¸s ¸ber mehrere Ebenen mit Hilfe des   */
/* Nested Set Models generiert werden. Jeder Men¸punkt kann mit einer   */
/* Funktion hinterlegt werden die durch die Lib aufgerufen wird, sobald */
/* der Men¸punkt aktiviert wird. */
/* */
/* Support (german): http://forum.arduino.cc/index.php?topic=73816.0 */
/************************************************************************/

/************************************************************************/
/* Features: */
/* - max 254 menu elements */
/* - max 254 menu elements per layer    */
/* - max 6 layers from root, configurable in LCDMenuLib.h */
/* - max support for 6 buttons up, down, left, right, back/quit, enter  */
/* - min 3 buttons needed up, down, enter                               */
/* - separation of structural and functional level                      */
/* - support for initscreen which is shown after x secounds or at begin */
/* - scrollbar when more menu elments in a layer then rows              */
/* - last cursor pos is saved */
/* - possibility to jump from one menu elment directly to another       */
/* - support for many different lcd librarys in LCDMenuLib___config.h   */
/* - 4bit lcd support */
/* - 8bit lcd support */
/* - i2c lcd support */
/* - shift register lcd support */
/* - DogLcd support */
/* */
/* - many small function for other things */
/* */
/* - no support for gaphic displays yet */
/************************************************************************/
#ifndef LCDMenuLib___config_h
# define LCDMenuLib___config_h
//
// ====================================================================================================
// 0:10  LiquidCrystal (orginal) or LiquidCrystal_new Version 1.2.1 (normal)
// ====================================================================================================
//# define _LCDMenuLib_cfg_lcd_type 0 // 4Bit (tested)
//# define _LCDMenuLib_cfg_lcd_type 1 // 4Bit with rw (tested)
//# define _LCDMenuLib_cfg_lcd_type 2 // 4Bit with backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 3 // 4Bit with rw,backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 4 // 8Bit (tested)
//# define _LCDMenuLib_cfg_lcd_type 5 // 8Bit with rw (tested)
//# define _LCDMenuLib_cfg_lcd_type 6 // 8Bit with backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 7 // 8Bit with rw,backlight (tested)

// ====================================================================================================
// 10:20  LiquidCrystal_I2C from LiquidCrystal_new Version 1.2.1 (I2C)
// ====================================================================================================
//# define _LCDMenuLib_cfg_lcd_type 10 // I2C (tested)
//# define _LCDMenuLib_cfg_lcd_type 11 // I2C with backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 12 // I2C with e,rw,rs
//# define _LCDMenuLib_cfg_lcd_type 13 // I2C with e,rw,rs,backlight
//# define _LCDMenuLib_cfg_lcd_type 14 // I2C with e,rw,rs,dat4,dat5,dat6,dat7
# define _LCDMenuLib_cfg_lcd_type 15 // I2C with e,rw,rs,dat4,dat5,dat6,dat7,backlight


// ====================================================================================================
// 20:30 LiquidCrystal_SR from LiquidCrystal_new Version 1.2.1 (ShiftRegister)
// ====================================================================================================
//# define _LCDMenuLib_cfg_lcd_type 20 // SR

// ====================================================================================================
// 30:40 LiquidCrystal_SR from LiquidCrystal_new Version 1.2.1 (ShiftRegister 2W)
// ====================================================================================================
//# define _LCDMenuLib_cfg_lcd_type 30 // SR2W

// ====================================================================================================
// 40:50 LiquidCrystal_SR from LiquidCrystal_new Version 1.2.1 (ShiftRegister 3W)
// ====================================================================================================
//# define _LCDMenuLib_cfg_lcd_type 40 // SR3W (tested)
//# define _LCDMenuLib_cfg_lcd_type 41 // SR3W with backlight (tested)
//# define _LCDMenuLib_cfg_lcd_type 42 // SR3W with control lines (tested)
//# define _LCDMenuLib_cfg_lcd_type 43 // SR3W with control lines, backlight (tested)

// ====================================================================================================
// 100:110 DogLcd
// ====================================================================================================
//#define _LCDMenuLib_cfg_lcd_type 100


#endif


bei mir meint er auch wenn ich Compile:

lcdml_i2c.cpp:152:5: error: invalid preprocessing directive #pin
lcdml_i2c.cpp:153:5: error: invalid preprocessing directive #do

verstehe nicht warum...

gruss Max
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: nicotin1602 on May 10, 2015, 10:37 pm
*EDIT*  Hab gerade auch die 1.5.1 ausprobiert... NADA... gleicher Fehler.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 11, 2015, 07:29 pm
@Mickle94 and @nicotin1602

Ich habs gerade mal mit der 1.0.1 versucht und es hat auf anhieb geklappt.

LCDMenuLib v1.3 
New LiquidCrystal V 1.2.1
Window 8.1 

Einstellungen in LCDMenuLib___confi.h
Zeile 63 auskommentieren und Zeile 80 einbinden.

I2C Beispiel laden; das Kommentar vor den Zeilen  _LCDMenuLib_LCD_e und folgenden entfernen und übersetzen.

Läuft.


Kennt ihr eine I2C Lib die ab Arduino Version 1.6.3 / 1.6.4 stabil läuft ? Ich such noch eine um diese in der nächsten Version des Menüs einzubinden.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Mickle94 on May 12, 2015, 01:38 pm
Super Danke Jomelo,

mit der Lib V1.3 funkioniert es.
Vileicht ist es gut wenn du den link im ersten post auf die v1.3 legst derzeit kommt man auf die Version 1.0.1.

Nein außer LiquidCrystal habe ich keine.

Gruß Mickle
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 12, 2015, 05:05 pm
Ich pass das nacher mal an. Ich hoffe das ich bald die nächste beta fertig habe, dann ändert sich die initialisierung und der funktionsaufbau. Des weiteren gibt es viele neue möglichkeiten.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: computerzoo on May 12, 2015, 07:14 pm
Gibt es eigentlich eine Möglichkeit, um abzufragen, ob man sich gerade im Menu (auch Submenus) oder einer im Menu aufgerufenen Funktion befindet?
Ich habe folgendes vor:
Wenn ich mich im Menu/Submenu befinde, dann möchte ich:
- mit der Links-Taste eine Ebene zurückspringen (Quit-Button)
- mit der Rechts-Taste einen Eintrag bestätigen (Enter-Button)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 12, 2015, 09:46 pm
Ja das geht und es wird noch einfacher mit der nächsten Version.
Aktuell:
Code: [Select]

if(LCDML.checkButtons())
  {
    if(LCDMenuLib_checkButtonLeft())
    {
       LCDML.FuncEnd(1, 0, 0, 0, 0, 0);
    }
    else if(LCDMenuLib_checkButtonRight()) {
       // Wert übernehmen dann Funktion beenden
       LCDML.FuncEnd(1, 0, 0, 0, 0, 0);
    }
  }

     
   
Mutige oder Interessierte können die folgende Version testen.

LCDML v2 (alpha) (https://github.com/Jomelo/LCDMenuLib/archive/master.zip)
Noch existierende Fehler:
- Bei versteckten Menüelementen existiert noch ein Fehler wenn das erste Element in einem Menü versteckt ist
- Drehencoder Beispiel funktioniert noch nicht perfekt


To Do:
- versteckte Menüelmente müssen bei allen Konstelationen funktionieren
- Drehcoder Beispiel
- Keywords für Syntaxhighlighting einfügen
- Doku (Durch die neuen Möglichkeiten muss ich hier noch einiges machen)
- viele Beispiele die Anwendungsmöglichkeiten darstellen
- Beispiele für die I2C Schnittstelle einfügen

Die alpha Version läuft mit Arduino 1.0.x  und 1.6.x.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: nicotin1602 on May 18, 2015, 05:51 pm
hey Jomelo... mit 1.3 funktioniert das Compiler unter 1.0.1.

Allerdings habe ich ein Problem bei der Steuerung über digitale knöpfe... sprich 8,9,10.... muss das ganze möglichst schnell zum laufen bekommen und bräuchte dringend Hilfe!

Grus Max;
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 18, 2015, 06:40 pm
Also wenn du nur sagst: "Ich habe Problem, brauche Hilfe", aber nicht nennst was konkret dein Problem ist bzw. welches Fehlverhalten auftritt, kann ich dir mit dieser Antwort nicht weiterhelfen, da du erst beschreiben musst was nicht läuft. Somit ist eine Antwort schon verschenkt.

Im raten bin ich nicht so gut.
Also beschreib dein Problem genauer.

OT: Wieso musst du es schnell zum laufen bekommen ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: nicotin1602 on May 18, 2015, 11:30 pm
Also: mein problem ist dass ich im code die digitale eingabe aktiviert habe und jumperkabel auf die entsprechenden pins gesteckt habe. wenn ich nun bspw das Kabel von pin 8 auf 5V halte wechselt das Menü ganz oft zwischen oberer und unterer ebene. bei hoch oder runter passiert garnix... wie verhext.

das Projekt wird die Steuerung für ein Messemodel (muss Samstag Laufen). Das Menü ist nur dazu da um Variablen und co einfach zu verstellen. also 2 Arduino... einer steuert spiel, der andere steuert variabeln und Led's.... muss noch schauen wie ich den wert des Potts abfrage, stabilisiere, Mappe und dann auf Knopfdruck per i2c rüberschicke. wenn du einen tipp oder code hättest wäre ich dir super dankbar!

gruss
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 19, 2015, 06:39 am
Klingt so, als hättest du die Pullup- oder Pulldown Widerstände an den Eingängen vergessen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: nicotin1602 on May 19, 2015, 01:55 pm
genauso sieht es für mich auch aua... aber welche? und was ist mit den internen?


gruss
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: sth77 on May 19, 2015, 02:02 pm
genauso sieht es für mich auch aua... aber welche? und was ist mit den internen?
Wer soll das beantworten können, was DU gebaut und programmiert hast?  :)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 19, 2015, 03:30 pm
wenn du pulldown widerstände verwendest (zwischen gnd und arduino eingang) dann kannst du die digital control funktion so nutzen. Wenn du externe pullup widerstände oder die internen verwendest ist deine button low aktive und du musst die funktion zur ansteuerung umschreiben.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pierrotm777 on May 19, 2015, 05:21 pm
Just tested the V2 beta 2 .
I have edited the example LCDML_example_1_easy and build an I2C version like that:
Code: [Select]
/* ============================================================ */
/*                                                              */
/* Example: LCD Menu with LiquidCrystal                         */
/*                                                              */
/* for Arduino 1.0.x and 1.6.x with orginal Liquid Crystal Lib  */
/* ============================================================ */

/* include libs */
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <LCDMenuLib.h>

/* settings for lcd */
#define _LCDML_DISP_cols             20
#define _LCDML_DISP_rows             4
#define _LCDML_DISP_addr             0x27


/* pin settings */
/* when you are using an i2c display please load the i2c example */
/* (on beta v2 it is coming soon, on stable v2 it is included */
#define _LCDML_DISP_e                2
#define _LCDML_DISP_rs               0
//#define _LCDML_DISP_dat0             4
//#define _LCDML_DISP_dat1             5
//#define _LCDML_DISP_dat2             6
//#define _LCDML_DISP_dat3             7

/* optional */
#define _LCDML_DISP_rw      1
#define _LCDML_DISP_backlight      3
#define _LCDML_DISP_backlight_pol     POSITIVE // NEGATIVE
/* 8 bit mode */
#define _LCDML_DISP_dat4          4
#define _LCDML_DISP_dat5          5
#define _LCDML_DISP_dat6          6
#define _LCDML_DISP_dat7          7



/* lib config */
#define _LCDML_DISP_cfg_button_press_time          200    /* button press time in ms */
#define _LCDML_DISP_cfg_scrollbar            1      /* 0 = no scrollbar, 1 = scrollbar with custom chars */
#define _LCDML_DISP_cfg_scrollbar_custom_redefine  0      /* 0 = nothing, 1 = redefine custom chars on scrolling */
#define _LCDML_DISP_cfg_lcd_standard            0      /* 0 = HD44780 standard / 1 = HD44780U standard */
#define _LCDML_DISP_cfg_initscreen                 1
#define _LCDML_DISP_cfg_initscreen_time            30000


/* ********************************************************************* */
/* LCDML CONTROL
/* ********************************************************************* */
#define _LCDML_DISP_cfg_control                2     /* 0=seriell, 1=analog, 2=digital, 3=encoder */


#if(_LCDML_DISP_cfg_control == 0)
#  define _LCDML_CONTROL_serial_enter           'e'
#  define _LCDML_CONTROL_serial_up              'w'
#  define _LCDML_CONTROL_serial_down            's'
#  define _LCDML_CONTROL_serial_left            'a'
#  define _LCDML_CONTROL_serial_right           'd'
#  define _LCDML_CONTROL_serial_quit            'q'
#endif

#if(_LCDML_DISP_cfg_control == 1)
#  define _LCDML_CONTROL_analog_pin              0
#  define _LCDML_CONTROL_analog_enter_min        850     // Button Enter
#  define _LCDML_CONTROL_analog_enter_max        920 
#  define _LCDML_CONTROL_analog_up_min           520     // Button Up
#  define _LCDML_CONTROL_analog_up_max           590   
#  define _LCDML_CONTROL_analog_down_min         700     // Button Down
#  define _LCDML_CONTROL_analog_down_max         770   
//optional if menu element "back" exists, look at FUNC_back in functions tab
#  define _LCDML_CONTROL_analog_enable_quit      1
#  define _LCDML_CONTROL_analog_back_min         950     // Button Back
#  define _LCDML_CONTROL_analog_back_max         1020   
//optional
#  define _LCDML_CONTROL_analog_enable_lr        1
#  define _LCDML_CONTROL_analog_left_min         430     // Button Left
#  define _LCDML_CONTROL_analog_left_max         500   
#  define _LCDML_CONTROL_analog_right_min        610     // Button Right
#  define _LCDML_CONTROL_analog_right_max        680
#endif

#if(_LCDML_DISP_cfg_control == 2)
#  define _LCDML_CONTROL_digital_enter           A0//8   
#  define _LCDML_CONTROL_digital_up              A2//9
#  define _LCDML_CONTROL_digital_down            A1//10
//optional
#  define _LCDML_CONTROL_digital_enable_quit     1
#  define _LCDML_CONTROL_digital_quit            11
//optional
#  define _LCDML_CONTROL_digital_enable_lr       1
#  define _LCDML_CONTROL_digital_left            12
#  define _LCDML_CONTROL_digital_right           13
#endif

#if(_LCDML_DISP_cfg_control == 3)
#  define _LCDML_CONTROL_encoder_pin_a           10   // pin encoder b
#  define _LCDML_CONTROL_encoder_pin_b           11   // pin encoder a
#  define _LCDML_CONTROL_encoder_pin_button      12   // pin taster
#  define _LCDML_CONTROL_encoder_high_active     0    // (0 = low active, 1 = high active) button
#  define _LCDML_CONTROL_encoder_time            20
#endif

/* create menu */
/* menu element count - last element id */
#define _LCDML_DISP_cnt    16


/* root           => layer 0 */
/* root_XX        => layer 1 */
/* root_XX_XX     => layer 2 */
/* root_XX_XX_XX  => layer 3 */
/* root_...   => layer ... */

/* init lcdmenulib */
LCDML_DISP_init(_LCDML_DISP_cnt);
/* LCDMenuLib_element(id, group, prev_layer_element, new_element_num, lang_char_array, callback_function) */
LCDML_DISP_add(0  , _LCDML_G1  , LCDML_root        , 1  , "Information"        , LCDML_FUNC_information);
LCDML_DISP_add(1  , _LCDML_G1  , LCDML_root        , 2  , "Time info"          , LCDML_FUNC_timer_info);
LCDML_DISP_add(2  , _LCDML_G1  , LCDML_root        , 3  , "Settings"           , LCDML_FUNC);
LCDML_DISP_add(3  , _LCDML_G1  , LCDML_root_3      , 1  , "Change value"       , LCDML_FUNC);
LCDML_DISP_add(4  , _LCDML_G1  , LCDML_root_3      , 2  , "Something"          , LCDML_FUNC);
LCDML_DISP_add(5  , _LCDML_G1  , LCDML_root_3      , 3  , "Back"               , LCDML_FUNC_back);
LCDML_DISP_add(6  , _LCDML_G1  , LCDML_root        , 4  , "Program"            , LCDML_FUNC);
LCDML_DISP_add(7  , _LCDML_G1  , LCDML_root_4      , 1  , "Program 1"          , LCDML_FUNC);
LCDML_DISP_add(8  , _LCDML_G1  , LCDML_root_4_1    , 1  , "P1 start"           , LCDML_FUNC);
LCDML_DISP_add(9  , _LCDML_G1  , LCDML_root_4_1    , 2  , "Settings"           , LCDML_FUNC);
LCDML_DISP_add(10 , _LCDML_G1  , LCDML_root_4_1_2  , 1  , "Warm"               , LCDML_FUNC);
LCDML_DISP_add(11 , _LCDML_G1  , LCDML_root_4_1_2  , 2  , "Long"               , LCDML_FUNC);
LCDML_DISP_add(12 , _LCDML_G1  , LCDML_root_4_1_2  , 3  , "Back"               , LCDML_FUNC_back);
LCDML_DISP_add(13 , _LCDML_G1  , LCDML_root_4_1    , 3  , "Back"               , LCDML_FUNC_back);
LCDML_DISP_add(14 , _LCDML_G1  , LCDML_root_4      , 2  , "Program 2"          , LCDML_FUNC_p2);
LCDML_DISP_add(15 , _LCDML_G1  , LCDML_root_4      , 3  , "Back"               , LCDML_FUNC_back);
LCDML_DISP_add(16 , _LCDML_G1  , LCDML_root        , 5  , "InitScreen"         , LCDML_FUNC_initscreen);
LCDML_DISP_createMenu(_LCDML_DISP_cnt);



/* define backend function */
/* to do:  add documentation and comments */
#define _LCDML_BACK_cnt    1  // last backend function id
LCDML_BACK_init(_LCDML_BACK_cnt);
LCDML_BACK_new_timebased_static  (0  , (20)       , _LCDML_start  , LCDML_BACKEND_control);
LCDML_BACK_new_timebased_dynamic (1  , (1000*60)  , _LCDML_stop   , LCDML_BACKEND_menu);
/* own backend function */


LCDML_BACK_create();


void setup()
{
  /* serial init; only be needed */
  Serial.begin(9600);   /* start serial */
 
  LCDML_DISP_groupEnable(_LCDML_G1); // display all buttons in group 1 
  LCDML_setup(_LCDML_BACK_cnt);   
}

void loop()

  LCDML_run(_LCDML_priority);
}


All is right !

Just one things!
We need allways to edit the LCDMenuLib___config.h and choose the good value for the variable:
#define _LCDMenuLib_cfg_lcd_type (i use 115 for my i2c).

A good option would be to define this option in externe like that:
#define _LCDML_DISP_lcdtype 115
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 19, 2015, 07:05 pm
@pierrotm777
I have trying many ways but it is not possible at the moment.
One way is to create many small classes for every connection (4bit / 8bit / i2c / dog / ...). But when i have to fix a bug i have to update all classes and thats for me to many time.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pierrotm777 on May 20, 2015, 10:17 am
@pierrotm777
I have trying many ways but it is not possible at the moment.
One way is to create many small classes for every connection (4bit / 8bit / i2c / dog / ...). But when i have to fix a bug i have to update all classes and thats for me to many time.
Ok Thanks . I try to adapt your new version to my project but it isn't so easy than your first version !
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pierrotm777 on May 20, 2015, 04:21 pm
Hello,

I play with your V2 beta 2 version and love it now !
I have build 3 functions and need littles helps!
This is my code:
Code: [Select]
/* ********************************************************************* */
void LCDML_DISP_setup(LCDML_ServosTest)
/* ********************************************************************* */
{
  // setup function
  lcd.clear();
  lcd.setCursor(2,0);
  lcd.print(F("!! Servo Test !!"));   
}
void LCDML_DISP_loop(LCDML_ServosTest)
{
  // loop function, can be run in a loop when LCDML_DISP_triggerMenu(xx) is set
  // the quit button works in every DISP function without any checks; it starts the loop_end function
  for(int pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees
  {                                  // in steps of 1 degree
    if (reverseServo1 == 0) {ServoMoteur1.write(pos);}else{ServoMoteur1.write((90*2)-pos);};               
    if (reverseServo2 == 0) {ServoMoteur2.write(pos);}else{ServoMoteur2.write((90*2)-pos);};
    //GlowMoteur1.write(pos);GlowMoteur2.write(pos);
    delay(5);                       // waits 20ms for refresh period
    SoftRcPulseOut::refresh();      // generates the servo pulse
  }
  for(int pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees
  { 
    if (reverseServo1 == 0) {ServoMoteur1.write(pos);}else{ServoMoteur1.write((90*2)-pos);};               
    if (reverseServo2 == 0) {ServoMoteur2.write(pos);}else{ServoMoteur2.write((90*2)-pos);};
    //GlowMoteur1.write(pos);GlowMoteur2.write(pos);   
    delay(5);                       // waits 20ms for for refresh period
    SoftRcPulseOut::refresh();      // generates the servo pulse
  }
 
  if(LCDML_BUTTON_checkAny()) { // check if any button is presed (enter, up, down, left, right)
    // LCDML_DISP_funcend calls the loop_end function
    LCDML_DISP_funcend();
  }
}
void LCDML_DISP_loop_end(LCDML_ServosTest)
{
  // this functions is ever called when a DISP function is quit
  // you can here reset some global vars or do nothing 
}


/* ********************************************************************* */
#define FILTER_ALP 0.1
double tempFilter;
unsigned long g_timer_1 = 0;    // timer variable (globale variable)
void LCDML_DISP_setup(LCDML_intTempExtVoltage)
/* ********************************************************************* */
{
  // setup function
  lcd.clear();
  intBarGraph_Characters();
  LCDML_DISP_triggerMenu(200); // starts a trigger event for the loop function every 100 millisecounds 
}
void LCDML_DISP_loop(LCDML_intTempExtVoltage)
{
  // loop function, can be run in a loop when LCDML_DISP_triggerMenu(xx) is set
  // the quit button works in every DISP function without any checks; it starts the loop_end function
  if((millis() - g_timer_1) >= 200)// this timer checks every 200 millisecounds if it is called
  {
    g_timer_1 = millis();   
    int temp = GetTemp();
    tempFilter = ( FILTER_ALP * temp) + (( 1.0 - FILTER_ALP ) * tempFilter);
    lcd.clear();
    lcd.print(F("Int. Temp:"));lcd.setCursor(11, 0);lcd.print(tempFilter, 1);lcd.print("\x07");lcd.print(F("C"));
//    lcd.print ("K"); 
    drawBars(tempFilter, 1, 18, '-', '+', -50, 50);//size of the bar from -50°C to +50°C
   
#ifdef EXTERNALVBATT
    float Voltage = GetExternalVoltage();
    lcd.setCursor(0, 2);lcd.print(F("Ext. VBat:"));lcd.setCursor(11, 2);lcd.print(Voltage);lcd.print(F("V"));
    drawBars(Voltage, 3, 18, '-', '+', 0, 20);//size of the bar from 0v to +20v
#endif
   
  }
   
  if(LCDML_BUTTON_checkAny()) { // check if any button is presed (enter, up, down, left, right)
    // LCDML_DISP_funcend calls the loop_end function
    LCDML_DISP_funcend();
  }
}
void LCDML_DISP_loop_end(LCDML_intTempExtVoltage)
{
  // this functions is ever called when a DISP function is quit
  // you can here reset some global vars or do nothing
  LCDML.scrollbarInit();//reset vertical scrollbar
}


/* ********************************************************************* */
boolean deleteEEPromSettings;
void LCDML_DISP_setup(LCDML_ResetSettings)
/* ********************************************************************* */
{
  // setup function
  lcd.clear();
  lcd.setCursor(2,0);
  lcd.print(F("!! Rst EEprom !!"));
  lcd.setCursor(2,2);
  lcd.print(F("Default Settings"));
  lcd.setCursor(2,3);
  lcd.print(F("are loaded !!!"));
  deleteEEPromSettings=false; 
}
void LCDML_DISP_loop(LCDML_ResetSettings)
{
  // loop function, can be run in a loop when LCDML_DISP_triggerMenu(xx) is set
  // the quit button works in every DISP function without any checks; it starts the loop_end function

  if (LCDML_BUTTON_checkAny()) // check if any button is pressed (enter, up, down, left, right)
  {
    if (LCDML_BUTTON_checkEnter() && (deleteEEPromSettings==false)) // check if button 'enter' is pressed one time
    {
      lcd.clear();
      lcd.setCursor(2,0);
      lcd.print(F("!! Rst EEprom !!"));
      lcd.setCursor(2,1);
      lcd.print(F("Are you certain ?"));
      lcd.setCursor(0,3);
      lcd.print(F("Down[No]  Enter[Yes]"));
      deleteEEPromSettings = true;
    }
    else if (LCDML_BUTTON_checkEnter() && (deleteEEPromSettings==true)) // check if button 'enter' is pressed a second time
    {
      lcd.clear();
      lcd.setCursor(2,0);
      lcd.print(F("!! Rst EEprom !!"));
      lcd.setCursor(7,2);
      lcd.print(F(" Done !!!"));
      deleteEEPromSettings = false;
//      clearEEprom();SettingsWriteDefault();
      delay(2000);
      LCDML_DISP_funcend();
    }
    else if (LCDML_BUTTON_checkDown() && (deleteEEPromSettings==false))
    {
      lcd.clear();
      lcd.setCursor(2,0);
      lcd.print(F("!! Rst EEprom !!"));
      lcd.setCursor(8,1);
      lcd.print(F(" Abort !!!"));
      deleteEEPromSettings = false;
      delay(2000);
      LCDML_DISP_funcend();     
    }   
  }
}
void LCDML_DISP_loop_end(LCDML_ResetSettings)
{
  // this functions is ever called when a DISP function is quit
  // you can here reset some global vars or do nothing
  deleteEEPromSettings = false;
}


About the function 'LCDML_ServosTest'
I want to move servos from 0 to 180 in a loop that finish only when i push a button.
Is it the good method ?

About the function 'LCDML_intTempExtVoltage'
I want also an infinite loop !

About the function 'LCDML_ResetSettings'
I want delete the EEprom only if i use the button down !
But i can't reset the var 'deleteEEPromSettings' and can' use the mode option !

Thanks for your help !!!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pierrotm777 on May 20, 2015, 04:35 pm
Other thing, i should like the possibility to have a back option in the end of the main menu like that:
Code: [Select]
/* LCDMenuLib_element(id, prev_layer_element, new_element_num, lang_string, callback_function) */
LCDML_DISP_add(0  ,  _LCDML_G1  , LCDML_root         , 1  , ".Settings"          , LCDML_FUNC);
  LCDML_DISP_add(1  ,  _LCDML_G1  , LCDML_root_1       , 1  , "Center Servo 1"     , LCDML_FUNC);//FUNC_timer_info);
  LCDML_DISP_add(2  ,  _LCDML_G1  , LCDML_root_1       , 2  , "Center Servo 2"     , LCDML_FUNC);//FUNC_back);   
  LCDML_DISP_add(3  ,  _LCDML_G1  , LCDML_root_1       , 3  , "Idle Position 1&2"  , LCDML_FUNC);
  LCDML_DISP_add(4  ,  _LCDML_G1  , LCDML_root_1       , 4  , "Response time"      , LCDML_FUNC);
  LCDML_DISP_add(5  ,  _LCDML_G1  , LCDML_root_1       , 5  , "Full throttle"      , LCDML_FUNC);
  LCDML_DISP_add(6  ,  _LCDML_G1  , LCDML_root_1       , 6  , "Begin synchro"      , LCDML_FUNC);           
  LCDML_DISP_add(7  ,  _LCDML_G1  , LCDML_root_1       , 7  , "Min general"        , LCDML_FUNC);
  LCDML_DISP_add(8  ,  _LCDML_G1  , LCDML_root_1       , 8  , "Max general"        , LCDML_FUNC);
  LCDML_DISP_add(9  ,  _LCDML_G1  , LCDML_root_1       , 9  , "Auxiliary chanel"   , LCDML_FUNC);
  LCDML_DISP_add(10 ,  _LCDML_G1  , LCDML_root_1       , 10 , "Nb of blades"       , LCDML_FUNC);
  LCDML_DISP_add(11 ,  _LCDML_G1  , LCDML_root_1       , 11 , "Telemetry"          , LCDML_FUNC);
  LCDML_DISP_add(12 ,  _LCDML_G1  , LCDML_root_1       , 12 , "Reverse servo 1"    , LCDML_FUNC);
  LCDML_DISP_add(13 ,  _LCDML_G1  , LCDML_root_1       , 13 , "Reverse servo 2"    , LCDML_FUNC);
  LCDML_DISP_add(14 ,  _LCDML_G1  , LCDML_root_1       , 14 , "Back"               , LCDML_FUNC_back);
LCDML_DISP_add(15 ,  _LCDML_G1  , LCDML_root         , 2  , ".Tools"             , LCDML_FUNC);
  LCDML_DISP_add(16 ,  _LCDML_G1  , LCDML_root_2       , 1  , "Reset Settings"     , LCDML_ResetSettings);
  LCDML_DISP_add(17 ,  _LCDML_G1  , LCDML_root_2       , 2  , "Servo test"         , LCDML_ServosTest);
  LCDML_DISP_add(18 ,  _LCDML_G1  , LCDML_root_2       , 3  , "Engine Recorder"    , LCDML_FUNC);
      LCDML_DISP_add(19 ,  _LCDML_G1  , LCDML_root_2_3     , 1  , "Move Pot."        , LCDML_FUNC);
      LCDML_DISP_add(20 ,  _LCDML_G1  , LCDML_root_2_3     , 2  , "Move Joystick"    , LCDML_FUNC);
      LCDML_DISP_add(21 ,  _LCDML_G1  , LCDML_root_2_3     , 3  , "Back"             , LCDML_FUNC_back);
  LCDML_DISP_add(22 ,  _LCDML_G1  , LCDML_root_2       , 4  , "Temp / VBat"        , LCDML_intTempExtVoltage);
  LCDML_DISP_add(23 ,  _LCDML_G1  , LCDML_root_2       , 5  , "Back"               , LCDML_FUNC_back);
LCDML_DISP_add(24 ,  _LCDML_G1  , LCDML_root         , 3  , ".Greetings"         , LCDML_Greetings);
LCDML_DISP_add(25 ,  _LCDML_G1  , LCDML_root         , 4  , ".Back"              , LCDML_FUNC_back);


Is it possible ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pierrotm777 on May 20, 2015, 05:07 pm
Last thing!
Into my setup , i create a loop of 5 seconds.
During these 5s , if i use a button , i enter into the menu , if not i go directly to my main software !
This is my code:
Code: [Select]
void checkRunSetup()
{
  static unsigned long mille = 1000UL;
  static unsigned long beginTime = 0;
  static unsigned long nowTime = 0;
  static unsigned long lastTime = 0;
//  boolean est_allume = true;
#ifdef FANCYLEDON
  LED6.turnOff();//pinMode(pinLED6, OUTPUT);
#endif
  /* CHECK IF USER WANTS TO RUN SETUP (Setup button depressed in first five seconds after boot) */ 
  beginTime = millis();  // Noter l'heure de début
//  Serial << "Debut : millis() = " << beginTime << endl;
  lastTime = beginTime + 5000UL;  // 10s plus tard !
  do
  {
//    LED6.pulse(1,100,50);
    nowTime = millis();
//    if ( ( nowTime % mille ) < 5 )
//    {
//      est_allume = !est_allume;  // inverser le valeur vrai/faux
#ifdef FANCYLEDON
      LED6.toggle();//digitalWrite(pinLED6, est_allume);  // Allumer la LED6.. ou pas ?
#endif
 //   }
    lcd.setCursor(0,0);//ecrit a la 1ere ligne
    lcd.print(F("Enter on Setup ?"));
    lcd.setCursor(0,2);//ecrit a la 1ere ligne
    lcd.print(F("Click a button !"));
    lcd.setCursor(17,3);lcd.print(5-((nowTime - beginTime)/1000));lcd.setCursor(19,3);lcd.print(F("s"));
   
    // Check the digital buttons
    if(_LCDML_DISP_cfg_control == 2 && (digitalRead(_LCDML_CONTROL_digital_enter) || digitalRead(_LCDML_CONTROL_digital_up) || digitalRead(_LCDML_CONTROL_digital_down)))
    {
      RunSetup = true;
      lcd.clear();
      lcd.setCursor(0,1);//ecrit a la 1ere ligne
      lcd.print(F("You enter on Setup !"));
      delay(1000);
      lcd.clear();
      break;//quitte do ... while
    }
    delay(50);
#ifdef FANCYLEDON   
    LED6.update();
#endif
  }
  while (lastTime > nowTime);    // Keep looping until time's up
#ifdef FANCYLEDON
  LED6.turnOff();//digitalWrite(pinLED6, LOW);  // Eteindre la LED
#endif
  lcd.clear();
}

I use the line if(_LCDML_DISP_cfg_control == 2 && (digitalRead(_LCDML_CONTROL_digital_enter) || digitalRead(_LCDML_CONTROL_digital_up) || digitalRead(_LCDML_CONTROL_digital_down))) because
the menu isn't launched at this time !!!
The code run very well !!!
Does exist a better method ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 20, 2015, 08:21 pm
1. post:
- do not use delay. You are blocking everything
  better way: set the trigger to five millis and count with a global variable up and down, then you are not blocking the buttons
- I want also an infinite loop !:  reset the initscreen timer with g_lcdml_initscreen = millis();
  i add a macro for that in the next beta
- LCDML_ResetSettings: you have to reset the enter button with  LCDML_BUTTON_resetEnter()  or with LCDML_BUTTON_resetAll()

2. post
What can the back button do there, go back to where? Test it.

3. I have no better idea


Next content for beta 3 (weekend):
- shorter control function
- LCDML_DISP_resetIsTimer
- the menu end code is moved from LCDML_backend_control to LCDML_run()
- the initscreen counter is moved from LCDML_backend_control to loop()
- some warnings are fixed
- ...
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: nicotin1602 on May 20, 2015, 09:44 pm
Ist es auch möglich das Menü über diese 4x4 Keypad zu steuern?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 20, 2015, 10:11 pm
klar, es lässt sich beliebig ansteuern.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: nicotin1602 on May 20, 2015, 11:19 pm
ja... aber des teil wird ja über kpd.getKey(); aufgerufen... da kommt ja das Zeichen raus und nicht 0 / 1...

wüsste jetzt nicht wie ich des umschreiben muss....

gruss
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: nicotin1602 on May 20, 2015, 11:48 pm
Hab jetzt einfach ma blind die befehle übertragen...

Code: [Select]
/* Keypad menu control */
void LCDMenuLib_control_keypad()
{
  char key = kpd.getKey();
 
 if(key)
 {
   switch (key)
   {
     case 'U': { LCDML.Button_up_down_left_right(_LCDMenuLib_button_up); } break;
     case 'D': { LCDML.Button_up_down_left_right(_LCDMenuLib_button_down); } break;
     case 'R': { if(_BUTTON_digital_enable_lr == 1) {LCDML.Button_up_down_left_right(_LCDMenuLib_button_right); }} break;
     case 'L': { if(_BUTTON_digital_enable_lr == 1) {LCDML.Button_up_down_left_right(_LCDMenuLib_button_left); }} break;
     case 'E': { LCDML.Button_enter(); } break;
     case 'B': { if(_BUTTON_digital_enable_quit == 1) {LCDML.Button_quit(); }} break;
     
   }
 }
 
}


Hab im Hauptsketch die Library fürs Keypad eingebunden und alle Voreinstellungen getroffen:
Code: [Select]
//keypad
#include <Keypad.h>
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3','U'},
  {'4','5','6','D'},
  {'7','8','9','E'},
  {'L','0','R','B'}
};
// Connect keypad      R0 R1 R2 R3
byte rowPins[ROWS] = { 9, 8, 7, 6 };
// Connect keypad      C0, C1  C2  C3
byte colPins[COLS] = { 13, 12, 11, 10 };

// Create the Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );


kann jetzt nur noch nicht testen ob es funktioniert, da ich das Keypad eben erst bestellt habe.
Wenn es funktioniert kann man es ja eventuell ins release einbinden.

Gruss
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 21, 2015, 06:17 am
Das sollte funktionieren.

Ich hab so etwas ähnliches mal angepasst für jemanden:
http://forum.dev.arduino.cc/index.php?topic=73816.285
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HotSystems on May 21, 2015, 11:32 am
Hallo,

mein Projekt (Schaltcomputer) mit der LCDMenuLib läuft soweit sehr gut. Die Anzeige der Zeit erfolgt im
init-Screen:

Code: [Select]
void FUNC_init_screen(void){
 
  // setup function
  if(!LCDML.FuncInit())
  {
    lcd.clear();
    lcd.setCursor(0,0);
  }
  // Loop-Funktionen ------------------------------------------------------------

    // here you can enter the loop code
    Check_SummerTime();                               // auf Sommerzeit prüfen
    show_time_and_date();                              // Datum und Uhrzeit ausgeben
    CheckSwitchTime(stunden,minuten);           // Schaltzeiten prüfen und anzeigen
    SetRelaisPort();                                         // Relaisausgänge ansteuern
    SetFS20Port();                                          // Funkausgänge ansteuern

   
  // Ende Loop-Funktion ---------------------------------------------------------- 


Mit einer beliebigen Taste springe ich in das Menü, soweit ok und arbeitet super.

Jetzt möchte ich nur mit der "Taste Rechts" aus diesem "Hauptbildschirm / init-Screen" in eine Menüfunktion springen, die als Menü selbst nicht angezeigt wird, aber dennoch in dieser Funktion arbeiten soll. Die Funktion wäre z.B. "ShowConfig" und zeigt mir alle Einstellungen der Schaltuhr. Also als Menüpunkt gibt es diese Funktion nicht.

Frage: geht das und wie kann ich das erreichen?
Ich freue mich auf eure Tipps.

Gruß
Dieter
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pierrotm777 on May 21, 2015, 12:14 pm
Ok i have build a wait function that replace the delay and run very well !
Code: [Select]
void waitMs(unsigned long timetowait)
{
  static unsigned long beginTime = 0;
  static unsigned long nowTime = 0;
  static unsigned long lastTime = 0; 
  beginTime = millis();
  lastTime = beginTime + timetowait;
  do
  {
    nowTime = millis();
  }
  while (lastTime > nowTime);
}


But my reset function EEProm don't run as i want !
Code: [Select]

boolean deleteEEPromSettings;
void LCDML_DISP_setup(LCDML_ResetSettings)
{
  // setup function
  lcd.clear();
  lcd.setCursor(2,0);lcd.print(F("!! Rst EEprom !!"));
  lcd.setCursor(2,2);lcd.print(F("Default Settings"));
  lcd.setCursor(2,3);lcd.print(F("are loaded !!!"));
  deleteEEPromSettings=false; 
}
void LCDML_DISP_loop(LCDML_ResetSettings)
{
  // loop function, can be run in a loop when LCDML_DISP_triggerMenu(xx) is set
  // the quit button works in every DISP function without any checks; it starts the loop_end function

  if (LCDML_BUTTON_checkAny()) // check if any button is pressed (enter, up, down, left, right)
  {
    if (LCDML_BUTTON_checkEnter()) // check if button 'enter' is pressed one time
    {
      if(deleteEEPromSettings==false)
      {
        lcd.clear();
        lcd.setCursor(2,0);lcd.print(F("!! Rst EEprom !!"));
        lcd.setCursor(2,1);lcd.print(F("Are you certain ?"));
        lcd.setCursor(0,3);lcd.print(F("Down[No]  Enter[Yes]"));
        deleteEEPromSettings = true;
      }
      else
      {
        lcd.clear();
        lcd.setCursor(2,0);lcd.print(F("!! Rst EEprom !!"));
        lcd.setCursor(7,2);lcd.print(F(" Done !!!"));
        deleteEEPromSettings = false;
//        clearEEprom();SettingsWriteDefault();
        waitMs(2000UL);//delay(2000);
//        LCDML_BUTTON_resetAll();
        LCDML_DISP_funcend();       
      }     
    }
    if (LCDML_BUTTON_checkDown())
    {
      lcd.clear();
      lcd.setCursor(2,0);lcd.print(F("!! Rst EEprom !!"));
      lcd.setCursor(6,2);lcd.print(F(" Abort !!!"));
      deleteEEPromSettings = false;
        waitMs(2000UL);//delay(2000);
//        LCDML_BUTTON_resetAll();
        LCDML_DISP_funcend();       
    }   
  }
}
void LCDML_DISP_loop_end(LCDML_ResetSettings)
{
  // this functions is ever called when a DISP function is quit
  // you can here reset some global vars or do nothing
  deleteEEPromSettings = false;
//  LCDML_BUTTON_resetAll();
}


My Abort function run only if i don't use the 'enter' button !
If i use one time 'enter' and one time 'down', the function return me 'Down' and after 'Abort' and not only 'Abort'.
If i use directly 'Down' , i have well 'Abort' !!!
Actually, i use only two buttons , down and enter ...
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on May 21, 2015, 12:41 pm
@hotsystem, mit dem jetzigen menü gehrs nicht. Ab der nächsten version ist das realisierbar. Im moment gibt es nur eine beta, in der noch kleine fehler sind. Ich denke das ich in ein oder zwei wochen die stabile version zur verfügung stellen kann. (wenn das wetter nicht so gut ist gehts schneller)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pierrotm777 on May 21, 2015, 01:10 pm
Ok sorry  :)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HotSystems on May 21, 2015, 01:26 pm
Hallo Jomelo,

vielen Dank für Deine Antwort. Dann werde ich darauf warten. Aktuell rufe ich die Funktion aus dem Menü auf, was allerdings recht umständlich ist, da man nur kurz die Einstellungen sehen möchte.

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on May 28, 2015, 04:02 am
Mahlzeit.
Möchte die Uhr stellen, da wäre es schöner wenn man weiß, was grad eingestellt wird.
Cursor oder Blink steht zur Auswahl, bekomme es seit nem Jahr nicht hin dass es da blinkt wo es soll.
Jemand ein Vorschlag wie es funktionieren könnte?

Hier mein Sketch mit der V2 Beta 2:
Code: [Select]
/* ===============================================
 * Set Time
 * =============================================== */ 
  char lcdline[17];
  int8_t _pos=0;
   void HELP_FUNC_set_dat(int8_t l_i)
  {
    switch(_pos)
    {
      case 0: setTime(hour()+l_i,minute(),second(),day(),month(),year());  break; // hour
      case 1: setTime(hour(),minute()+l_i,second(),day(),month(),year()); break; // min
      case 2: setTime(hour(),minute(),second(),day()+l_i,month(),year()); break; // day
      case 3: setTime(hour(),minute(),second(),day(),month()+l_i,year()); break; // month
      case 4: setTime(hour(),minute(),second(),day(),month(),year()+l_i); break; // year
    }
  }
  void digitalClockDisplay(){
   /*  19.594 Bytes
    *    lcd.setCursor(3,0);
      sprintf(lcdline,"%02d:%02d:%02d",hour(),minute(),second());
      lcd.print(lcdline);
      lcd.setCursor(3,1);
      sprintf(lcdline,"%02d.%02d.%04d",day(),month(),year());
      lcd.print(lcdline);
   */
   // 18.170 Bytes
   lcd.blink();
      lcd.setCursor(3,0);
  lcd.print(hour());
  printDigits(minute());
  printDigits(second());
      lcd.setCursor(3,1);
  lcd.print(day());
  lcd.print(".");
  lcd.print(month());
  lcd.print(".");
  lcd.print(year());

}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  lcd.print(":");
  if(digits < 10)
    lcd.print('0');
  lcd.print(digits);
}
void LCDML_DISP_setup(LCDML_FUNC_set_dat)
/* ********************************************************************* */
{
  // setup function


}
void LCDML_DISP_loop(LCDML_FUNC_set_dat)
{
  // loop function, can be run in a loop when LCDML_DISP_triggerMenu(xx) is set
  // the quit button works in every DISP function without any checks; it starts the loop_end function
  LCDML_DISP_triggerMenu(500); // set trigger for this function to 1000 millisecounds

 digitalClockDisplay();
       
  if(LCDML_BUTTON_checkAny()) { // check if any button is presed (enter, up, down, left, right)
    // LCDML_DISP_funcend calls the loop_end function

      if (LCDML_BUTTON_checkUp())
    {   
          HELP_FUNC_set_dat(+1); LCDML_BUTTON_resetUp();
    }
      if (LCDML_BUTTON_checkDown())
    {
         HELP_FUNC_set_dat(-1);  LCDML_BUTTON_resetDown();
    }
      if (LCDML_BUTTON_checkRight())
    {
        _pos=(_pos+1)%5; LCDML_BUTTON_resetRight();
      }
    }
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pierrotm777 on May 28, 2015, 01:07 pm
If i understand well how the v2 run, the LCDML_DISP_triggerMenu(500); must to be into setup , not into the loop ...
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HotSystems on May 28, 2015, 05:22 pm
Hallo,

ich meine mich zu erinnern, hier in einem Beitrag gelesen zu haben, dass die "initscreen-Zeit":


#define _LCDMenuLib_cfg_initscreen_time   5000


in den Menüpunkten ausgeschaltet werden kann. Leider kann ich es aktuell nicht mehr finden.

Ich möchte in meinem Projekt zum Stellen der Uhrzeit diese Wartezeit komplett ausschalten.
Also er darf den Menüpunkt nicht automatisch verlassen, sondern muss auf eine Eingabe warten.

Wie muss ich da rangehen?

Vielen dank für Eure Tipps.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pierrotm777 on May 28, 2015, 05:40 pm
No , the example say that:
Code: [Select]
/* ********************************************************************* */
uint8_t g_func_timer_info = 0;  // time counter (global variable)
unsigned long g_timer_1 = 0;    // timer variable (globale variable)
void LCDML_DISP_setup(LCDML_FUNC_timer_info)
/* ********************************************************************* */
{
  // setup function     
  lcd.print(F("x sec warten")); // print some content on first row 
  g_func_timer_info = 10; // reset and set timer   
  LCDML_DISP_triggerMenu(100); // starts a trigger event for the loop function every 100 millisecounds
}

void LCDML_DISP_loop(LCDML_FUNC_timer_info)
{
  // loop function, can be run in a loop when LCDML_DISP_triggerMenu(xx) is set
  // the quit button works in every DISP function without any checks; it starts the loop_end function
 
  // this function is called every 100 millisecounds
 
  // this timer checks every 1000 millisecounds if it is called
  if((millis() - g_timer_1) >= 1000) {
    g_timer_1 = millis();   
    g_func_timer_info--;                // increment the value every secound */
    lcd.setCursor(0, 0);                // set cursor pos */
    lcd.print(g_func_timer_info);       // print the time counter value */
  }
 
  // this function can only be ended when quit button is pressed or the time is over
  // check if the function ends normaly
  if (g_func_timer_info <= 0)
  {
    // end function for callback
    LCDML_DISP_funcend(); 
  }   
}

void LCDML_DISP_loop_end(LCDML_FUNC_timer_info)
{
  // this functions is ever called when a DISP function is quit
  // you can here reset some global vars or do nothing
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: nicotin1602 on May 29, 2015, 08:43 pm
 Hi Jomelo! Hab jetzt ma an div. Probleme gehangen, hab diese jetzt allerdings alle gelöst... Nur wenn ich den code als Funktion im Menü einfüge passiert nix.... verstehe nicht warum:
Code: [Select]
void FUNC_react(void)
{
  if(!LCDML.FuncInit())
  {
    lcd.clear();
    x = 3;
    y = 2;
    lcd.setCursor(x,y);
    lcd.write(reaktionszeit);
  }
  key = kpd.getKey();
  if (key == 'L' || key == 'R')
   {
   switch (key)
   {
    case 'L':
    if (i > 0){i = i - 1;}
    break;
   
    case 'R':
    if (i < 4){i = i + 1;}
   
    break;
   }
     
   }
  xi = x + i;
  lcd.setCursor(xi,y);
  lcd.blink();
  lcd.cursor();
  if (key >= '0' && key <= '9' ){
  reaktionszeit[i] = key;
  lcd.setCursor(x,y);
  lcd.write(reaktionszeit);
  lcd.setCursor(xi,y);
  }
 
  if (key == 'E')
  {
    char vartype[2] = "r";
    fortransmitt(vartype,reaktionszeit);
  }
 
  Serial.println("RUNTHROUGH");
  if(LCDML.FuncEnd(0, 0, 0, 0, 0, 0)) // (direct, enter, up, down, left, right)
  {
    // do something bevor this function is closed   
  }     

}



als eigenständiges Programm funktionierts einwandfrei:
Code: [Select]
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

char reaktionszeit[6] = "12345";
char key;
int i = 0;
int x = 0;
int y = 0;
int xi = 0;


//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

const byte ROWS = 4;
const byte COLS = 4;
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3','U'},
  {'4','5','6','D'},
  {'7','8','9','E'},
  {'L','0','R','B'}
};
// Connect keypad      R0 R1 R2 R3
byte colPins[COLS] = { 22, 24, 26, 28 };
// Connect keypad      C0, C1  C2  C3
byte rowPins[ROWS] = { 30, 32, 34, 36 };

// Create the Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int fortransmitt(char t[2] = "X",char v[6] = "XXXXX"){
  char totransmitt[7] = "XXXXXX";
  totransmitt[0] = t[0];
  totransmitt[1] = v[0];
  totransmitt[2] = v[1];
  totransmitt[3] = v[2];
  totransmitt[4] = v[3];
  totransmitt[5] = v[4];

  Wire.beginTransmission(1);
  Wire.write(totransmitt);
  Wire.endTransmission();
  Serial.println(totransmitt);
}

void setup() 
{
  Serial.begin(9600);
  lcd.begin(20,4);
  lcd.backlight();
  lcd.clear();
  x = 3;
  y = 2;
  lcd.setCursor(x,y);
  lcd.write(reaktionszeit);
 
}

void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  key = kpd.getKey();
  if (key == 'L' || key == 'R')
   {
   switch (key)
   {
    case 'L':
    if (i > 0){i = i - 1;}
    break;
   
    case 'R':
    if (i < 4){i = i + 1;}
   
    break;
   }
     
   }
  xi = x + i;
  lcd.setCursor(xi,y);
  lcd.blink();
  lcd.cursor();
  if (key >= '0' && key <= '9' ){
  reaktionszeit[i] = key;
  lcd.setCursor(x,y);
  lcd.write(reaktionszeit);
  lcd.setCursor(xi,y);
  }
 
  if (key == 'E')
  {
    char vartype[2] = "r";
    fortransmitt(vartype,reaktionszeit);
  }
}
   

 




Auch läuft die Funktion anstandslos und sehr schnell durch.

Verstehe deshalb auch nicht warum er keinen key erkennt. Gruss Max
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: nicotin1602 on May 29, 2015, 08:46 pm
Aber irgend so einViereck, (seitenverhltnis einer 0) gibt kpd.getKey zurück.. egal was gedrückt ist... verstehe das überhaupt nicht!

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: nicotin1602 on Jun 06, 2015, 02:37 pm
ist der thread hier tot? schade... muss ich wohl menwiz benutzen...
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 06, 2015, 04:10 pm
Moin, der Thread ist nicht tot, wenn ihr laut genug schreit dann lese ich es ;-).

Meine Zeit ist im Moment sehr begrenzt, stecke gerade mitten in den Umzugsvorbereitungen.
- Streichen / Renovieren
- Mit dem Chef der Deko streiten/diskutieren, was mit kommt und was nicht und wo was hinkommt. Das kennt ihr bestimmt auch und es kostet sehr viel Zeit  :smiley-mr-green:

Und zudem ist das Wetter (aus euer sicht leider) so gut, dass es genutzt werden muss.

@skorpi08

Das mit dem Einstellen der Uhrzeit und dem Kursor (Blink) hat mich gerade in den Fingern gejuckt. Ich hab festgestellt das ich den Kursor immer als letztes setzen muss, damit ich die Position bestimmen kann. Der Folgende Code sollte genau deine Aufgabe erfüllen. Da ich nun jetzt keine "Time" oder "Uhrzeit" Lib eingebunden habe, hab ich die Funktionen mit Makros simuliert. Entfern diese einfach, dann sollte es laufen. Der Kursor wird immer vor das zu ändernde Element gesetzt. Falls ein Übersprung der Digits enthalen ist wird der Cursor angepasst.

Code: [Select]

/* ===============================================
 * Set Time
 * =============================================== */
  // you can remove this part when you are using a time lib
  // this makros are only for this examples and can be delete 
  uint8_t vh, vmi, vs, vd,vmo, vy = 0;
  #define hour() vh
  #define minute() vmi
  #define second() vs
  #define day() vd
  #define month() vmo
  #define year() vy
  #define setTime(h,mi,s,d,mo,y) vh=h; vmi=mi; vs=s; vd=d; vmo=mo; vy=y;
  // define global variable 
  uint8_t _pos = 0;
  // define help function to set the current time
  void HELP_FUNC_set_dat(int8_t l_i)
  {
    switch(_pos)
    {
      case 0: setTime(hour()+l_i,minute(),second(),day(),month(),year());  break; // hour
      case 1: setTime(hour(),minute()+l_i,second(),day(),month(),year()); break; // min
      case 2: setTime(hour(),minute(),second(),day()+l_i,month(),year()); break; // day
      case 3: setTime(hour(),minute(),second(),day(),month()+l_i,year()); break; // month
      case 4: setTime(hour(),minute(),second(),day(),month(),year()+l_i); break; // year
    }
  }
  // define help function to display the current clock settings
  void digitalClockDisplay(){   
   
    lcd.setCursor(3,0);
    printDigits(hour());
    lcd.print(":");
    if(_pos == 1) { lcd.print(" "); }
    printDigits(minute());
    lcd.print(":");
    printDigits(second());
    lcd.setCursor(3,1); 
    lcd.print(day());
    lcd.print(".");
    if(_pos == 3) { lcd.print(" "); }
    lcd.print(month());
    lcd.print(".");
    if(_pos == 4) { lcd.print(" "); }
    lcd.print(year());
    // set cursor
    switch(_pos) {
      case 0: lcd.setCursor(2,0); lcd.blink(); break; //hour
      case 1: lcd.setCursor(6,0); lcd.blink(); break; //min
      case 2: lcd.setCursor(2,1); lcd.blink(); break; //day
      case 3: lcd.setCursor(5+((day()<10)?0:1),1); lcd.blink(); break;//month
      case 4: lcd.setCursor(7+((day()<10)?0:1)+((month()<10)?0:1),1); lcd.blink(); break; //year
      default: lcd.noBlink(); break;
     }
  }
  // define help function to display digits in front of the value
  void printDigits(int digits){
    // utility function for digital clock display: prints preceding colon and leading 0 
    if(digits < 10)
      lcd.print('0');
    lcd.print(digits);
  }
// ===============================================
// Set Time
void LCDML_DISP_setup(LCDML_FUNC_set_dat)
// ********************************************************************* */
{
  // setup function
  LCDML_DISP_triggerMenu(500); // set trigger for this function to 1000 millisecounds
  // print default value
  digitalClockDisplay();
}
void LCDML_DISP_loop(LCDML_FUNC_set_dat)
{
  // loop function, can be run in a loop when LCDML_DISP_triggerMenu(xx) is set
  // the quit button works in every DISP function without any checks; it starts the loop_end function
       
  if(LCDML_BUTTON_checkAny()) { // check if any button is presed (enter, up, down, left, right)
    // LCDML_DISP_funcend calls the loop_end function

      if (LCDML_BUTTON_checkUp())    { HELP_FUNC_set_dat(+1); LCDML_BUTTON_resetUp(); }
      if (LCDML_BUTTON_checkDown())  { HELP_FUNC_set_dat(-1);  LCDML_BUTTON_resetDown(); }
      if (LCDML_BUTTON_checkRight()) { _pos=(_pos+1)%5; LCDML_BUTTON_resetRight(); }
      lcd.clear();
      digitalClockDisplay()  ;
    }   
   
    // reset initscreenloop
    LCDML_DISP_resetIsTimer();
}
void LCDML_DISP_loop_end(LCDML_FUNC_set_dat)

  // this functions is ever called when a DISP function is quit
  // you can here reset some global vars or do nothing

    // disable the cursor
  lcd.noBlink(); 
}



@HotSystems
 Füge einfach in der Loop folgende Zeile ein:
Code: [Select]

 // reset initscreenloop
    LCDML_DISP_resetIsTimer();

Um die Uhrzeit geschickt zu stellen, schau dir den Quellcode weiter oben an

@nicotin1602
Den Code den ich gepostet habe der bezieht sicht auf die aktuelle Beta. Ich denke das er mit der aktuellen stabilen Version nicht läuft. Ich werde heute abend eine neue Beta veröffentlichen in der ein Beispiel mit dem Keypad enthalten ist.

Edit:
@skorpi08
Es ist ja auch möglich einen Buchstaben vor der Anzeige blinken zu lassen, damit gesehen wird, was gerade eingestellt wird. Dazu muss der code oben wie folgt geändert werden:
Code: [Select]

switch(_pos) {
      case 0: lcd.setCursor(2,0); lcd.print("H"); lcd.setCursor(2,0); lcd.blink(); break; //hour
      case 1: lcd.setCursor(6,0); lcd.print("M"); lcd.setCursor(6,0); lcd.blink(); break; //min
      case 2: lcd.setCursor(2,1); lcd.print("D"); lcd.setCursor(2,1); lcd.blink(); break; //day
      case 3: lcd.setCursor(5+((day()<10)?0:1),1); lcd.print("M"); lcd.setCursor(5+((day()<10)?0:1),1); lcd.blink(); break;//month
      case 4: lcd.setCursor(7+((day()<10)?0:1)+((month()<10)?0:1),1); lcd.print("Y"); lcd.setCursor(7+((day()<10)?0:1)+((month()<10)?0:1),1); lcd.blink(); break; //year
      default: lcd.noBlink(); break;
     }
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HotSystems on Jun 06, 2015, 10:21 pm
Hallo Jomelo,

vielen Dank für Deinen Tipp, leider funktioniert er nicht bei mir.

Code: [Select]

// reset initscreenloop
   LCDML_DISP_resetIsTimer();

Fehler:  error: 'LCDML_DISP_resetIsTimer' was not declared in this scope


Liegt es evtl. an der Version? ich verwende noch die letzte stabile Version mit i2c.

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Jun 09, 2015, 10:28 pm
Nur mal zur Info wie ich es gemacht hab:
Hinter den Sekunden steht was gerade eingestellt wird

Code: [Select]
/* ===============================================
 * Set Time
 * =============================================== */  
  
  uint8_t _pos=0;
   void HELP_FUNC_set_dat(uint8_t l_i)
  {
    switch(_pos)
    {
      case 0: setTime(hour()+l_i,minute(),second(),day(),month(),year()); break; // hour
      case 1: setTime(hour(),minute()+l_i,second(),day(),month(),year()); break; // min
      case 2: setTime(hour(),minute(),second(),day()+l_i,month(),year()); break; // day
      case 3: setTime(hour(),minute(),second(),day(),month()+l_i,year()); break; // month
      case 4: setTime(hour(),minute(),second(),day(),month(),year()+l_i); break; // year
    }
  }
  void digitalClockDisplay(){
   lcd.setCursor(3,0);
    printDigits(hour());
    lcd.print(":");
    printDigits(minute());
    lcd.print(":");
    printDigits(second());
    lcd.setCursor(3,1);  
    lcd.print(day());
    lcd.print(".");
    lcd.print(month());
    lcd.print(".");
    lcd.print(year());
  }
  // define help function to display digits in front of the value
  void printDigits(uint8_t digits){
    if(digits < 10)
      lcd.print('0');
    lcd.print(digits);
  }
void LCDML_DISP_setup(LCDML_FUNC_set_date)
{
  // setup function

}
void LCDML_DISP_loop(LCDML_FUNC_set_date)
{
  // loop function, can be run in a loop when LCDML_DISP_triggerMenu(xx) is set
  // the quit button works in every DISP function without any checks; it starts the loop_end function
    LCDML_DISP_triggerMenu(_LCDML_DISP_cfg_button_press_time); // set trigger for this function to 1000 millisecounds
  // print default value
  digitalClockDisplay();
 if(LCDML_BUTTON_checkAny()) { // check if any button is presed (enter, up, down, left, right)
      if (LCDML_BUTTON_checkUp())   { HELP_FUNC_set_dat(+1);  LCDML_BUTTON_resetUp();}
      if (LCDML_BUTTON_checkDown()) { HELP_FUNC_set_dat(-1);  LCDML_BUTTON_resetDown();}
      if (LCDML_BUTTON_checkRight()){ _pos=(_pos+1)%5;        LCDML_BUTTON_resetRight();}
    }
     // set cursor
     lcd.setCursor(12,0);
switch(_pos) {
      case 0: lcd.print("Std "); break; //hour
      case 1: lcd.print("Min "); break; //min
      case 2: lcd.print("Tag "); break; //day
      case 3: lcd.print("Mon "); break;//month
      case 4: lcd.print("Jahr");break; //year
     }
}



LCDML_DISP_triggerMenu(_LCDML_DISP_cfg_button_press_time);
Habe ich deshalb, weil die Tasten sonst schlecht aktualisiert werden.

Wenn es im setup steht wie bei dir, kann ich keine Zahl ändern.

    // reset initscreenloop
    LCDML_DISP_resetIsTimer();

Quote
LCDML_DISP.ino: In function 'void LCDML_FUNC_initscreen_loop_end()':
LCDML_DISP:150: error: 'LCDML_DISP_resetIsTimer' was not declared in this scope
'LCDML_DISP_resetIsTimer' was not declared in this scope
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 11, 2015, 07:06 am
Schön das du eine Lösung gefunden hast. Eigentlich sollte die Button press time nichts mit den Menü zu tun haben. Die Buttons werden in einer separaten Schleife abgefragt. Sobald ein Button betätigte wird wird die Menü Funktion aktualisiert. Die Funktion wird kontinuierlich aufgerufen, wenn der Trigger in der Loop auf einen Wert eingestellt ist.
Das ist mit die größte Änderung in der neuen Version. Denn Trigger hab ich bisher noch nie in der Loop gesetzt. Das Verfahren muss ich mal überprüfen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: dvdmttn on Jun 18, 2015, 09:56 pm
Guten Abend allerseits,

ich benutze die Beta 2.0. Soweit funktioniert alles, jedoch habe ich das Problem, dass wenn ich in einem Untermenü eine Funktion ausgeführt habe, die Displaysteuerung in das Rootmenü wechselt.

Mit welchem Befehl oder umstrukturierung kann ich die Steuerung so gestalten, dass wenn ich eine Funktion ausgeführ habe die Diesplaysteuerung in diesem Untermenü bleibt?

Bin für jeden Tip dankbar!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 19, 2015, 06:56 am
Kannst du den Quellcode deiner Funktion hier einstellen. Normalerweise kann das nicht sein. Zu root kommst du nur mit goRoot(), dem Initscreen, oder einem Speicherüberlauf in deiner Funktion. Beim falschen Speicherzugriff kann es zu einem Neustart des Arduinos kommen. Kannst du das mal testen. Dazu einfach im setup eine serial Ausgabe erzeugen und schauen ob diese angezeigt wird, wenn das menü springt.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: dvdmttn on Jun 19, 2015, 12:38 pm
Das ist eine von vielen Funktionen. Alle Funktionen sind gleich aufgebaut.


void LCDML_DISP_setup(LCDML_FUNC_vodkaosaft)                                                //VODKA O-SAFT

{
   delay(50);
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Bitte warten");
 lcd.setCursor(0,1);
 lcd.print("Vorgang laeuft");
 digitalWrite(pump_1, LOW);      // Vodka
  delay(2600);                   // 40 ml
  digitalWrite(pump_1, HIGH);   
   digitalWrite(pump_10, LOW);   // Orangensaft
  delay(10400);                  // 160 ml
  digitalWrite(pump_10, HIGH);   
 lcd.clear();
 delay(3000);

}
pinMode(pump_1, OUTPUT);
pinMode(pump_10, OUTPUT);
digitalWrite(pump_1, HIGH);
digitalWrite(pump_10, HIGH);
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 19, 2015, 12:46 pm
Das menü kommt ohne delays aus. Sobald du ein delay verwendest steht alles. Schau dir mal das Beispiel "blink without delay" an. Dann als nächstes wo ist die loop Funktion und die loop_end? Hast du dir mal die Beispiele angeschaut, die bei der betaversion dabei sind? Als letztes, verwende doch bitte das F() makro für string. (siehe Beispiele)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: dvdmttn on Jun 19, 2015, 12:57 pm
Habe es jetzt soweit hinbekommen, jedoch wenn die Pumpen schalten bekomme ich wirre Zeichen auf dem Display ausgegeben. Woran kann das liegen?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: skorpi080 on Jun 19, 2015, 10:38 pm
Bei den Leutn die Mechanische Relais schalten, ist dasselbe Problem.
Die Lösung in deren Fall, SSR Relais.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: schittl on Jun 29, 2015, 10:01 am
Zwei kleine Fragen zur neuen Version:

1. Kann man auch einzelne Menüelemente deaktivieren oder nur Gruppen?
2. Kann man eventbasierende Threads abfragen ob diese gerade agieren? Mit isRun kommt Fehler

Danke.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jun 29, 2015, 12:21 pm
Zu 1: Es lassen sich nur Gruppen deaktivieren. (maximal 8 (ein Byte))
Zu 2: Ein Event läuft nur einmal durch. Da der Arduino nicht parallel läuft macht es meiner Meinung nach keinen Sinn ein Event mit isRun abzufragen. Ich hab das so nicht bedacht und auch nicht getestet. Also geht es auch nicht.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HotSystems on Jun 29, 2015, 04:00 pm
Hallo,

ich schaff es nicht, die Displaybeleuchtung richtig zu steuern.
Bei einem Tastendruck wird diese eingeschaltet und soll nach ca. 10 sek wieder aus gehen. Einschalten funktioniert

if(LCDML.checkButtons()){
 digitalWrite(DisplayLed, LOW);
}

aber das Ausschalten bekomme ich nicht hin. Ich habe es über die eingebaute Timerfunktion versucht, weiß aber nicht so recht, wo ich die einbauen soll.
Ich habe es auch mit einer Abwandlung des "BlinkWithoutDelay" versucht, aber auch hier funktioniert es nicht richtig.


Code: [Select]
void LCDDisplayLed(void){
unsigned long currentMillis = millis();

  if(currentMillis - previousMillis >= 10000{
    previousMillis = currentMillis;   

    if (LCDledState == LOW)
      LCDledState = HIGH;
    digitalWrite(4, LCDledState);
  }

}


Wie starte ich die Funktion, damit die Beleuchtung nach 10 sek ausschaltet?
Aktuell starte ich die aus der Loop im init_screen, hier läuft meine RTC.


Code: [Select]
Check_SummerTime();                    // auf Sommerzeit prüfen
show_time_and_date();                  // Datum und Uhrzeit ausgeben
CheckSwitchTime(stunden,minuten);      // Schaltzeiten prüfen und anzeigen
SetRelaisOut();                        // Relaisausgänge ansteuern

LCDDisplayLed();                       //Diplaybeleuchtung


Ich hoffe ihr könnt helfen.
Vielen Dank für die Unterstützung

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Serenifly on Jun 29, 2015, 05:47 pm
Ich mache es so (bei einem TFT):

Code: [Select]

const unsigned long DISPLAY_TIMEOUT = 10 * 1000UL;

bool display_is_on;
unsigned long display_timeout;

void display_backlight()
{
  if(display_is_on && (millis() - display_timeout > DISPLAY_TIMEOUT))
  {
     display_is_on = false;

     //hier ausschalten
  }
}


Und dann wenn eine Taste gedrückt wurde sowas in der Art:
Code: [Select]

display_timeout = millis();
 
if(display_is_on == false)
{
   display_is_on = true;

   //Display hier einschalten

   //hier sollte man return machen, damit der restliche Code nicht ausgeführt wird
}

Also immer wenn eine Taste gedrückt wird, wird der Timer "neu gestartet" und es müssen erst wieder x Sekunden vergehen

Das return deshalb damit der erste Tastendruck nur das Display aufweckt und keine Aktion ausführt

Und wenn du das Display am Anfang an haben willst, musst du noch in setup() display_on auf true setzen und display_timeout auf millis()
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: HotSystems on Jun 29, 2015, 10:15 pm
Hallo Serenifly,

prima, das funktioniert.

Vielen Dank für den Tipp.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pierrotm777 on Jul 02, 2015, 07:56 pm
Thanks for this V2 version that run very well with my sainsmart I2C 20x4 LCD .

I don't understand these two lines:
Code: [Select]
LCDML_BACK_new_timebased_static  (0  , ( 20UL )         , _LCDML_start  , LCDML_BACKEND_control);
LCDML_BACK_new_timebased_dynamic (1  , ( 1000UL )       , _LCDML_stop   , LCDML_BACKEND_menu);
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Jul 04, 2015, 09:59 am
I explain this lines next month. At the moment i have no time to make anything for arduino.
I renovate my new apartment and can only use the internet over my handy. The whole equipment is in boxes.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pierrotm777 on Jul 04, 2015, 11:35 am
I explain this lines next month. At the moment i have no time to make anything for arduino.
I renovate my new apartment and can only use the internet over my handy. The whole equipment is in boxes.
Ok good work into your apartment :-) !

i love this menu !!!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: schittl on Jul 07, 2015, 02:31 pm
Kann es sein das die Option "_LCDML_DISP_cfg_scrollbar_custom_redefine" keine Auswirkung auf eigene angepasste Zeichen hat? Merke leider keinen Unterschied.

Ansonsten muss ich ein großen Lob aussprechen. Funktioniert im Dauerlauf seit 1 Woche in Verbindung mit I2C, DS18B20 und Lichtsteuerung ohne Probleme! Top!

Danke.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: sphh on Aug 09, 2015, 10:41 pm
The best!! Danke, Jomelo!

Ich habe ein paar Fragen oder Anregungen. Ich splitte sie in mehrere Nachrichten, das mir das Forum nicht erlaubt, mehr als 9000 Zeichen (OMG! Habe ich wirklich sooo viele geschrieben/kopiert?)

LCD Display

Ich verwende ein 40x4 Display und habe es folgendermaßen zum Laufen gebracht:


... und alles funktioniert prächtig.

Eine Verständnisfrage: Wäre es nicht einfacher, den Anwender die ganze Initialisierung des Displays zu überlassen? Würde das nicht viel Aufwand Deinerseits ersparen? Ich als Anwender hab auch einige Zeit gebraucht, durch dieses System durchzusteigen... Oder einen _LCDMenuLib_cfg_lcd_type zu definieren (-1?), der es dem Anwender erlaubt, die Initialisierung selber zu machen. Nur so eine Idee...

LCDMenuLib__config.h:
Code: [Select]

# define _LCDML_DISP_cfg_max_string_length 40 // max string length witch can be display


/* **************************************************************************************************** */
/* 300:400  LiquidCrystalFast 40x4 LCD(extern) */
/*  https://code.google.com/p/liquidcrystal440/ */
/* **************************************************************************************************** */
// =========================
// 4 bit mode (8 bit unsupported by LiquidCrystalFast)
// =========================
//# define _LCDMenuLib_cfg_lcd_type 300 // 4Bit: 6 pin connection (slow): normal LCD, single HD44780 controller
//# define _LCDMenuLib_cfg_lcd_type 301 // 4Bit+rw: 7 pin connection (fast): normal LCD, single HD44780 controller
# define _LCDMenuLib_cfg_lcd_type 302 // 4Bit+rw+2e: 8 pin connection (fast): 4x40 LCD, two HD44780 controller chips
//# define _LCDMenuLib_cfg_lcd_type 303 // 8Bit: 10 pin connection - not recommended, for backwards compatibility only
//# define _LCDMenuLib_cfg_lcd_type 304 // 8bit+rw: 11 pin connection - not recommended, for backwards compatibility only


keywords.txt:
Code: [Select]

_LCDML_DISP_e1 LITERAL1
_LCDML_DISP_e2 LITERAL1


LCDMenuLib_class.h:
Code: [Select]

/* ******************************************************************************** */
/* LiquidCrystalFast */
/* ******************************************************************************** */
# if(_LCDMenuLib_cfg_lcd_type >= 300 && _LCDMenuLib_cfg_lcd_type < 400)
 //LCD Function
# define _LCDML_lcd_createChar(pos,char) createChar(pos,char)
# define _LCDML_lcd_setCursor(col,row) setCursor(col,row)
# define _LCDML_lcd_write(content) write(content)
# define _LCDML_lcd_clear() clear()
# define _LCDML_lcd_print(content) print(content)
# define _LCDML_lcd_begin() lcd.begin(_LCDML_DISP_cols,_LCDML_DISP_rows);

 // ====================
 // 4Bit/8Bit Mode
 // ====================
# if(_LCDMenuLib_cfg_lcd_type >= 300 && _LCDMenuLib_cfg_lcd_type < 310)
 //LCD type
# define _LCDML_lcd_type LiquidCrystalFast
 //LCD include
# include <LiquidCrystalFast.h>
 //LCD objects
# if(_LCDMenuLib_cfg_lcd_type == 300) //4Bit: 6 pin connection (slow): normal LCD, single HD44780 controller
# define _LCDML_lcd_obj LiquidCrystalFast lcd(_LCDML_DISP_rs, 255, _LCDML_DISP_e, _LCDML_DISP_dat4, _LCDML_DISP_dat5, _LCDML_DISP_dat6, _LCDML_DISP_dat7);
# elif(_LCDMenuLib_cfg_lcd_type == 301) //4Bit+rw: 7 pin connection (fast): normal LCD, single HD44780 controller
# define _LCDML_lcd_obj LiquidCrystalFast lcd(_LCDML_DISP_rs, _LCDML_DISP_rw, _LCDML_DISP_e, _LCDML_DISP_dat4, _LCDML_DISP_dat5, _LCDML_DISP_dat6, _LCDML_DISP_dat7);
# elif(_LCDMenuLib_cfg_lcd_type == 302) //4Bit+rw+2e: 8 pin connection (fast): 4x40 LCD, two HD44780 controller chips
# define _LCDML_lcd_obj LiquidCrystalFast lcd(_LCDML_DISP_rs, _LCDML_DISP_rw, _LCDML_DISP_e1, _LCDML_DISP_e2, _LCDML_DISP_dat4, _LCDML_DISP_dat5, _LCDML_DISP_dat6, _LCDML_DISP_dat7);
# elif(_LCDMenuLib_cfg_lcd_type == 303) //8Bit: 10 pin connection - not recommended, for backwards compatibility only
# define _LCDML_lcd_obj LiquidCrystalFast lcd(_LCDML_DISP_rs, _LCDML_DISP_rw, _LCDML_DISP_e, _LCDML_DISP_dat0, _LCDML_DISP_dat1, _LCDML_DISP_dat2, _LCDML_DISP_dat3, _LCDML_DISP_dat4, _LCDML_DISP_dat5, _LCDML_DISP_dat6, _LCDML_DISP_dat7);
# elif(_LCDMenuLib_cfg_lcd_type == 304) //8bit+rw: 11 pin connection - not recommended, for backwards compatibility only
# define _LCDML_lcd_obj LiquidCrystalFast lcd(_LCDML_DISP_rs, _LCDML_DISP_rw, _LCDML_DISP_e, _LCDML_DISP_dat0, _LCDML_DISP_dat1, _LCDML_DISP_dat2, _LCDML_DISP_dat3, _LCDML_DISP_dat4, _LCDML_DISP_dat5, _LCDML_DISP_dat6, _LCDML_DISP_dat7);
# endif
# endif
# endif


Und schließlich in meinem Sketch:
Code: [Select]

#include <LiquidCrystalFast.h>

// settings for lcd
#define _LCDML_DISP_cols 40
#define _LCDML_DISP_rows 4

// pin settings
#define _LCDML_DISP_rs         6    // LCD 11
#define _LCDML_DISP_rw         12   // LCD 10
#define _LCDML_DISP_e1         7    // LCD 9
#define _LCDML_DISP_e2         4    // LCD 15
#define _LCDML_DISP_dat4       11   // LCD 4
#define _LCDML_DISP_dat5       8    // LCD 3
#define _LCDML_DISP_dat6       10   // LCD 2
#define _LCDML_DISP_dat7       9    // LCD 1
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: sphh on Aug 09, 2015, 10:42 pm
Hier die Fortsetzung:

Rotary Encoder

Hier hatte ich kein Glück mit dem eingebauten Drehgeber (oder wie immer das auf Deutsch heißen mag). Manchmal übersprang er bis zu 3 Menüpunkte, manchmal ging er sogar in die andere Richtung. Meine Lösung lautete: Encoder (http://www.pjrc.com/teensy/td_libs_Encoder.html (http://www.pjrc.com/teensy/td_libs_Encoder.html)), der mit Interrupts arbeitet.

Weiter unten wieder meine Änderungen, um ihn zum Laufen zu bringen.

Fehlende Zurück-Taste

Das Problem der fehlenden Zurücktaste löste ich dadurch, das ein Doppelklick auf die zentrale Taste das Menü verlässt. Dazu benutze ich die Switch-Bibliothek (http://www.avdweb.nl/arduino/hardware-interfacing/simple-switch-debouncer.html (http://www.avdweb.nl/arduino/hardware-interfacing/simple-switch-debouncer.html)).

Auch hier frage ich mich, ob es nicht einfacher wäre, dem Anwender die Initialisierung und Auswertung zu überlassen...

Hier die Änderungen für beides:

LCDML_control.ino:
Code: [Select]

// *********************************************************************
#elif(_LCDML_DISP_cfg_control == 5)
#include <Encoder.h>  // http://www.pjrc.com/teensy/td_libs_Encoder.html
Encoder interruptencoder(2, 3);
uint32_t g_LCDML_CONTROL_interruptencoder_timer  = 0;
#include "Switch.h"  // http://www.avdweb.nl/arduino/hardware-interfacing/simple-switch-debouncer.html
Switch btn = Switch(_LCDML_CONTROL_switch_pin, INPUT_PULLUP, LOW, 50, 150, 350);
void LCDML_CONTROL_interruptencoder()
// *********************************************************************
{
  // check encoder time to slow down encoder
  if((millis() - g_LCDML_CONTROL_interruptencoder_timer) >= _LCDML_CONTROL_interruptencoder_time) {
    g_LCDML_CONTROL_interruptencoder_timer = millis(); // reset encoder time

    long newLeft;
    newLeft = interruptencoder.read();
    if      (newLeft > 0) { LCDML_BUTTON_down(); interruptencoder.write(0); }
    else if (newLeft < 0) { LCDML_BUTTON_up()  ; interruptencoder.write(0); }
  }

  // Push button handling
  btn.poll();
  if (btn.longPress()) {
    btn.reset();  // Reset button
    LCDML_BUTTON_enter();
  }
  else if (btn.doubleClick()) {
    btn.reset();
    LCDML_BUTTON_quit();
  }
}


In meinem Sketch:
Code: [Select]

// Rotary encoder with double click control
void LCDML_CONTROL_interruptencoder();
#define _LCDML_DISP_cfg_control                5  // ClickEncoder
// settings encoder (input pins are INPUT_PULLUP!)
#define _LCDML_CONTROL_interruptencoder_pin_a  2  // pin encoder a
#define _LCDML_CONTROL_interruptencoder_pin_b  3  // pin encoder b
#define _LCDML_CONTROL_interruptencoder_time            200
// settings switch
#define _LCDML_CONTROL_switch_pin              A5 //13 // pin taster


Weitere buttons?

Wäre es möglich, weiter Schalter zu ermöglichen? Ich habe gesehen, dass die Zustände aller Schalter in einem Byte gespeichert werden, aber derzeit nur 6 bits verwendet werden (wenn ich den Code richtig deute). Somit wäre noch Platz für zwei weitere Schalter, gerne auch mit generischen Namen. Warum? In meinem Fall fange ich Enter, Up und Down in LCDML_DISP_loop(LCDML_FUNC_initscreen) ab, um den InitScreen zu steuern. Somit kann ich aber mit meinem rotary encoder nicht mehr ins Menü springen... Außer ich bekommen Zugang zum Doppelklick!

Einen schönen Sommer wünsche ich allen!
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: trecords on Aug 23, 2015, 06:56 pm
Hi,

Could someone help me how can I use it with SPI display module ? I have 20X4 display and I think _LCDMenuLib_cfg_lcd_type shoud by "0" in my case.


Regards,
Turkel.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pierrotm777 on Aug 23, 2015, 07:04 pm
Hi,

Could someone help me how can I use it with SPI display module ? I have 20X4 display and I think _LCDMenuLib_cfg_lcd_type shoud by "0" in my case.


Regards,
Turkel.
I dont know if the New_LiquidCrystal 1.2.1 library accept your SPI version ?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Prithul on Sep 04, 2015, 06:42 pm
Hi Jomelo!

Nice library! but i am pretty new with arduino ( about 3 month). but i don't understand how to use the library and i dont know the language of German. So can u please make a tutorial for how to use it?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: pierrotm777 on Sep 05, 2015, 10:55 am
Hi Jomelo!

Nice library! but i am pretty new with arduino ( about 3 month). but i don't understand how to use the library and i dont know the language of German. So can u please make a tutorial for how to use it?
If you know a little bit arduino, just install the library into your IDE libraries folder .
Search the file LCDMenuLib___config.h into this new library.
Open this file with notepad++ .
Into this file, search _LCDMenuLib_cfg_lcd_type and uncomment the ligne that correspond to your LCD type.
Mine is I2C, so i uncomment :
#   define _LCDMenuLib_cfg_lcd_type   115
All other ligne with _LCDMenuLib_cfg_lcd_type must to be commented...

I don't think that SPI LCD config exist for this library...

After that run the arduino IDE and load one example of this library and try ...
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)
Post by: Jomelo on Oct 20, 2015, 08:33 pm
Version 2.01

- Einen Fehler beim Umgang mit dem DogLCD behoben
- Support für Adafruit "i2c / SPI character LCD backpack" ( https://www.adafruit.com/product/292 ) hinyzugefügt.

Die Dokumentation werde ich den nächsten Wochen vervollständigen. 
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: Olli81 on Oct 21, 2015, 11:52 am
Hallo zusammen,

erstmal möchte ich an dieser Stelle ein riesen Lob an Jomelo loswerden für die geniale MenuLib.

Echt beeindruckend was du hier gezaubert hast ;)

Nun zu meiner Frage:

Ich habe im tab LCDML_BACKEND eine Funktion durchgängig laufen mit der ich die aktuelle Temperatur eines Sensors auslese und in der Float-Variable temp ablege.
Dies funktioniert auch ohne Probleme.
Nun möchte ich diese Variable "temp" im tab LCDML_DISP nutzen um dort die Temperatur im initscreen auszugeben.

ich habe die Variable im tab LCDML_BACKEND mit float temp; deklariert und um im tab LCDML_DISP mit extern float temp; um die Werte der Variable dort ausgeben zu können.

Leider bekomme ich immer folgende Fehlermeldung bei kompilieren:
"undefined reference to `temp"

Kann mir hier jemand weiterhelfen?

Vielen Dank im Voraus.

Viele Grüße

Olli
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: Jomelo on Oct 21, 2015, 12:28 pm
Das einfachste ist, wenn du die Variable global definiert anstatt lokal in der Funktion. Lokale Variablen sind nur innerhalb der Funktion gültig, globale auch Funktionsübergreifend.
Definiere die Variable am besten oberhalb von der Setup Funktion im Haubttab.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: Olli81 on Oct 21, 2015, 12:40 pm
Vielen vielen Dank,

es funktioniert ;)

Grüße

Olli
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: robotsgoboop on Oct 21, 2015, 03:40 pm
Hi,

Could someone help me how can I use it with SPI display module ? I have 20X4 display and I think _LCDMenuLib_cfg_lcd_type shoud by "0" in my case.


Regards,
Turkel.
Hi Turkel,

I'm not sure if your LCD and SPI module will work with this library or not, but the adafruit library(https://github.com/adafruit/LiquidCrystal) supports SPI, which LCDMenuLib now supports.

I haven't tested the SPI mode or know what your exact module is, but you might want to download the adafruit library and get the latest version of LCDMenuLib and give it a try. Go to the config and uncomment the line for SPI.

Hope this helps,

Matt
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: Olli81 on Oct 25, 2015, 02:58 am
Hallo zusammen,

ich bin von der LCDMenuLib 2.0 auf 2.01 umgestiegen, da ich gerne mein "Standard" 1602 Display gegen ein I2C 1602 Display ersetzten möchte.

Ist es ausreichend wenn ich die LCDMenuLib 2.0 einfach in den Libraries durch die 2.01 ersetzte und einen Code welche mit der LCDMenuLib 2.0 erzeugt wurde kompiliere oder muss ich den Code auf einem Beispiel der neuen LIB 2.01 erneut aufsetzen?

Also hat sich quasi in den 4 tabs (LCDML_BACKEND, DISP etc...) ebenfalls etwas entscheidendes mit der neuen LIB verändert?

Des Weiteren verstehe ich nicht ganz was ich genau in der LCDMenuLib___config für die Verwendung eines I2C Displays anpassen muss.

In einem "normalen" Code habe ich mein Display wie folgt deklariert: LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);

Ich habe wie von Jomelo beschrieben die neuste new liquid crystal lib in Verwendung und benutzte Arduino 1.6.5.

Es wäre sehr nett wenn mir hier jemand weiterhelfen könnte.

Vielen vielen Dank im Voraus.

Viele Grüße

Olli
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: Jomelo on Oct 25, 2015, 10:56 am
Guten Morgen,

bei der Version 2.01 ist nur der Support für das Adufruit Display hinzugekommen, es gibt ansonsten keine Änderungen.

Wenn du das I2C nutzen willst musst du z.B. die passende I2C LiquidCrystal Lib verwenden. Z.B. diese: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads  (1.2.1). Dabei wird die Normale LiquidCrystal Lib ersetzt. Beim Austausch einer Lib muss die Arduino Software nach dem Austausch einmal neugestartet werden. Die neuste Versioin ( 1.3.4) hab ich noch nicht mit dem LCDMenu getestet. Das werde ich mal nachholen. 

In der *___config.h  musst du dann die folgende Zeile auskommentieren mit  //

Code: [Select]

# define _LCDMenuLib_cfg_lcd_type 0 // 4Bit


und z.B. bei der Zeile die du benötigst das kommentar davor entfernen
Code: [Select]

# define _LCDMenuLib_cfg_lcd_type 115 // I2C with e,rw,rs,dat4,dat5,dat6,dat7,backlight


Dafür müssen dann im Haupttab die Konstanten für I2C verwendet werden.
Code: [Select]

#define _LCDML_DISP_addr 0x20
// optional
#define _LCDML_DISP_rs            0
#define _LCDML_DISP_rw 0
#define _LCDML_DISP_e             0
#define _LCDML_DISP_dat4 0
#define _LCDML_DISP_dat5 0
#define _LCDML_DISP_dat6 0
#define _LCDML_DISP_dat7 0
#define _LCDML_DISP_backlight 0
#define _LCDML_DISP_backlight_pol 0


Schau dir einfach mal das Beispiel LCDML_2_norm_01_connections.ino an.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: Olli81 on Oct 25, 2015, 07:57 pm
Hallo Jomelo,

vielen vielen Dank!!

Habe es dank deiner Beschreibung umsetzen können.

Es funktioniert bestens  :D

Viele Grüße

Olli
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: fernsehass on Oct 28, 2015, 07:46 am
bei mir funktioniert es mit der newliquidcrystal 1.3.4 und lcdmenulib 2.01
die backlight pol will der nicht 0 oder 1 sondern POSITIVE
Code: [Select]

#define _LCDML_DISP_rs                       0
#define _LCDML_DISP_rw 1
#define _LCDML_DISP_e                        2
#define _LCDML_DISP_dat4 4
#define _LCDML_DISP_dat5 5
#define _LCDML_DISP_dat6 6
#define _LCDML_DISP_dat7 7
#define _LCDML_DISP_backlight 3
#define _LCDML_DISP_backlight_pol         POSITIVE
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: sack-c-fix on Nov 09, 2015, 09:58 am
Hallo,

zuerst mal vielen Dank @Jomelo, verwende die Lib bereits in mehreren Projekten, funktioniert immer ohne Probleme.

Nun will ich eine Alarmanlage bauen, die Codeeingabe zum deaktivieren geschieht über eine Matrixtastatur.

Jetzt wäre es natürlich schön wenn ich das Menü ebenfalls über das Keypad steuern könnte, funktioniert im Prinzip über die eingebaute Funtkion auch schon nur werden dann die übrigen Tasten (Zahlen) nicht mehr  übergeben.

Für die alte Version habe ich hier im Thread schon eine Lösung dazu gefunden, gibt es für die neue Version eine bessere Lösung?

Und gibt es nähere Infos zum Backendsystem, wäre für eine Alarmanlage natürlich ideal zu verwenden.

Danke
Andreas
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: DrunkenDude on Dec 07, 2015, 07:13 pm
Moin,

Was muss ich machen das beim Start sofort der initscreen eingeblendet wird ?

wenn ich initscreen_time auf null setze, Bekomme ich eine endlosschleife.


Mein Setup:
Arduino MEGA 2560 R3 ATmega2560
Arduino 1.0.5-r2
LCDMenuLib 2.01

Gruß
DrunkenDude
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: Jomelo on Dec 08, 2015, 08:31 pm
@DrunkenDude:

Im Setup folgendes einfügen:
Code: [Select]

LCDML_DISP_jumpToFunc(LCDML_FUNC_initscreen);


Die Jump Funktion zeigt beim springen Teilweise noch alte Menü Punkte ganz kurz an, den Bug werde ich in den kommenden Tagen beheben.

Hallo,

das meiste funktioniert jetzt, allerdings komme ich bei folgendem nicht weiter:

Wenn die Anlage scharf geschaltet ist soll das Menü gesperrt werden und nur durch Eingabe des Codes wird die Anlage unscharf und die Menüstruktur wieder aktiviert.

Hast du dazu einen Idee?

Vielen Dank
@sack-c-fix
Du kannst den LCDML_BACKEND_control "Task" stoppen, dann ändert sich auch nichts mehr am Menü und die Steuerung ist auch gesperrt. Z.B.

Code: [Select]

LCDML_BACK_stop(LCDML_BACKEND_control); // zum stoppen
LCDML_BACK_start(LCDML_BACKEND_control); // um das Menü wieder frei zu geben


Ich hoffe das Hilft euch weiter.



Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: Tommy_J on Dec 09, 2015, 12:04 pm
ersmals danke für die geleistete Arbeit und das Bereitstellen der Library.

Leider funktioniert es bei bei mir nichr, vorab, ich bin Anfänger :)

Leider will das I2C Display bei mir nicht funktionieren, benutzt wird ein I2C Display 20x4 und einen Arduino Yun.

Das Display funktioniert schon in einem anderem Sketch, hier die Befehle die ich dort benutzt habe:
#include "LiquidCrystal_I2C.h"
#include "LCD.h"
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
....
die benutzte LiquidCristal_I2c-Library ist die 1.3.4, die LcdMenuLib ist Version 2.01

Was ich im an der LCDMenuLib bis jetzt geändert habe:
in der LCDMenuLib_config wurde das vordefinierte Display kommentiert und das Display Typ 115 enkomentiert
Im mittgelieferten Connection- Beispiel wurde die Pins configutriert:

#define _LCDML_DISP_addr 0x27
// optional
#define _LCDML_DISP_rs            0
#define _LCDML_DISP_rw 1
#define _LCDML_DISP_e             2
#define _LCDML_DISP_dat4 4
#define _LCDML_DISP_dat5 5
#define _LCDML_DISP_dat6 6
#define _LCDML_DISP_dat7 7
#define _LCDML_DISP_backlight 3
#define _LCDML_DISP_backlight_pol POSITIVE


es wird alles ohne Fehler kompiliert, jedoch bleibt der Bildschirm leer :(

liegt es am Yun? die Pinbelegung vom Yun ist anders, I2C liegt an D2 und D3?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: Tommy_J on Dec 11, 2015, 12:04 am
Ich weiss nicht wo ich mich verrannt hatte, doch läuft jetzt einwandfrei.
Genau das was ich gesucht habe, mein Projekt sieht jetzt um vieles Hochwertiger aus.
Danke für das Bereitstellen,  super Arbeit :)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/..
Post by: HotSystems on Dec 11, 2015, 12:19 am
@Tommy_J

Kurze Anmerkung:

Die Zeile benötigst du nicht.
#include "LCD.h"
Das LCD wird schon durch die "LiquidCrystal_I2C.h" angesprochen.

Aber es fehlt vermutlich die "Wire.h" bei dir:

Code: [Select]
#include "Wire.h"

Es sei denn, der Code ist an der Stelle unvollständig.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: olistack on Dec 23, 2015, 08:09 pm
Hallo,

ich habe diese Library nun zum ersten mal benutzt.

HW: LCD 20x4 im 8-Bit Modus.

Nein es funktionierte einfach nicht obwohl in der HW alles i.O. war.

Hier der Fehler in der Lib mit welcher ein 8-Bit LCD konfiguriert werden muss.


// pin settings
// =====================================
// 4bit / 8bit connection
// =====================================
#define _LCDML_DISP_rs                17
#define _LCDML_DISP_rw               18
#define _LCDML_DISP_e                 19
#define _LCDML_DISP_dat0             A12
#define _LCDML_DISP_dat1             A13
#define _LCDML_DISP_dat2             A14
#define _LCDML_DISP_dat3             A15
#define _LCDML_DISP_dat4             A8
#define _LCDML_DISP_dat5             A9
#define _LCDML_DISP_dat6             A10
#define _LCDML_DISP_dat7             A11


Richtigerweise wäre dat0 beginnend mit A8,A9,........ Denn an dat0 hängt auch D0 vom Display.

Interessant dass dies noch keinem aufgefallen ist. :-)
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: johbw85 on Dec 28, 2015, 12:59 am
Hallo Jungs könnt ihr mir helfen bin neu auf der Seite und brauche dringend Hilfe von euch hab ein Display TM 404 und will ihn mit arduino uno und auch später mit nano betreiben, und zwar will ich auf dem Display 4 Temperatursensoren anschließen und per Menü die soll werte anstellen wenn die soll werte unterschritten ist soll 4 unterschiedliche Heizungen an gehen. den Display habe ich schon angeschlossen und Grund schrift beschriebe fehlt mir nur noch Menü und 4 bis 5 digital Taster. Den text füge ich bei

LiquidCrystal lcd1(12, 11, 5, 4, 3, 2);
LiquidCrystal lcd2(12, 13, 5, 4, 3, 2);

void setup() {
  lcd1.begin(40, 2);     
  lcd2.begin(40, 2);     
// Displaycontroller 1
  lcd1.setCursor(0, 0);  // Zeilenanfang der 2. Zeile
  lcd1.print("Temperatur 1");
  lcd1.setCursor(38, 0);
  lcd1.print ((char)B11011111);//zeichen für grad
  lcd1.print ("C");
  lcd1.setCursor(0, 1);  // Zeilenanfang der 2. Zeile
  lcd1.print("Temperatur 2");
  lcd1.setCursor(38, 1);
  lcd1.print ((char)B11011111); //zeichen für grad
  lcd1.print ("C");
// Displaycontroller 2
  lcd2.setCursor(0, 0);  // Zeilenanfang der 3. Zeile
  lcd2.print("Temperatur 3");
  lcd2.setCursor(38, 0);
  lcd2.print ((char)B11011111);//zeichen für grad
  lcd2.print ("C");
  lcd2.setCursor(0, 1);  // Zeilenanfang der 4. Zeile
  lcd2.print("Temperatur 4");
  lcd2.setCursor(38, 1);
  lcd2.print ((char)B11011111);//zeichen für grad
  lcd2.print ("C");
 
 
}
void loop() {
 
}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: johbw85 on Dec 28, 2015, 01:06 am
Hallo Jungs könnt ihr mir helfen bin neu auf der Seite und brauche dringend Hilfe von euch hab ein Display TM 404 und will ihn mit arduino uno und auch später mit nano betreiben, und zwar will ich auf dem Display 4 Temperatursensoren anschließen und per Menü die soll werte anstellen wenn die soll werte unterschritten ist soll 4 unterschiedliche Heizungen an gehen. den Display habe ich schon angeschlossen und Grund schrift beschriebe fehlt mir nur noch Menü und 4 bis 5 digital Taster. Den text füge ich bei

LiquidCrystal lcd1(12, 11, 5, 4, 3, 2);
LiquidCrystal lcd2(12, 13, 5, 4, 3, 2);

void setup() {
 lcd1.begin(40, 2);      
 lcd2.begin(40, 2);      
// Displaycontroller 1
 lcd1.setCursor(0, 0);  // Zeilenanfang der 2. Zeile
 lcd1.print("Temperatur 1");
 lcd1.setCursor(38, 0);
 lcd1.print ((char)B11011111);//zeichen für grad
 lcd1.print ("C");
 lcd1.setCursor(0, 1);  // Zeilenanfang der 2. Zeile
 lcd1.print("Temperatur 2");
 lcd1.setCursor(38, 1);
 lcd1.print ((char)B11011111); //zeichen für grad
 lcd1.print ("C");
// Displaycontroller 2
 lcd2.setCursor(0, 0);  // Zeilenanfang der 3. Zeile
 lcd2.print("Temperatur 3");
 lcd2.setCursor(38, 0);
 lcd2.print ((char)B11011111);//zeichen für grad
 lcd2.print ("C");
 lcd2.setCursor(0, 1);  // Zeilenanfang der 4. Zeile
 lcd2.print("Temperatur 4");
 lcd2.setCursor(38, 1);
 lcd2.print ((char)B11011111);//zeichen für grad
 lcd2.print ("C");
 

}
void loop() {

}
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/...)
Post by: HotSystems on Dec 28, 2015, 10:03 am
@johbw85
Warum machst du einen doppelten Eintrag?
Außerdem wird der Code hier in Code-Tags eingefügt, damit dieser besser lesbar ist.

Auch solltest du dich erst mal mit den Grundlagen beschäftigen, damit du auch deine Temperatur im Display anzeigen kannst. Ebenso ist es wichtig die Funktionen der Menüstruktur kennen zu lernen.
Also auch mit dem Menü befassen.

Wenn du dann beides verstanden hast, kannst du den "fertigen" Sketch hier posten.

Wir werden dir sicher keinen fertigen Sketch liefern, sondern nur anhand deines Codes Tipps geben, damit das sauber funktioniert.

Es ist deine Aufgabe und dein Programm, also bitte erst selbst die "grauen Zellen" anstrengen.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: Knieto on Dec 29, 2015, 02:09 pm
Hallo zusammen,

ich kann leider nicht die anderen Seiten der Doku lesen hier im Forum. Ich würde gerne alle Seiten lesen, allerdings funktioniert nur die erste Seite. Bin ich zu doof;-)???
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI)
Post by: HotSystems on Dec 29, 2015, 02:57 pm
Die anderen Seiten fehlen leider noch. Ich vermisse die auch noch, da ich mit der neuen (aktuellen) Version noch nicht richtig klar komme.

Ich wollte jetzt komplett umsteigen, was ich aber leider noch nicht machen kann.

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: skorpi080 on Dec 29, 2015, 04:39 pm
Was wollt ihr denn wissen?
Was ist unklar?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/)
Post by: HotSystems on Dec 29, 2015, 05:10 pm
Aktuell ist bei mir das Problem, dass ich mich nicht mit der neuen Version zurecht finde.
Sie funktioniert prinzipiell, aber mein Projekt "Schaltcomputer" bekomme ich nicht sauber umgesetzt.

In der von mir verwendeten V1.03 (glaub ich) werden alle Funktionen in die entsprechenden "FUNC-dummy" eingesetzt. Natürlich nach meiner Namensvorgabe. Das funktioniert mit allen Funktionen zum Stellen der Uhr, der Schaltzeiten usw.

Wenn der Sketch startet, kommt ein Init-Bildschirm und anschließend zeigt er Uhrzeit und gewünschte Daten an. Im Menü komme ich dann an meine Einstellungen. Alles funktioniert prima.



Bei der neuen Version komme ich da nicht klar.

Der InitBildschirm wird gezeigt aber danach bleibt das Display für die "initscreen_time" dunkel.
Ich vermute, der initscreen ist falsch eingesetzt.

Das andere Problem, wo setze ich meine Funktionen rein, damit ich die Uhr stellen und weiter Einstellungen vornehmen kann.

Ich habe es schon im "Backend-Reiter" unter "LCDML_BACK_setup(LCDML_BACKEND_control)"
oder unter "void LCDML_DISP_loop(LCDML_FUNC_Meine_Funktion) versucht, aber das funktioniert nur bedingt. Meine Einstellungen sind nicht wie früher möglich.

Genau da ist meine Wissenslücke, wie muss ich das zusammensetzen.

Ich freue mich über Infos um das Problem zu lösen.
Danke

Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: skorpi080 on Dec 29, 2015, 05:14 pm
Poste nachher mein Code, da hab ichs mit dem zeit einstellen auch.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: HotSystems on Dec 29, 2015, 05:16 pm
Poste nachher mein Code, da hab ichs mit dem zeit einstellen auch.
Ok, prima, schau ich mir an,

Dank schon mal.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/)
Post by: HotSystems on Dec 30, 2015, 12:25 am
Prima, ich werde das mal durchforsten.
Danke.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: fgfg on Jan 03, 2016, 03:35 pm
Hallo,

ich habe mich mit der Bibliothek schon beschäftigt. Sie ist wirklich nützlich, und nimmt einem viele Aufgaben ab. Die Beispiele habe ich mir durchgelesen und basierend auf "Initscreen" weitergearbeitet. Das aufrufen von eigenen Menüfunktionen innerhalb des Tabs LCDML_DISP klappt problemlos. Diese lesen Einstellungen aus dem EEPROM, nehmen Änderungen entgegen und speichern diese wieder ab.

Ich habe aber mehrere Fragen, die ich mir auch nach durchlesen der erweiterten Beispiele nicht so recht beantworten konnte.
Code: [Select]

LCDML_DISP_add       (0 , _LCDML_G1,  LCDML_root        , 1 , "Messparameter" , LCDML_FUNC);
LCDML_DISP_add       (1 , _LCDML_G1,  LCDML_root_1      , 1 , "Tankbauform"   , LCDML_FUNC);
LCDML_DISP_add       (2 , _LCDML_G1,  LCDML_root_1_1    , 1 , "Zylinder ver." , LCDML_FUNC);
LCDML_DISP_add       (3 , _LCDML_G1,  LCDML_root_1_1_1  , 1 , "Hoehe Sensor" ,  SensorhoeheEinstellen);
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: Jomelo on Jan 03, 2016, 05:09 pm
Hi,

zu Punkt eins:
Funktionen kannst du immer und überall verwenden. Da die eigenen Funktionen eventuell in der Menüfunktion nicht bekannt sind muss du einen Prototypen im Haupttab am besten unterhalb der Includes anlegen.

Code: [Select]

//prototype
void meine_function(int, int);


Irgendwo kannst du dann deine Funktion definieren
Code: [Select]

void meine_function(int a, int b)
{
.....
}

Nun sollte egal von wo, deine Funktion überall im Programm bekannt sein.

zu Punkt zwei:
Das ist wohl ein Bug, über diesen bin ich eben auch gestolpert. Der verschwindet in den nächsten Tagen.

Zu Punkt drei:
Am einfachsten geht das mit globalen Variablen.


Ich bastel im Moment an einem Update, bei dem die LCDMenuLib___config.h weg fällt und man komplett Schnittstellen unabhängig ist. Grafische Displays können dann auch verwendet werden. Bei der Definition des Menüs und im Backendsystem verändert sich nichts.
Die Dokumentation wird mit dem Update angepasst.
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: fgfg on Jan 03, 2016, 06:31 pm
Danke für die Antworten.
Globale Variablen scheinen wohl die einfachste Lösung zu sein. Momentan gibt es mit de RAM ja noch keine Schwierigkeiten, da ich häufig kleine Datentypen verwende, wo möglich. (Boolean als Schaltervariable, Byte z.b. als Arraypointer)

Die weitere geplante entwicklung hört sich sehr gut an. Sind mit graphischen Display solche wie die des Nokia 3310 oder 6100 gemeint?
Title: Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/SPI/...)
Post by: Jomelo on Jan 03, 2016, 07:11 pm
Es ist egal welches Display verwend