Germany, Osnabrück
Offline
Sr. Member
Karma: 8
Posts: 338
E-Technik Student - Master
|
 |
« on: September 29, 2011, 06:36:11 am » |
Projekt: LCDMenuLib - Menüs mit mehreren Ebenen ( Tree-Model / Nested Set ) / (früher LCDMenu2)Verzeichnis:1. Beschreibung 2. Features 3. Einbindung in die Arduino Umgebung 4. Konfiguration der Hardware 5. Menu 5.1 Menu anlegen 5.2 Struktur anlegen (Inhalt ab hier im zweiten Beitrag)6. Menu-Funktionen erstellen 7. Unterstützende Funktionen 8. Steuerungsmöglichkeiten zu 1. Beschreibung:Mit der LCDMenuLib können Menüs die einer Baumstruktur entsprechen erstellt werden, z.B. wie das Inhaltsverzeichnis in diesem Thread. "Verzeichnis" ist das Stammelement unter dem verschiedene Verzeichnispunkte angelegt sind. Auf dem Display wird der Stamm nicht angezeigt. Die Standard Darstellung beginnt mit den ersten Verzweigungen. Das Menu basiert auf dem Nested-Set-Modell ( Nested_Sets). Hier werden Elemente angelegt die immer mit dem vorherigen Button (auf die Ebene bezogen) verknüpft werden. zu 2. Features:- Menupunktbezeichnungen werden im Flash Speicher abgelegt
- 128 Menüpunkte pro Ebene / keine Begrenzungen bei der Ebenen Anzahl
- die letzte Position beim zurückgehen durch die Ebenen wird gespeichert
- automatischer Funktionsaufruf
- Trennung von Struktur- und Funktionsebene
- Leitfaden für den sauberen Programmaufbau / saubere Strukturierung
- Scrollbalken (vereinfacht), falls mehr Menupunkte als Zeilen im Display angezeigt werden
- LCDMenu2 in LCDMenuLib umbenannt
- kompatible zu Arduino Version 1.01 - 1.04
- läuft in Verbindung mit der LiquidCrystal Lib
- unterstützt keine Grafischen Displays
zu 3. Einbdinung in die Arduino Umgebung:Die Lib befindet sich am Ende des ersten Beitrages und muss heruntergeladen werden. Anschließend wird das Archiv entpackt und in das Verzeichnis arduino/libraries/ kopiert. Hierbei muss darauf geachtet werden, das der Ordner LCDMenuLib direkt die *.h und *.cpp Dateien enthält und kein weiterer Unterordner mit der Bezeichnung "LCDMenuLib" existiert. Nach dem Einbinden der Lib muss, falls die Software gestartet war, die Software neugestartet werden. Der Beispiel Code kann über Datei->Beispiele->LCDMenuLib aufgerufen werden. Die weitere Beschreibung bezieht sich auf den Beispiel-Code. Im ersten Tab des Beispielcodes befindet sich die Konfiguration, im zweiten sind die Menu Funktionen angelegt. zu 4. Konfiguration der Hardware:Im Beispiel befindet sich nach dem Einbinden der benötigten Dateien die "DEFINES" die angepasst werden müssen. - anpassen der Zeilen und Spalten des Displays
- anpassen der Ausgänge zum LCD
- Einstellen des Buttonmodes, dieser gibt an wie die Steuerung des Menüs funktioniert (0=serial, 1=analog pin). Weitere Möglichkeiten können ergänzt werden
- Die Button Press Time entprellt die Eingänge
- Der Button Pin ist der Analoge Eingang der für die Tastatur / Buttons verwendet wird. Die Defines die sich darunter befinden legen die analogen Bereich fest, indenen Button Funktionen erkannt werden. Diese Bereiche müssen durch ausprobieren ermittelt werden. Oder wenn man ein Keypad Shild verwendet, kann man die Konfiguration hier im Forum suchen.
zu 5. Menu:zu 5.1. Menu anlegen:Als erstes müssen die Sprachelemente generiert werden. Dies erfolgt über ein Makro, welches die Definitionen der einzelnen Schritte vereinfacht. //..... __LcdMenuLib(0 , Item1 , "Information" , FUNC_information); __LcdMenuLib(1 , Item2 , "Zeit Info" , FUNC_timer_info); __LcdMenuLib(2 , Item3 , "Einstellungen" , FUNC); __LcdMenuLib(3 , Item31 , "Werte veraendern" , FUNC); __LcdMenuLib(4 , Item32 , "Irgendwas" , FUNC); //.....
Beschreibung: - Parameter 1: Interne Bezeichnung um die Sprachelemente zu verknüpfen. Die Nummer am Ende der Bezeichnung muss von 0 aufwärts verlaufen.
- Parameter 2: Item Name der für den Menüpunkt. Dieser ist wichtig um später die Struktur zu erzeugen. Es ist geschickt, wenn man hier die Items schon so benennt, dass diese der Struktur des Menüs entsprechen. Items mit einer Zahl befindet sich auf der obersten Ebene. Items mit zwei Zahlen auf der darunter. Wenn man weiß, dass mehr als 10 Items in einer Ebene sind, sollte die Bezeichnung vielleicht so aussehen: Item_1 für Ebene 1, Item_1_1 für erstes Element in Ebene zwei. Die Benennung der Items ist jedem selbst überlassen.
- Parameter 3: Bezeichnung des Menüpunktes. Kann bei einem 20 Spalten LCD 18 Zeichen lang sein, bei einem 16 Spalten LCD 14 Zeichen.
- Parameter 4: Beinhaltet die Funktion, die aufgerufen wird, wenn der Menupunkt mit "Enter" ausgewählt wird. Die ersten beiden Element rufen eine spezielle Funktion auf. Beim dritten Button ist nur "FUNC" angegeben. Das bedeutet, dass hier eine leere Funktion hinterlegt ist. Bei Menüpunkten die mit "FUNC" erzeugt werden, sind keine Funktionen hinterlegt. Diese Eignen sich um weitere Ebenen im Menü anzulegen. Es ist sinnvoll sich hier das Beispiel anzuschauen.
Unter der Deklaration der Menüpunkte folgen zwei Listen in denen die oben definierten Funktionen hinterlegt werden müssen. Die Anzahl der Elemente die in diesen Listen abgelegt wird muss der Anzahl, der mit __LcdMenuLib generierten Elemente entsprechen und die gleiche Reihenfolge wie unter __LcdMenuLib besitzen. Die erste Liste beinhaltet die Funktionsnamen, die Aufgerufen werden: DigitFuncPtr LCDMenu_functions[] = { FUNC_information, FUNC_timer_info, FUNC, FUNC, FUNC, // .... };
In der zweiten Liste werden die Sprachelemente abgelegt: PROGMEM const char *g_lang_menu_table[] = { __LcdMenuLib_Lang(0), __LcdMenuLib_Lang(1), __LcdMenuLib_Lang(2), __LcdMenuLib_Lang(3), __LcdMenuLib_Lang(4), //....; };
Im Moment ist es noch so, dass diese Listen angepasst werden müssen. Mir ist keine Funktion bekannt die diesen Code generieren kann. Ich wäre dankbar, wenn irgendjemandem hier etwas schlaueres einfällt. zu 5.2. Struktur anlegen:Nachdem die Listen und die Menu Items generiert wurden, kann die Baumstruktur des Menüs angelegt werden. Dazu befindet sich eine Funktion mit dem Namen void CTR_menu_init() im Beispiel: void CTR_menu_init() { Item0.addChild(Item1); Item0.addChild(Item2); Item0.addChild(Item3); Item3.addChild(Item31); Item3.addChild(Item32); //.... }
- Das Item 0 stellt den Stamm der Struktur dar und sollte nicht umbenannt werden.
- Das Item 1 wird hier an der ersten Abzweigung am Stamm an die erste Stelle gesetzt. Die Bezeichnung von Item 1, Item 2, Item XX muss genauso wie in __LcdMenuLib gewählt werden.
- Bei Item 3 ist es so, dass Item 3 sich an der dritten Stelle im Menü auf Ebene 1 befindet. Die Items 31 und 32 befinden sich auf der zweiten Ebene an Stelle 1 und zwei.
- Man kann diese Problematik auch so beschreiben:
Zu jedem Item Objekt werden nun einzelne "Kinder" hinzugefügt. Kinder sind Ebenen die unter einer anderen Ebene liegen. Jedes Kind hat einen Vater (darüber liegend) und kann selber beliebig viele Kinder besitzen. (Klinkt im ersten Moment ein wenig verwirrend ) Jedes Objekt das in Menu Ebene 1 liegt, wird zu dem Objekt "Item0" hinzugefügt. Jedes Menü Objekt das in Menü Ebene 2, ..., n liegt, wird zu dem Objekt das als "Vater" (darüber liegend) hinzugefügt. In diesem Fall ist das Item31 ein Untermenü von Item3, welches wiederum ein Untermenü von Item0 ist. Fortsetzung folgt im nächsten Beitrag:Update 19.04.2013- neue Lib - Beispiel überarbeitet - Dokumentation / Tutorial überarbeitet und angepasst Falls Fragen aufkommen, ihr Verbesserungen habt, oder nicht weiter kommt (im Bezug zum Menu), antwortet bitte auf dieses Thema.
|
|
|
|
« Last Edit: Today at 06:25:57 am by Jomelo »
|
Logged
|
~Es ist so grausam, das der Intelligenz Grenzen gesetzt sind und der Dummheit keine.~
|
|
|
|
Germany, Osnabrück
Offline
Sr. Member
Karma: 8
Posts: 338
E-Technik Student - Master
|
 |
« Reply #1 on: September 29, 2011, 06:37:13 am » |
zu 6. Menufunktionen erstellen:Alle Funktionen die nicht "FUNC" heißen und mit: __LcdMenuLib(0 , Item1 , "Information" , FUNC_information);
angelegt wurden müssen in der zweiten Datei mit void FUNC_information(void) { //inhalt }
angelegt werden. Der Funktionsaufruf erfolgt automatisch, sobald der Menüpunkt mit "Enter" aufgerufen wird. Im Beispiel sind drei Funktionen hinterlegt, die Beispielcode beinhalten. Jede Funktion muss der folgenden Struktur entsprechen, wobei der Funktionsnamen der im Menü angelegten Funktionen entsprechen muss / angepasst werden muss. Die Funktionen werden von der Loop Schleife automatisch immer wieder erneut aufgerufen, solange sie nicht beendet werden. 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. */ /* --------- STOP --------- * LCDML.FuncEnd(direct, enter, up, down, left, right) * Fall 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 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, 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 */ } }
zu 7. Unterstützende Funktionen:Delays würden den Programmablauf stören und zu unerwarteten Problemen führen. Aus diesem Grund wurden eine Hilf Funktionen hinzugefügt, die dies vermeiden soll. // Delay without Delays // Variable global anlegen unter "Globale Variables" unsigned long g_timer_xxBezeichnung = 0;
// In der Menufunktion if(LCDML.Timer(g_timer_xxBezeichnung, 500)) { //quellcode wird nur alle 500 ms einmal ausgeführt }
Wenn man mehrere Timer in verschiedenen Menu Funktionen benötigt, sollte man nicht für jede Funktion eine eigene unsigned long Variable anlegen, sondern die Timer z.B. g_timer_func_1, g_timer_func_2 nennen und in mehreren Funktionen verwenden. Dies spart pro Variable 4Byte Ram. Abfragen ob ein Button betätigt wurde: if(LCDML.checkButtons()) { //irgend ein Button wurde betätigt }
zu 8. Steuerungsmöglichkeiten:Das jetzige Beispiel sieht die Steuerung über die Serielle Schnittstelle mit den Tasten 'a'=links, 's'=down, 'w'=up, 'd'=right, 'e'=enter und 'q' für quit/back/exit vor (Button mode = 0). Alternative kann das Menü über eine Tastatur die über eine geschickte Widerstandswahl an einen analogen Eingang angeschlossen ist bedient werden. Hier können auch beliebige andere Steuerungsmöglichkeiten vorgesehen werden. Folgende Möglichkeiten wurden schon im Forum gesehen: - über eine IR Fernbedienung
- mit einem KeyPadShild
- über Netzwerk
Für die Entwicklung einer eigenen Steuerung gibt es die folgenden Funktionen: LCDML.Button_enter(); LCDML.Button_up(); LCDML.Button_down(); LCDML.Button_left(); LCDML.Button_right(); LCDML.Button_quit();
Im Beispiel befindet sich der Code ganz unten im ersten Tab. z.B. bei ButtonMode_analog() Ich hoffe dieses Tutorial hilft euch weiter. Falls Fragen aufkommen, ihr Verbesserungen habt, oder nicht weiter kommt (im Bezug zum Menu), antwortet bitte auf dieses Thema.
|
|
|
|
« Last Edit: Today at 06:29:22 am by Jomelo »
|
Logged
|
~Es ist so grausam, das der Intelligenz Grenzen gesetzt sind und der Dummheit keine.~
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 89
|
 |
« Reply #2 on: September 29, 2011, 07:26:32 am » |
läuft mit ein paar Veränderungen  DANKE !!!! // 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
|
|
|
|
« Last Edit: September 29, 2011, 07:30:13 am by Yeahuno »
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 3
Posts: 136
|
 |
« Reply #3 on: September 29, 2011, 08:04:44 am » |
Hallo Jomelo, allerherzlichsten Dank für die Projektvorstellung.
Gruss Kurti
|
|
|
|
|
Logged
|
Es gibt nur 10 Arten von Menschen: die, die das Binär-System verstehen und die, die es nicht verstehen.
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 11
|
 |
« Reply #4 on: March 19, 2012, 12:18:31 pm » |
Hallo,
"WProgram.h" muss durch "arduino.h" ersetzt werden. Habe lange gesucht bevor ich als Neuling herausgefunden habe. Gruss helix1
|
|
|
|
|
Logged
|
|
|
|
|
Germany, Osnabrück
Offline
Sr. Member
Karma: 8
Posts: 338
E-Technik Student - Master
|
 |
« Reply #5 on: October 15, 2012, 03:28:07 am » |
Update: - Ich habe die Library auch für die Arduino Version 1.0.1 brauchbar gemacht.
|
|
|
|
|
Logged
|
~Es ist so grausam, das der Intelligenz Grenzen gesetzt sind und der Dummheit keine.~
|
|
|
|
Germany
Offline
Edison Member
Karma: 27
Posts: 1486
|
 |
« Reply #6 on: October 15, 2012, 05:11:58 am » |
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? #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 ...
|
|
|
|
|
Logged
|
|
|
|
|
Germany, Osnabrück
Offline
Sr. Member
Karma: 8
Posts: 338
E-Technik Student - Master
|
 |
« Reply #7 on: October 15, 2012, 06:27:04 am » |
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: #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.
|
|
|
|
|
Logged
|
~Es ist so grausam, das der Intelligenz Grenzen gesetzt sind und der Dummheit keine.~
|
|
|
|
Bardowick
Offline
Newbie
Karma: 0
Posts: 7
|
 |
« Reply #8 on: November 06, 2012, 09:32:00 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Germany, Osnabrück
Offline
Sr. Member
Karma: 8
Posts: 338
E-Technik Student - Master
|
 |
« Reply #9 on: November 06, 2012, 11:43:36 am » |
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.
|
|
|
|
|
Logged
|
~Es ist so grausam, das der Intelligenz Grenzen gesetzt sind und der Dummheit keine.~
|
|
|
|
Bardowick
Offline
Newbie
Karma: 0
Posts: 7
|
 |
« Reply #10 on: November 07, 2012, 10:45:35 am » |
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.txtAn 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
|
|
|
|
|
Logged
|
|
|
|
|
Bardowick
Offline
Newbie
Karma: 0
Posts: 7
|
 |
« Reply #11 on: November 13, 2012, 10:19:33 am » |
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 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() lcd.createChar(0,arrow_up); lcd.createChar(1,arrow_down);
und dann funktioniert zumindest bei mir 
|
|
|
|
« Last Edit: November 15, 2012, 08:33:35 am by offtopic »
|
Logged
|
|
|
|
|
Bardowick
Offline
Newbie
Karma: 0
Posts: 7
|
 |
« Reply #12 on: November 21, 2012, 10:35:08 am » |
Ich verzweifle langsam, was ist an dem Code falsch  es funktionier einfach nicht /* =============================================== * 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); }
|
|
|
|
|
Logged
|
|
|
|
|
Germany, Osnabrück
Offline
Sr. Member
Karma: 8
Posts: 338
E-Technik Student - Master
|
 |
« Reply #13 on: November 21, 2012, 12:23:38 pm » |
Was funktioniert denn genau nicht, und was hast du vor ?
|
|
|
|
|
Logged
|
~Es ist so grausam, das der Intelligenz Grenzen gesetzt sind und der Dummheit keine.~
|
|
|
|
Bardowick
Offline
Newbie
Karma: 0
Posts: 7
|
 |
« Reply #14 on: November 21, 2012, 03:15:57 pm » |
Es soll über LCD Display und Keypad Shield Tasten das Datum einstellen. Es fehlt noch am ende der Befehl rtc.setDate(tag, monat, jahr);
ich wollte, sätzen des Datums mit enter bestätigen und auch beenden. Wie etwa: 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
|
|
|
|
|
Logged
|
|
|
|
|
|