Projekt: LCDMenuLib / LCDMenuLib2 ( LCDML ) - Menü mit mehreren Ebenen

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

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.

Hi, ich habe an der Lib gestern ein Update durchgeführt

Neu

  • Scrollbalken nun so wie bei Internetseiten. Bei einem 16x2 Display mit 8 Stufen, bei 20x4 mit 16 Stufen. Siehe Bilder im Anhang. Der Scrollbalken wird weiterhin nur angezeigt, wenn mehr Einträge als Zeilen vorhanden sind.
  • Scrollbalken kann über eine Config-Datei auf den alten zurückgesetzt werden oder komplett deaktiviert werden.
    Der alte Scrollbalken belegt in etwa 300 Bytes im Flash, der neue 1000 Bytes. Die Änderung muss hier durchgeführt werden:
    arduino/libraries/LCDMenuLib/LCDMenuLib_config.h
//0 = kein Scrollbalken
//1 = komplexer Scrollbalken (neu)
//2 = alter einfacher Scrollbalken
#define _LCDMenuLib_cfg_scrollbar		1
  • es wurde ein Keyfile hinzugefügt, so dass die Funktionen nun vom Syntaxhighliting profitieren

Änderungen

  • alle "__" doppelten Unterstriche wurden entfernt, da solche Bezeichnungen für Preprocessor Variablen vorbehalten sein sollten
  • Kompatibilitätstests durchgeführt zu Arduino 1.0.5
  • Initialisierung weiter vereinfacht, in dem der Quellcode sich in der Lib befindet und nur Makros aufgerufen werden. Lang Tabelle und Zuordnung der Funktionen entfallen.
  • Die defines beginnen nun alle mit LCDMenuLib......, dadurch sind sie eindeutig und kommen nicht mit anderen Libs durcheinander

Falls durch die vielen Änderungen Fehler entstanden sind, dann meldet diese bitte hier!

2013-06-17-1313.jpg

2013-06-17-1314.jpg

2013-06-17-1315.jpg

2013-06-17-1316.jpg

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:

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

Hi,
du musst den Inhalt vom Button zurücksetzen nachdem du abgefragt hast, ob er gedrückt wurde.

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.

//....
/* --------- 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.

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:

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

Habe auch 1.0.5 aufm Mac und funzt einwandfrei.

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

//# Include
//# =======================
#include "arduino.h"
#include <avr/pgmspace.h>
#include <../LiquidCrystal/LiquidCrystal.h>

In der LCDMenu.h groß schreiben und funzt dann auch

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 :wink:

Ich habe die Lib nur unter Windows getestet.

Macht nix Jomelo, ist verzeihlich :smiley:
hast da was feines aufgebaut

Jomelo:
Ich habe die Lib nur unter Windows getestet.

Na da habe ich mit meiner Vermutung ja gar nicht so falsch gelegen :wink:

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:

// 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 :frowning:

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

Frank

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

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 :wink: Du kannst mir die Sachen per PN oder E-Mail schicken.

Frank

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.

LCDMenuLib_I2C.rar (13.7 KB)

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?

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 ?

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:

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

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

DASI funktionierende LCDMenuLib_I2C.zip (14.4 KB)

Arduino ist die neueste und das ganze kommt beim compile deines Beispiels. Ich häng die Lib mal dran.

LCDMenuLib_I2C.7z (10.1 KB)

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.