• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
kolejne menu dla arduino
#1
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
 
Odpowiedź
#2
Czy jest jakiś mocarz z arduino i rozwieje moje pytania?
 
Odpowiedź
#3
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-f...t1549.html
lub generator menu: http://www.cohesivecomputing.co.uk/hacka...u-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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#4
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 Smile

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.....
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości