Pages: 1 [2] 3 4 ... 24   Go Down
Author Topic: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...)  (Read 35780 times)
0 Members and 1 Guest are viewing this topic.
Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 26
Posts: 583
E-Technik Student - Master
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Bardowick
Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
anbei der Code:
https://www.dropbox.com/s/k9ptqho9zbs2xpl/Kirys_menu1.txt
Ich wollte auch den gleichen Code (nach Modifikationen) fürs Zeit einstellen verwenden.
Gruß
offtopic
Logged

Bardowick
Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Fehler gefunden smiley
das ist in void setup() gewandert:
Code:
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
Gruß
offtopic
Logged

Cloppenburg
Offline Offline
God Member
*****
Karma: 23
Posts: 809
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Arduino UNO, Ethernet Shield, Keypad Shield
1284p, Arduino MEGA.

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2455
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 26
Posts: 583
E-Technik Student - Master
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Berlin
Offline Offline
Jr. Member
**
Karma: 1
Posts: 69
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: April 14, 2013, 02:52:45 am by Rtdler » Logged

Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 26
Posts: 583
E-Technik Student - Master
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vermutlich in der Loop Funktion, ich bastel gleich mal ein Beispiel wie das dann aussehen könnte.
Logged

Berlin
Offline Offline
Jr. Member
**
Karma: 1
Posts: 69
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 26
Posts: 583
E-Technik Student - Master
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 26
Posts: 583
E-Technik Student - Master
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 26
Posts: 583
E-Technik Student - Master
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Code:
//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 (35.05 KB, 448x168 - viewed 32 times.)

* 2013-06-17-1314.jpg (32.13 KB, 448x174 - viewed 26 times.)

* 2013-06-17-1315.jpg (33.61 KB, 448x168 - viewed 21 times.)

* 2013-06-17-1316.jpg (34.26 KB, 448x166 - viewed 28 times.)
« Last Edit: June 18, 2013, 03:19:05 pm by Jomelo » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
« Last Edit: July 20, 2013, 05:07:13 am by LutzB » Logged

Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 26
Posts: 583
E-Technik Student - Master
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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:
//....
/* --------- 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.
Logged

Pages: 1 [2] 3 4 ... 24   Go Up
Jump to: