Guten Tag Arduino-Gemeinde,
ich arbeite seit einigen Wochen an einer Library für das einfache und dynamische Erstellen von Menüs, optermiert für ein LCD Keypadshield (LCD Display mit Button für das navigieren durch ein Menü). Die Library die ich vorstellen werde, ermöglicht es schnell und ohne viele Handgriffe ein komplexes Menü zu erstellen. Im folgenden würde ich nun einfach damit beginnen ein Menü mit einigen Unterpunkten auf zubauen.
Schritt 1.: Planung
Als erstes überlegen wir uns was wir für unsere Menü brauchen. Ich habe als Beispiel folgendes Menü aufgebaut:
Settings -> Sound
Display
Control
LED -> Test LED
Jeder dieser Namen stellt ein MenüItem da. Jedes MenüItem bekommt nun eine nummer zu gewiesen. Dadurch wird es möglich die Items zu verwalten und unter einander bekannt zu machen, sprich wenn man später einen Button drückt ist klar welches Item als nächstes auf dem Display erscheinen soll. Wichtig dabei ist das jedes Item eine einmalige Nummer bekommt.
001 Settings -> 002 Sound
102 Display
202 Control
302 LED -> 033 Test LED
Der Punkt 033: Test Led wird später wenn der Selectbutton gedrückt wurde eine LED zum leuchten bringen.
Nach dem wir nun das Menü geplant haben und jedem Menüpunkt eine Nummer zugewiesen haben können wir Anfangen unser Menü zu programmieren.
Schritt 2.: Anlegen des Menüs und der Items
Als nächtes werden die benötigten Objekte angelegt. Wir beginngen mit dem Menu
// Create a Menu object (The frame you feed with MenuItems)
Menu myMenu;
das Menu objekt verwaltet alle MenuItems und weiß wo hin es geht, wenn ein Button (z.B. Rechts oder Links) gedrückt wurde.
Danach folgen die MenuItems welche die einzelnen Menüpunkte darstellen.
// Create the MenuItems
// Name Number For Back up down
MenuItem item001("Settings", 001, 002, 001, 001, 001);
MenuItem item002("Sound", 002, 002, 001, 302, 102);
MenuItem item102("Display", 102, 102, 001, 002, 202);
MenuItem item202("Controll", 202, 202, 001, 102, 302);
MenuItem item302("LEDs", 302, 033, 001, 202, 002);
MenuItem item033("Test LED", 033, 033, 302, 033, 033);
Wie schon in dem Kommentarbeschrieben wird jetzt jedem Item bekannt gemacht, welcher sein Nachbar ist und von hin es geht wenn der jeweilige Button gedrückt wird. Da wir vorher eine ordentliche Planung durchgeführt haben ist es nun einfach die Items anzulegen.
Schritt 3.: Verbinden der Items und dem Display mit dem Menü
Da diese Libary auf ein Menü für LCD Displays ausgelegt ist brauchen wir natürlich auch ein solches Display. Dieses legen wir an und machen es dem Menü bekannt, damit es Ausgaben auf dem Display tätigen kann.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
lcd.begin(16, 2);
// Add the display to the menu
myMenu.addLCD(&lcd);
Danach können wir die zuvor erzeugen MenuItems dem Menü bekannt machen.
// Add the items to the menu
myMenu.addItem(item001);
myMenu.addItem(item002);
myMenu.addItem(item102);
myMenu.addItem(item202);
myMenu.addItem(item302);
myMenu.addItem(item033);
Ab diesem Punkt ist das Menü erstellt und funktionsfähig. Danach muss natürlich noch festgelegt werden, was passiert wenn die jeweiligen Button gedrückt werden. Dies sollte man aber aus dem folgendem kompletten Beispiel entnehmen.
Zudem werde ich bei Intresse die Libary freigeben. Ich hoffe das meine Erläuterung verständlich genung war und bei einigen Intresse geweckt hat. Außerdem bitte ich um viele Verbesserungsvorschläge bezüglich dieser Vorstellung und natürlich der Libary. Kritik nehme ich eben so gerne an, aber ich bitte um schonende Worte, da dies das erste mal ist das ich solch ein Projekt vorstelle.
In diesem Sinne bin ich auf die Kommentare gespannt und nun das komplette Beispiel
#include <LiquidCrystal.h>
#include <Menu.h>
#include <MenuItem.h>
// Create a Display object
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Create a Menu object (The frame you feed with MenuItems)
Menu myMenu;
// Create the MenuItems
// Name Number For Back up down
MenuItem item001("Settings", 001, 002, 001, 001, 001);
MenuItem item002("Sound", 002, 002, 001, 302, 102);
MenuItem item102("Display", 102, 102, 001, 002, 202);
MenuItem item202("Controll", 202, 202, 001, 102, 302);
MenuItem item302("LEDs", 302, 033, 001, 202, 002);
MenuItem item033("Test LED", 033, 033, 302, 033, 033);
int readButton; // Variable to store the last pressed Button
int select;
void ledTest(){
digitalWrite(13, HIGH);
delay(3000);
digitalWrite(13, LOW);
}
void setup(){
lcd.begin(16, 2);
// Add the display to the menu
myMenu.addLCD(&lcd);
// Add the items to the menu
myMenu.addItem(item001);
myMenu.addItem(item002);
myMenu.addItem(item102);
myMenu.addItem(item202);
myMenu.addItem(item302);
myMenu.addItem(item033);
myMenu.begin(001); // Start at the Menu with at the MenuItem you want
pinMode(13, OUTPUT); // Set pinMode for Test LED
}
void loop(){
readButton = analogRead(0); // read the value from a pushed button
// Check if a button was press
if(readButton < 50){
myMenu.goForward();
}
if(readButton > 50 && readButton < 195){
myMenu.goUp();
}
if(readButton > 195 && readButton < 380){
myMenu.goDown();
}
if(readButton > 380 && readButton < 555){
myMenu.goBack();
}
// Check if selectbutton was press
if(readButton > 555 && readButton < 790){
select = myMenu.select(); //use select() to check if the item you are at has a runable function
switch(select){
case 033: //if found a funtion for a item run it
ledTest();
break;
default:
break;
}
}
readButton = 1000;
}
LcdMenu_v1_0.zip (3.18 KB)