kolejne menu dla arduino - nebari - 13-03-2018
Po długim grzebaniu w sieci znalazłem kod "startowy" do zrobienia sobie nawigacji menu. Jako że nie jestem programistą chciałem poprzerabiać sobie kod aby uzyskać następującą strukturę:
Kod: // ------------------- SCHEMAT NAWIGACJI MENU -------------------------------
MENU:
ZEGAR: - > GODZINA 00:00
KONIEC
TWARDOŚĆ KH: - > 0 - 20 (do wyboru z zakresu)
KONIEC
LAMPA: - > GODZINA START 00:00
GODZINA STOP 00:00
MANUAL: (0-255) bezpośrednie rozjaśnianie i ściemnianie lampy
KONIEC
WIATRAK: - > TEMPERATURA 20-30
HISTEREZA 0.0-1.0 (w kroku co 0.1)
KONIEC
WYJŚCIE (z menu do panelu głównego)
sam kod był praktycznie bez komentarza więc nie mogę ogarnąć tematu co za co odpowiada i jak i gdzie go rozbudować. Pierwszy poziom (główny) generalnie się wyświetla i na początek jest OK.
Kod jest następujący:
Kod: #include "U8glib.h"
U8GLIB_ST7920_128X64_1X u8g(13, 12, 11); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
#define KEY_NONE 0
#define KEY_PREV 1
#define KEY_NEXT 2
#define KEY_SELECT 3
#define KEY_BACK 4
uint8_t uiKeyPrev = 7;
uint8_t uiKeyNext = 8;
uint8_t uiKeySelect = 9;
uint8_t uiKeyBack = 4;
uint8_t uiKeyCodeFirst = KEY_NONE;
uint8_t uiKeyCodeSecond = KEY_NONE;
uint8_t uiKeyCode = KEY_NONE;
void uiSetup(void) {
pinMode(uiKeyPrev, INPUT_PULLUP); // ustawienie pinu pullup
pinMode(uiKeyNext, INPUT_PULLUP); // ustawienie pinu pullup
pinMode(uiKeySelect, INPUT_PULLUP); // ustawienie pinu pullup
pinMode(uiKeyBack, INPUT_PULLUP); // ustawienie pinu pullup
}
void uiStep(void) {
uiKeyCodeSecond = uiKeyCodeFirst;
if ( digitalRead(uiKeyPrev) == LOW )
uiKeyCodeFirst = KEY_PREV;
else if ( digitalRead(uiKeyNext) == LOW )
uiKeyCodeFirst = KEY_NEXT;
else if ( digitalRead(uiKeySelect) == LOW )
uiKeyCodeFirst = KEY_SELECT;
else if ( digitalRead(uiKeyBack) == LOW )
uiKeyCodeFirst = KEY_BACK;
else
uiKeyCodeFirst = KEY_NONE;
if ( uiKeyCodeSecond == uiKeyCodeFirst )
uiKeyCode = uiKeyCodeFirst;
else
uiKeyCode = KEY_NONE;
}
#define MENU_ITEMS 5
const char *menu_strings[MENU_ITEMS] = { "ZEGAR", "TWARDOSC HK", "LAMPA", "WIATRAK", "WYJSCIE" };
uint8_t menu_current = 0;
uint8_t menu_redraw_required = 0;
uint8_t last_key_code = KEY_NONE;
void drawMenu(void) {
uint8_t i, h;
u8g_uint_t w, d;
u8g.setFont(u8g_font_6x13);
u8g.setFontRefHeightText();
u8g.setFontPosTop();
h = u8g.getFontAscent()-u8g.getFontDescent();
w = u8g.getWidth();
for( i = 0; i < MENU_ITEMS; i++ ) {
d = (w-u8g.getStrWidth(menu_strings[i]))/2;
u8g.setDefaultForegroundColor();
if ( i == menu_current ) {
u8g.drawBox(0, i*h+1, w, h);
u8g.setDefaultBackgroundColor();
}
u8g.drawStr(d, i*h, menu_strings[i]);
}
}
void updateMenu(void) {
if ( uiKeyCode != KEY_NONE && last_key_code == uiKeyCode ) {
return;
}
last_key_code = uiKeyCode;
switch ( uiKeyCode ) {
case KEY_NEXT:
menu_current++;
if ( menu_current >= MENU_ITEMS )
menu_current = 0;
menu_redraw_required = 1;
break;
case KEY_PREV:
if ( menu_current == 0 )
menu_current = MENU_ITEMS;
menu_current--;
menu_redraw_required = 1;
break;
}
}
void setup() {
// rotate screen, if required
// u8g.setRot180();
uiSetup(); // setup key detection and debounce algorithm
menu_redraw_required = 1; // force initial redraw
}
void loop() {
uiStep(); // check for key press
if ( menu_redraw_required != 0 ) {
u8g.firstPage();
do {
drawMenu();
} while( u8g.nextPage() );
menu_redraw_required = 0;
}
updateMenu(); // update menu bar
}
Moje pytania:
- gdzie buduje się (i jak) dodawać kolejne pod poziomy MENU,
- jak zmienić podświetlanie linii w zwykły wskaźnik np: ->,
- co i jak ustawić aby menu wyświetlało się w następujący sposób:
Kod: MENU:
------------------------------------------
ZEGAR
TWARDOSC KH
-> LAMPA
WIATRAK
WYJSCIE
po wyborze pozycja np. LAMPA ekran:
LAMPA:
--------------------------------------
-> GODZINA START
GODZINA STOP
MANUAL
KONIEC
RE: kolejne menu dla arduino - nebari - 14-03-2018
Czy jest jakiś mocarz z arduino i rozwieje moje pytania?
RE: kolejne menu dla arduino - kaczakat - 16-03-2018
To menu to tylko wizualizacja wyświetlania w przykładach biblioteki do ekranu. Spokojnie można dodać obsługę przyciskow select i back, coś tam będzie działać. Od biedy można dorobić jedno podmenu w ten sam sposób, ale dla każdej opcji to już będzie kłopotliwe. Zresztą zrób sobie do końca, tak by działał poziom 1 menu, zmianę wyboru robisz oczywiście tam gdzie jest rysowany prostokąt i zmiana kolorów:
Kod: void drawMenu(void) {
uint8_t i, h;
u8g_uint_t w, d;
u8g.setFont(u8g_font_6x13);
u8g.setFontRefHeightText();
u8g.setFontPosTop();
h = u8g.getFontAscent()-u8g.getFontDescent();
w = u8g.getWidth();
for( i = 0; i < MENU_ITEMS; i++ ) {
d = (w-u8g.getStrWidth(menu_strings[i]))/2;
//u8g.setDefaultForegroundColor();
if ( i == menu_current ) {
//u8g.drawBox(0, i*h+1, w, h);
// u8g.setDefaultBackgroundColor();
d-=16; //odsuwamy sie by narysowac dzide, tekst nie moze byc za dlugi, albo sprawdzic czy wynik>=0
u8g.drawStr(d, i*h, "->");
d+=16; //wracamy by narysowac napis w starym miejscu
}
u8g.drawStr(d, i*h, menu_strings[i]);
}
}
Potem zapoznaj się z menubackend: https://majsterkowo.pl/forum/tutoriale-f38/menubackend-jak-sie-w-nim-odnalezc-t1549.html
lub generator menu: http://www.cohesivecomputing.co.uk/hackatronics/arduino-lcd-menu-library/
inne menu z submenu: https://forum.arduino.cc/index.php?topic=480040.0
Ale jak miałeś problem jak wstawić dzidę, to sam pomyśl czy już na to czas.
RE: kolejne menu dla arduino - error105 - 16-03-2018
Tak na prawde, proste menu ogarnie kazdy kto umie uzyc zmienne, dodac i odjac od tej zmiennej cyfre guzikiem i ustawic stan w zaleznosci od tej zmiennej
w skrocie, tworzysz zmienna dajmy na to MENU = 0
Do tego dwa guziki - dalej i wstecz ktore dodaja lub odejmuja 1 od zmiennej menu, dwa guziki zwiekszajace/zmniejszajace wartosc ktora chcesz edytowac, i opcjonalnie jak potrzeba oddzielny guzik do wejacia do menu.
Zasada prosta
If menu == 0
// wyswietlaj glowny ekran czy program.
If menu == 1
// wyswietlaj menu1
Itp.....
|