MenuBackend jak się w nim odnaleźć ?

Zbiór tutoriali związanych z Arduino.
adammuze
Młodszy majsterkowicz
Posty: 13
Rejestracja: 13 kwie 2015, 11:18

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: adammuze » 13 kwie 2015, 11:34

Witam. Jestem tu od teraz. Zaczaynam tworzyc menu i chce zrozumieć je z przykładu Wojtka podanego w jego menu backend, ale przy kompilacji pojawia mi się zupełnie nielogiczny błąd. A w zasadzie dwa.

"Arduino: 1.6.1 (Windows 7), Board: "Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

menu_program.ino:11:18: error: expected ',' or '...' before numeric constant

menu_program.ino:276:18: error: expected ',' or '...' before numeric constant

Error compiling."

To linia 11: uint8_t arrowBack[8] = {0x1, 0x1, 0x5, 0x9, 0x1f, 0x8, 0x4};
A to 276: int czytaj_3(int 30, int 31, int 34, int 32, int 33)


Czy macie jakiś pomysł jak usunąć te błędy?
Pozdrawiam, Adam.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: stiven » 13 kwie 2015, 11:54

Kod: Zaznacz cały

 int czytaj_3(int 30, int 31, int 34, int 32, int 33)
A co to jest? Deklarację zmiennej zapisuje się "int nazwa_zmiennej". Nie wiem czy te liczby od 30 do 34, to nazwy zmiennych mają być, czy wartości. Jeśli nazwy zmiennych, no to takich nie można zrobić, nazwa zmiennej nie może się zaczynać od cyfry. Jeśli to ma być wartość, no to pisze się samą liczbę, bez int (albo jeśli jest to przypisywanie wartości do zmiennej, to coś takiego - int a = 30), no ale w deklaracji funkcji tego nie można zrobić. Trzeba podać typ zmiennej i jej nazwę, a wartości przekazuje się przy wywoływaniu funkcji.

Jeśli chodzi o linię 11, to tam nie ma błędu, nie zawsze przy kompilacji jest tam podany właściwy numer linii z błędem, najprawdopodobniej problem jest w linii wcześniejszej.
adammuze
Młodszy majsterkowicz
Posty: 13
Rejestracja: 13 kwie 2015, 11:18

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: adammuze » 13 kwie 2015, 14:30

Te liczby od 30 do 34 to numery pinów (wejść cyfrowych) do których podłączyłem klawiaturę 5cio przyciskowa. Z tutoriala wywnioskowałem że tak właśnie powinienem to wpisać. Czy może użyć nazwy Pin30?
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: stiven » 13 kwie 2015, 14:43

Kod: Zaznacz cały

// dla przykładu jeśli wykorzystujesz piny: 1,2,3,11 i 12 to wołasz : czytaj_2(1,2,3,11,12)
int czytaj_3(int gora, int lewo, int ok, int prawo,int dol)
// gora   - nr pinu cyfrowego do którego podłączony jest przyciski góra
// lewo   - nr pinu cyfrowego do którego podłączony jest przyciski lewo
// ok     - nr pinu cyfrowego do którego podłączony jest przyciski OK
// prawo  - nr pinu cyfrowego do którego podłączony jest przyciski prawo
// dol    - nr pinu cyfrowego do którego podłączony jest przyciski dół
{
if(digitalRead(gora)==LOW) return 1;
if(digitalRead(lewo)==LOW) return 3;
if(digitalRead(ok)==LOW) return 4;
if(digitalRead(prawo)==LOW) return 0;
if(digitalRead(dol)==LOW) return 2;
return -1;
}
więc tak jak pisałem, te numery pinów to wpiszesz w wywołaniu funkcji

Kod: Zaznacz cały

akcja = czytaj_3(30,31,34,32,33); 


a przy deklaracji funkcji, czyli w tej linii 276 wpisujesz 5 razy "int nazwa_zmiennej", nazwy tak na prawdę nie mają żadnego znaczenia.
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: stiven » 13 kwie 2015, 15:37

Przeanalizowałem jak to dokładnie działa.

Całą tę funkcję int czytaj_3(int gora, int lewo, int ok, int prawo,int dol) zostawiasz tak jak jest. Odnajdź za to w kodzie taką linijkę:

Kod: Zaznacz cały

akcja=czytaj_1(0);//delay(300);   // odczyt stanu klawiatury - funkcja czytaj_1 lub czytaj_2 lub czytaj_3
i ją zamień na

Kod: Zaznacz cały

akcja = czytaj_3(30,31,34,32,33); //delay(300);   // odczyt stanu klawiatury - funkcja czytaj_1 lub czytaj_2 lub czytaj_3
i tyle.

O to właśnie chodzi w tym:

Kod: Zaznacz cały

// dla przykładu jeśli wykorzystujesz piny: 1,2,3,11 i 12 to wołasz : czytaj_2(1,2,3,11,12)
(tam chodziło na pewno o czytaj_3 a nie czytaj_2).


No i wiadomo tak jak tam w int czytaj_3(int gora, int lewo, int ok, int prawo,int dol) pierwszy jest przycisk góra, potem lewo itd, to w takiej kolejności musisz wpisać w akcja = czytaj_3(30,31,34,32,33);
adammuze
Młodszy majsterkowicz
Posty: 13
Rejestracja: 13 kwie 2015, 11:18

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: adammuze » 13 kwie 2015, 16:54

Fajnie. Dzięki za łopatologiczne objaśnienie :) Właśnie tego potrzebowałem. Cały czas coś grzebię i wciąż działał mi tylko jeden przycisk. :) Będę się odzywał.
adammuze
Młodszy majsterkowicz
Posty: 13
Rejestracja: 13 kwie 2015, 11:18

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: adammuze » 13 kwie 2015, 17:13

A jednak nie dziła... nie można użyć tego w sposób jaki podałeś.
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: stiven » 13 kwie 2015, 17:20

A co się dzieje? Wrzuć może cały swój kod.

//
Przesadziłem chyba z tym całym kodem, bo to za długie jest. Zmieniłeś tylko tą jedną linijkę "akcja = ..."? Reszta jest tak jak było w przykładowym kodzie?
adammuze
Młodszy majsterkowicz
Posty: 13
Rejestracja: 13 kwie 2015, 11:18

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: adammuze » 13 kwie 2015, 18:00

Kod: Zaznacz cały

#include <Wire.h>
#include <MenuBackend.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd (12, 11, 5, 4, 3, 2);



uint8_t arrowUpDown[8] = {0x4, 0xe, 0x15, 0x4, 0x15, 0xe, 0x4};
uint8_t arrowDown[8]  = {0x4, 0x4, 0x4, 04, 0x15, 0xe, 0x4};
uint8_t arrowRight[8] = {0x0, 0x4, 0x2, 0x1f, 0x2, 0x4, 0x0};
uint8_t arrowLeft[8] = {0x0, 0x4, 0x8, 0x1f, 0x8, 0x4, 0x0};
uint8_t arrowBack[8] = {0x1, 0x1, 0x5, 0x9, 0x1f, 0x8, 0x4};

volatile int zm = -1;
volatile int x = -1;
volatile int stan_Analog;
 
char *linia1;
char *linia2;


MenuBackend menu = MenuBackend(menuUseEvent, menuChangeEvent); // konstruktor
//                        ("                ")
MenuItem P1 =  MenuItem("     PLIK", 1);
MenuItem P11 = MenuItem("     Nowy", 2);
MenuItem P12 = MenuItem("    Otworz", 2);
MenuItem P13 = MenuItem("  Szkicownik", 2);
MenuItem P14 = MenuItem("  Przyklady", 2);
MenuItem P15 = MenuItem("    Zapisz", 2);
MenuItem P16 = MenuItem(" Zapisz jako..", 2);
MenuItem P17 = MenuItem("   Zaladuj", 2);
MenuItem P18 = MenuItem("     Exit", 2);

MenuItem P2 = MenuItem("    EDYCJA", 1);
MenuItem P21 = MenuItem("    Wytnij", 2);
MenuItem P22 = MenuItem("    Kopiuj", 2);
MenuItem P23 = MenuItem("     Wklej", 2);
MenuItem P24 = MenuItem("    Zaznacz", 2);
MenuItem P25 = MenuItem("    Znajdz", 2);

MenuItem P3 = MenuItem("     SZKIC", 1);
MenuItem P31 = MenuItem("   Weryfikuj", 2);
MenuItem P32 = MenuItem("   Kompiluj", 2);
MenuItem P33 = MenuItem("   Importuj", 3);
MenuItem P331 = MenuItem(" Menu Backend", 4);
MenuItem P332 = MenuItem("    EEPROM", 4);
MenuItem P333 = MenuItem("   KeyBoard", 4);
MenuItem P334 = MenuItem("      GSM", 4);

MenuItem P4 = MenuItem("  NARZEDZIA", 1);
MenuItem P41 = MenuItem("    Plytka", 3);
MenuItem P411 = MenuItem("  Arduino Uno", 4);
MenuItem P412 = MenuItem("   Leonardo", 4);
MenuItem P413 = MenuItem("   Decimila", 4);
MenuItem P414 = MenuItem("   LilyPad", 4);
MenuItem P415 = MenuItem("     Nano", 4);
MenuItem P42 = MenuItem("    Odczyt", 3);
MenuItem P421 = MenuItem(" Temperatura", 4);
MenuItem P422 = MenuItem("     COM 2", 4);
MenuItem P423 = MenuItem("    COM 13", 4);
MenuItem P43 = MenuItem("  Programator", 3);
MenuItem P431 = MenuItem("    USBasp", 4);
MenuItem P432 = MenuItem("    AVR ISP", 4);
MenuItem P433 = MenuItem(" AVR ISP MK II", 4);

MenuItem P5 = MenuItem("     POMOC", 1);
MenuItem P51 = MenuItem("  Jak zaczac", 2);
MenuItem P52 = MenuItem("  Srodowisko", 2);
MenuItem P53 = MenuItem(" Dokumentacja", 2);
MenuItem P54 = MenuItem("  O Arduino", 2);
void menuSetup()                       // funkcja klasy MenuBackend
{
  menu.getRoot().add(P1);          
  P1.add(P11);                     
  P11.add(P12); P11.addLeft(P1); 
  
  P12.add(P13); P12.addLeft(P1); // analogicznie robimy ze wszystkimi podopcjami dla PLIK
  P13.add(P14); P13.addLeft(P1);
  P14.add(P15); P14.addLeft(P1);
  P15.add(P16); P15.addLeft(P1);
  P16.add(P17); P16.addLeft(P1);
  P17.add(P18); P17.addLeft(P1);
  P18.addLeft(P1); P18.add(P11); 
  
  P1.addRight(P2);                 // po prawej dla PLIK jest EDYCJA
  P2.add(P21);                     // rodzic EDYCJA ma dziecko Wytnij
  P21.add(P22); P21.addLeft(P2); 
  P22.add(P23); P22.addLeft(P2); // analogicznie dla wszystkich podopcji
  P23.add(P24); P23.addLeft(P2);
  P24.add(P25); P24.addLeft(P2);
  P25.addLeft(P2); P25.add(P21); 
  P2.addRight(P3);                 // na prawo od EDYCJA jest SZKIC
  P3.add(P31);                     // rodzic SZKIC ma dziecko Weryfikuj
  P31.add(P32); P31.addLeft(P3); 
  P32.add(P33); P32.addLeft(P3); 
  P33.addRight(P331);            
  
  // kolejne dziecko dla SZKIC, a w projekcie jest inaczej
  P331.add(P332); P331.addLeft(P33); 
  P332.add(P333); P332.addLeft(P33); // postepujemy analogicznie
  P333.add(P334); P333.addLeft(P33);
  P334.addLeft(P33); P334.add(P331);
  P33.addLeft(P3); P33.add(P31);  
  P3.addRight(P4);                  // dalej podobnie ....
  P4.add(P41);
  P41.addRight(P411);             // kolejne dziecko, ktore ma dziecko :-)
  P411.add(P412); P411.addLeft(P41);
  P412.add(P413); P412.addLeft(P41);
  P413.add(P414); P413.addLeft(P41);
  P414.add(P415); P414.addLeft(P41);
  P415.addLeft(P41); P415.add(P411); 
  P41.addLeft(P4);
  P41.add(P42);
  P42.addRight(P421);
  P421.add(P422); P421.addLeft(P42);
  P422.add(P423); P422.addLeft(P42);
  P423.addLeft(P42); P423.add(P421); 
  P42.addLeft(P4);
  P42.add(P43);
  P43.addRight(P431);
  P431.add(P432); P431.addLeft(P43);
  P432.add(P433); P432.addLeft(P43);
  P433.addLeft(P43); P433.add(P431); 
  P43.addLeft(P4); P43.add(P41);
  P4.addRight(P5);
  P5.add(P51);
  P51.add(P52); P51.addLeft(P5);
  P52.add(P53); P52.addLeft(P5);
  P53.add(P54); P53.addLeft(P5);
  P54.addLeft(P5); P54.add(P51);    
  P5.addRight(P1);                  

}


void menuUseEvent(MenuUseEvent used)      

{
  Serial.print("wybrano:  "); Serial.println(used.item.getName()); 
 
  if (used.item.getName() == "    Otworz")  
  {
    lcd.setCursor(1, 0); lcd.print("Otwieram drzwi"); // info
    digitalWrite(0, HIGH); delay(2000); digitalWrite(0, LOW); 
    
    lcd.setCursor(1, 0); lcd.print("              "); lcd.setCursor(1, 0); lcd.print(linia1); //poprzedni stan LCD
  }
  if (used.item.getName() == " Temperatura")  
  {
    int temp = 21;                       
    lcd.setCursor(0, 0); lcd.write(7);   
    lcd.print("              "); lcd.setCursor(1, 0); lcd.print("Ust.temp. = "); 
    lcd.setCursor(13, 0); lcd.print(temp); 
    int  akcja = -1; delay(1000);      
    
    while (akcja != 4)                
    
    {
      zm = -1;
      int czytaj_3(int buttonUp = 30, int buttonLeft = 32, int buttonConf = 34, int buttonRight = 33,  int buttonDown = 31);
      akcja = czytaj_3(0);
        
      if (zm != akcja) 
      {
        if (akcja == 1) {
          temp++;
          if (temp > 99)temp = 99;
          lcd.setCursor(13, 0);
          lcd.print(temp);
          delay(300);
        }
       
        if (akcja == 2)  {
          temp--;
          if (temp < 10)temp = 10;
          lcd.setCursor(13, 0);
          lcd.print(temp);
          delay(300);
        }
        
        
        if (akcja == 4) 
        {
          lcd.setCursor(0, 0); lcd.print("*Temperatura OK"); delay(2000); // pokazujemy OK przez 2 sek.
          lcd.setCursor(1, 0); lcd.print("              "); 
          lcd.setCursor(1, 0); lcd.print(linia1);         // odtwarzamy poprzedni stan na LCD
        }
      }
      
    } zm = akcja; 
    
  }
  
}

void menuChangeEvent(MenuChangeEvent changed)  // funkcja klasy MenuBackend
{
  
  
  int c = changed.to.getShortkey();                       // pobieramy shortkey (1,2,3, lub4)
  lcd.clear();                                            // bez komentarza
  lcd.setCursor(0, 0);
  if (c == 1)                                             
  {
    lcd.write(3);                                         
    strcpy(linia1, changed.to.getName());                 // tworzymy napis w pierwszej linii
    lcd.print(linia1);                                    
    lcd.setCursor(15, 0); lcd.write(4);                   
    lcd.setCursor(0, 1); lcd.write(5);                    
    lcd.setCursor(15, 1); lcd.write(5);                   
  }
  if (c == 2)                                           
  {
    lcd.print("*");                                       
    strcpy(linia2, changed.to.getName());                 // tworzymy napis w pierwszej linii
    lcd.print(linia1);                                    
    lcd.setCursor(15, 0); lcd.print("*");                 // gwiazdka
    lcd.setCursor(0, 1); lcd.write(6);                    
    lcd.print(changed.to.getName());                      
    lcd.setCursor(15, 1); lcd.write(7);                   
  }
  if (c == 3)                                           
  {
    lcd.print("*");                                       // gwiazdka
    strcpy(linia2, changed.to.getName());                 // kopiujemy akt. nazwe opcji menu do zmiennej linia2
    lcd.print(linia1);                                    
    lcd.setCursor(15, 0); lcd.print("*");                 // gwiazdka
    lcd.setCursor(0, 1); lcd.write(6);                    
    lcd.print(changed.to.getName());                      
    lcd.setCursor(15, 1); lcd.write(4);                   
  }

  if (c == 4)                                           
  {
    lcd.print("*");                                       // gwaizdka
    lcd.print(linia2);                                    
    lcd.setCursor(15, 0); lcd.print("*");                 // gwaizdka
    lcd.setCursor(0, 1); lcd.write(6);                    
    lcd.print(changed.to.getName());                      
    lcd.setCursor(15, 1); lcd.write(7);                   
  }
}

int czytaj_3(int buttonUp = 30, int buttonLeft = 32, int buttonConf = 34, int buttonRight = 33,  int buttonDown = 31)

{
  if (digitalRead(buttonUp) == LOW) return 1;
  if (digitalRead(buttonLeft) == LOW) return 3;
  if (digitalRead(buttonConf) == LOW) return 4;
  if (digitalRead(buttonRight) == LOW) return 0;
  if (digitalRead(buttonDown) == LOW) return 2;
  return -1;
}



// ============================================================================================
//
void setup()


{
  LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
  
  linia1 = new char[16]; 
  linia2 = new char[16];
 
 
 
  Serial.begin(9600);   
  lcd.begin(16, 2);     // inicjacja LCD
  lcd.createChar(3, arrowLeft);   
  lcd.createChar(4, arrowRight);
  lcd.createChar(5, arrowDown);
  lcd.createChar(6, arrowBack);
  lcd.createChar(7, arrowUpDown);
  
  
  
  
  #define buttonUp 30
  #define buttonLeft 32
  #define buttonConf 34
  #define buttonRight 33
  #define buttonDown 31
  
  
   pinMode(30,INPUT);digitalWrite(30,HIGH);
   pinMode(32,INPUT);digitalWrite(32,HIGH);
   pinMode(34,INPUT);digitalWrite(34,HIGH);
   pinMode(33,INPUT);digitalWrite(33,HIGH);
   pinMode(31,INPUT);digitalWrite(31,HIGH);

  pinMode(0, OUTPUT); digitalWrite(0, LOW); 
  menuSetup();         
  menu.moveDown();      
  
 
 
}

void loop()
{
  x = czytaj_3(0); delay(30);          // odczytujemy stan klawiatury:
  if (zm != x)                            
  {
    switch (x)                          // sprawdzamy co nacisnieto
    {
      case 0: menu.moveRight(); break;    
      case 1: menu.moveUp(); break;       
      case 2: menu.moveDown(); break;     
      case 3: menu.moveLeft(); break;     // menu w lewo
      case 4: menu.use(); break;         
        }
  } zm = x;                              
  }

Program reaguje tylko na sygnał z przycisku podpiętego pod pin 32. I nie działa on 'w lewo' tylko 'do góry'. Jest jakiś progres ale wciąż powoli. Usunąłem większość komentarzy bo tekst zamienił się w dziwne znaki jakby nie odpowiadało ich kodowanie.
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: stiven » 13 kwie 2015, 18:13

Kod: Zaznacz cały

    #include <Wire.h>
    #include <MenuBackend.h>
    #include <LiquidCrystal.h>

    LiquidCrystal lcd (12, 11, 5, 4, 3, 2);

    uint8_t arrowUpDown[8] = {0x4, 0xe, 0x15, 0x4, 0x15, 0xe, 0x4};
    uint8_t arrowDown[8]  = {0x4, 0x4, 0x4, 04, 0x15, 0xe, 0x4};
    uint8_t arrowRight[8] = {0x0, 0x4, 0x2, 0x1f, 0x2, 0x4, 0x0};
    uint8_t arrowLeft[8] = {0x0, 0x4, 0x8, 0x1f, 0x8, 0x4, 0x0};
    uint8_t arrowBack[8] = {0x1, 0x1, 0x5, 0x9, 0x1f, 0x8, 0x4};

    volatile int zm = -1;
    volatile int x = -1;
    volatile int stan_Analog;
     
    char *linia1;
    char *linia2;

    MenuBackend menu = MenuBackend(menuUseEvent, menuChangeEvent); // konstruktor
    //                        ("                ")
    MenuItem P1 =  MenuItem("     PLIK", 1);
    MenuItem P11 = MenuItem("     Nowy", 2);
    MenuItem P12 = MenuItem("    Otworz", 2);
    MenuItem P13 = MenuItem("  Szkicownik", 2);
    MenuItem P14 = MenuItem("  Przyklady", 2);
    MenuItem P15 = MenuItem("    Zapisz", 2);
    MenuItem P16 = MenuItem(" Zapisz jako..", 2);
    MenuItem P17 = MenuItem("   Zaladuj", 2);
    MenuItem P18 = MenuItem("     Exit", 2);

    MenuItem P2 = MenuItem("    EDYCJA", 1);
    MenuItem P21 = MenuItem("    Wytnij", 2);
    MenuItem P22 = MenuItem("    Kopiuj", 2);
    MenuItem P23 = MenuItem("     Wklej", 2);
    MenuItem P24 = MenuItem("    Zaznacz", 2);
    MenuItem P25 = MenuItem("    Znajdz", 2);

    MenuItem P3 = MenuItem("     SZKIC", 1);
    MenuItem P31 = MenuItem("   Weryfikuj", 2);
    MenuItem P32 = MenuItem("   Kompiluj", 2);
    MenuItem P33 = MenuItem("   Importuj", 3);
    MenuItem P331 = MenuItem(" Menu Backend", 4);
    MenuItem P332 = MenuItem("    EEPROM", 4);
    MenuItem P333 = MenuItem("   KeyBoard", 4);
    MenuItem P334 = MenuItem("      GSM", 4);

    MenuItem P4 = MenuItem("  NARZEDZIA", 1);
    MenuItem P41 = MenuItem("    Plytka", 3);
    MenuItem P411 = MenuItem("  Arduino Uno", 4);
    MenuItem P412 = MenuItem("   Leonardo", 4);
    MenuItem P413 = MenuItem("   Decimila", 4);
    MenuItem P414 = MenuItem("   LilyPad", 4);
    MenuItem P415 = MenuItem("     Nano", 4);
    MenuItem P42 = MenuItem("    Odczyt", 3);
    MenuItem P421 = MenuItem(" Temperatura", 4);
    MenuItem P422 = MenuItem("     COM 2", 4);
    MenuItem P423 = MenuItem("    COM 13", 4);
    MenuItem P43 = MenuItem("  Programator", 3);
    MenuItem P431 = MenuItem("    USBasp", 4);
    MenuItem P432 = MenuItem("    AVR ISP", 4);
    MenuItem P433 = MenuItem(" AVR ISP MK II", 4);

    MenuItem P5 = MenuItem("     POMOC", 1);
    MenuItem P51 = MenuItem("  Jak zaczac", 2);
    MenuItem P52 = MenuItem("  Srodowisko", 2);
    MenuItem P53 = MenuItem(" Dokumentacja", 2);
    MenuItem P54 = MenuItem("  O Arduino", 2);
    void menuSetup()                       // funkcja klasy MenuBackend
    {
      menu.getRoot().add(P1);         
      P1.add(P11);                     
      P11.add(P12); P11.addLeft(P1);

      P12.add(P13); P12.addLeft(P1); // analogicznie robimy ze wszystkimi podopcjami dla PLIK
      P13.add(P14); P13.addLeft(P1);
      P14.add(P15); P14.addLeft(P1);
      P15.add(P16); P15.addLeft(P1);
      P16.add(P17); P16.addLeft(P1);
      P17.add(P18); P17.addLeft(P1);
      P18.addLeft(P1); P18.add(P11);
     
      P1.addRight(P2);                 // po prawej dla PLIK jest EDYCJA
      P2.add(P21);                     // rodzic EDYCJA ma dziecko Wytnij
      P21.add(P22); P21.addLeft(P2);
      P22.add(P23); P22.addLeft(P2); // analogicznie dla wszystkich podopcji
      P23.add(P24); P23.addLeft(P2);
      P24.add(P25); P24.addLeft(P2);
      P25.addLeft(P2); P25.add(P21);
      P2.addRight(P3);                 // na prawo od EDYCJA jest SZKIC
      P3.add(P31);                     // rodzic SZKIC ma dziecko Weryfikuj
      P31.add(P32); P31.addLeft(P3);
      P32.add(P33); P32.addLeft(P3);
      P33.addRight(P331);           
     
      // kolejne dziecko dla SZKIC, a w projekcie jest inaczej
      P331.add(P332); P331.addLeft(P33);
      P332.add(P333); P332.addLeft(P33); // postepujemy analogicznie
      P333.add(P334); P333.addLeft(P33);
      P334.addLeft(P33); P334.add(P331);
      P33.addLeft(P3); P33.add(P31); 
      P3.addRight(P4);                  // dalej podobnie ....
      P4.add(P41);
      P41.addRight(P411);             // kolejne dziecko, ktore ma dziecko :-)
      P411.add(P412); P411.addLeft(P41);
      P412.add(P413); P412.addLeft(P41);
      P413.add(P414); P413.addLeft(P41);
      P414.add(P415); P414.addLeft(P41);
      P415.addLeft(P41); P415.add(P411);
      P41.addLeft(P4);
      P41.add(P42);
      P42.addRight(P421);
      P421.add(P422); P421.addLeft(P42);
      P422.add(P423); P422.addLeft(P42);
      P423.addLeft(P42); P423.add(P421);
      P42.addLeft(P4);
      P42.add(P43);
      P43.addRight(P431);
      P431.add(P432); P431.addLeft(P43);
      P432.add(P433); P432.addLeft(P43);
      P433.addLeft(P43); P433.add(P431);
      P43.addLeft(P4); P43.add(P41);
      P4.addRight(P5);
      P5.add(P51);
      P51.add(P52); P51.addLeft(P5);
      P52.add(P53); P52.addLeft(P5);
      P53.add(P54); P53.addLeft(P5);
      P54.addLeft(P5); P54.add(P51);   
      P5.addRight(P1);                 

    }

    void menuUseEvent(MenuUseEvent used)     

    {
      Serial.print("wybrano:  "); Serial.println(used.item.getName());
     
      if (used.item.getName() == "    Otworz") 
      {
        lcd.setCursor(1, 0); lcd.print("Otwieram drzwi"); // info
        digitalWrite(0, HIGH); delay(2000); digitalWrite(0, LOW);
       
        lcd.setCursor(1, 0); lcd.print("              "); lcd.setCursor(1, 0); lcd.print(linia1); //poprzedni stan LCD
      }
      if (used.item.getName() == " Temperatura") 
      {
        int temp = 21;                       
        lcd.setCursor(0, 0); lcd.write(7);   
        lcd.print("              "); lcd.setCursor(1, 0); lcd.print("Ust.temp. = ");
        lcd.setCursor(13, 0); lcd.print(temp);
        int  akcja = -1; delay(1000);     
       
        while (akcja != 4)               
       
        {
          zm = -1;
          akcja = czytaj_3(30,31,34,32,33);
           
          if (zm != akcja)
          {
            if (akcja == 1) {
              temp++;
              if (temp > 99)temp = 99;
              lcd.setCursor(13, 0);
              lcd.print(temp);
              delay(300);
            }
           
            if (akcja == 2)  {
              temp--;
              if (temp < 10)temp = 10;
              lcd.setCursor(13, 0);
              lcd.print(temp);
              delay(300);
            }
           
           
            if (akcja == 4)
            {
              lcd.setCursor(0, 0); lcd.print("*Temperatura OK"); delay(2000); // pokazujemy OK przez 2 sek.
              lcd.setCursor(1, 0); lcd.print("              ");
              lcd.setCursor(1, 0); lcd.print(linia1);         // odtwarzamy poprzedni stan na LCD
            }
          }
         
        } zm = akcja;
       
      }
     
    }

    void menuChangeEvent(MenuChangeEvent changed)  // funkcja klasy MenuBackend
    {
      int c = changed.to.getShortkey();                       // pobieramy shortkey (1,2,3, lub4)
      lcd.clear();                                            // bez komentarza
      lcd.setCursor(0, 0);
      if (c == 1)                                             
      {
        lcd.write(3);                                         
        strcpy(linia1, changed.to.getName());                 // tworzymy napis w pierwszej linii
        lcd.print(linia1);                                   
        lcd.setCursor(15, 0); lcd.write(4);                   
        lcd.setCursor(0, 1); lcd.write(5);                   
        lcd.setCursor(15, 1); lcd.write(5);                   
      }
      if (c == 2)                                           
      {
        lcd.print("*");                                       
        strcpy(linia2, changed.to.getName());                 // tworzymy napis w pierwszej linii
        lcd.print(linia1);                                   
        lcd.setCursor(15, 0); lcd.print("*");                 // gwiazdka
        lcd.setCursor(0, 1); lcd.write(6);                   
        lcd.print(changed.to.getName());                     
        lcd.setCursor(15, 1); lcd.write(7);                   
      }
      if (c == 3)                                           
      {
        lcd.print("*");                                       // gwiazdka
        strcpy(linia2, changed.to.getName());                 // kopiujemy akt. nazwe opcji menu do zmiennej linia2
        lcd.print(linia1);                                   
        lcd.setCursor(15, 0); lcd.print("*");                 // gwiazdka
        lcd.setCursor(0, 1); lcd.write(6);                   
        lcd.print(changed.to.getName());                     
        lcd.setCursor(15, 1); lcd.write(4);                   
      }

      if (c == 4)                                           
      {
        lcd.print("*");                                       // gwaizdka
        lcd.print(linia2);                                   
        lcd.setCursor(15, 0); lcd.print("*");                 // gwaizdka
        lcd.setCursor(0, 1); lcd.write(6);                   
        lcd.print(changed.to.getName());                     
        lcd.setCursor(15, 1); lcd.write(7);                   
      }
    }

    int czytaj_3(int buttonUp, int buttonLeft, int buttonConf, int buttonRight,  int buttonDown)
    {
      if (digitalRead(buttonUp) == LOW) return 1;
      if (digitalRead(buttonLeft) == LOW) return 3;
      if (digitalRead(buttonConf) == LOW) return 4;
      if (digitalRead(buttonRight) == LOW) return 0;
      if (digitalRead(buttonDown) == LOW) return 2;
      return -1;
    }



    // ============================================================================================
    //
    void setup()
    {
      LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
     
      linia1 = new char[16];
      linia2 = new char[16];
  
      Serial.begin(9600);   
      lcd.begin(16, 2);     // inicjacja LCD
      lcd.createChar(3, arrowLeft);   
      lcd.createChar(4, arrowRight);
      lcd.createChar(5, arrowDown);
      lcd.createChar(6, arrowBack);
      lcd.createChar(7, arrowUpDown);

       pinMode(30,INPUT);digitalWrite(30,HIGH);
       pinMode(32,INPUT);digitalWrite(32,HIGH);
       pinMode(34,INPUT);digitalWrite(34,HIGH);
       pinMode(33,INPUT);digitalWrite(33,HIGH);
       pinMode(31,INPUT);digitalWrite(31,HIGH);

      pinMode(0, OUTPUT); digitalWrite(0, LOW);
      menuSetup();         
      menu.moveDown();     
    }

    void loop()
    {
      x = czytaj_3(30,31,34,32,33); delay(30);          // odczytujemy stan klawiatury:
      if (zm != x)                           
      {
        switch (x)                          // sprawdzamy co nacisnieto
        {
          case 0: menu.moveRight(); break;   
          case 1: menu.moveUp(); break;       
          case 2: menu.moveDown(); break;     
          case 3: menu.moveLeft(); break;     // menu w lewo
          case 4: menu.use(); break;         
            }
      } zm = x;                             
      }
adammuze
Młodszy majsterkowicz
Posty: 13
Rejestracja: 13 kwie 2015, 11:18

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: adammuze » 13 kwie 2015, 18:27

Kompiluje, nie ma błędów. Po wgraniu nie wyświetla się nic, nie reaguje żaden przycisk. Jedynie kiedy wejdę do monitora portu po wciśnięciu dwóch pierwszych przycisków czyli UP & LEFT jednoczesnie wyskakuje komunikat "wybrano: Menu Root"
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: stiven » 13 kwie 2015, 18:51

Nie wiem. Przyciski masz podłączone tak, że zwierają do masy? Tak jak tutaj:
http://arduino.cc/en/Tutorial/InputPullupSerial
adammuze
Młodszy majsterkowicz
Posty: 13
Rejestracja: 13 kwie 2015, 11:18

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: adammuze » 13 kwie 2015, 19:18

Zbudowałem coś takiego. :)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: stiven » 13 kwie 2015, 19:35

Program jest napisany pod tamtą "wersję". Jeśli chcesz mieć swoją wersję, to trzeba trochę zmodyfikować program, dokładniej funkcję setup i czytaj_3:

Kod: Zaznacz cały

 int czytaj_3(int buttonUp, int buttonLeft, int buttonConf, int buttonRight,  int buttonDown)
    {
      if (digitalRead(buttonUp) == HIGH) return 1;
      if (digitalRead(buttonLeft) == HIGH) return 3;
      if (digitalRead(buttonConf) == HIGH) return 4;
      if (digitalRead(buttonRight) == HIGH) return 0;
      if (digitalRead(buttonDown) == HIGH) return 2;
      return -1;
    }



    // ============================================================================================
    //
    void setup()
    {
      LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
     
      linia1 = new char[16];
      linia2 = new char[16];
 
      Serial.begin(9600);   
      lcd.begin(16, 2);     // inicjacja LCD
      lcd.createChar(3, arrowLeft);   
      lcd.createChar(4, arrowRight);
      lcd.createChar(5, arrowDown);
      lcd.createChar(6, arrowBack);
      lcd.createChar(7, arrowUpDown);

       pinMode(30,INPUT);
       pinMode(32,INPUT);
       pinMode(34,INPUT);
       pinMode(33,INPUT);
       pinMode(31,INPUT);

      pinMode(0, OUTPUT); digitalWrite(0, LOW);
      menuSetup();         
      menu.moveDown();     
    }
I jeszcze jedna rzecz. Przycisk musisz odpowiednio podłączyć, ponieważ jedna para nóżek jest ze sobą wewnętrznie połączona na stałe i druga też:

Obrazek
Ostatnio zmieniony 13 kwie 2015, 19:37 przez stiven, łącznie zmieniany 1 raz.
adammuze
Młodszy majsterkowicz
Posty: 13
Rejestracja: 13 kwie 2015, 11:18

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: adammuze » 13 kwie 2015, 19:52

Aha. Już rozumiem. W sumie prosty błąd. Bardzo Dziękuję!
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: stiven » 13 kwie 2015, 19:57

Teraz albo zmienisz w programie, to co poprzednio napisałem, albo zmienisz połączenie przycisków, żeby tylko zwierały do masy, już bez żadnych rezystorów. No i musisz sprawdzić, jak te przyciski masz połączone.
adammuze
Młodszy majsterkowicz
Posty: 13
Rejestracja: 13 kwie 2015, 11:18

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: adammuze » 14 kwie 2015, 14:53

Teraz przyciski zwierają do masy. Pozostało mi 'wypełnić' program funkcjami których potrzebuję do działania mojego urządzenia. Czyli sporo kopania w tutorialach. :) Dzięki wielkie za pomoc i poświęcony czas Panowie. Pozdrawiam i do zobaczenia ;)
zgoda
Majsterkowicz
Posty: 60
Rejestracja: 23 cze 2016, 09:58

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: zgoda » 23 cze 2016, 10:15

Da się przy użyciu tej biblioteki zrobić menu z dynamiczną zawartością? Mam 3 pozycje w menu głównym, w pierwszej do 10 podpozycji pobieranych z sieci i do każdej z nich po 3 podpozycje statyczne, w drugiej 3 podpozycje statyczne, w trzeciej żadnych podpozycji, tylko akcja na klik.
zgoda
Majsterkowicz
Posty: 60
Rejestracja: 23 cze 2016, 09:58

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: zgoda » 24 cze 2016, 11:03

zgoda pisze:Da się przy użyciu tej biblioteki zrobić menu z dynamiczną zawartością? Mam 3 pozycje w menu głównym, w pierwszej do 10 podpozycji pobieranych z sieci i do każdej z nich po 3 podpozycje statyczne, w drugiej 3 podpozycje statyczne, w trzeciej żadnych podpozycji, tylko akcja na klik.
OK, chyba się da, przynajmniej kod "wygląda na działający" (ale sprawdzę dopiero jak przyjdzie drugi LCD zza siedniu mórz):

Kod: Zaznacz cały

void fillMenu(const BrewInfo brewList[], size_t listSize) {
  static const uint8_t name_sz = 21;
  char buf[name_sz];
  MenuItem* miBrews = menu.getRoot().getAfter();  // to jest 1 pozycja w menu głównym
  strcpy_P(buf, MI_BREW_INFO);
  MenuItem mBrewInfo = MenuItem(buf, MenuItemType::mainLevel);
  strcpy_P(buf, MI_BREW_SET_MATURATION);
  MenuItem mBrewMaturation = MenuItem(buf, MenuItemType::mainLevel);
  strcpy_P(buf, MI_BREW_SET_DISPENSE);
  MenuItem mBrewDisp = MenuItem(buf, MenuItemType::mainLevel);
  for (size_t i = 0; i < listSize; i++) {
    snprintf_P(buf, name_sz, BREW_MENUITEM_NAME, brewList[i].brewId, brewList[i].name);
    MenuItem item = MenuItem(buf, MenuItemType::withSubmenu);
    item.add(mBrewInfo);
    item.add(mBrewMaturation);
    item.add(mBrewDisp);
    miBrews->add(item);
  }
}
Jedyne o co się obawiam, to zasięg zmiennych - czy w runtime się nie okaże, że czytam poza zakresem. Tego w C/C++ jeszcze nie do końca ogarniam, na co dzień robię w nieco bardziej cywilizowanych językach i od jakichś 20 lat nie miałem do czynienia z C. Gdyby ktoś miał ochotę oberzeć całość, to na bitbucket repo zgoda/HAS i katalog cstation (nie mogę jeszcze wstawiać linków, więc trzeba ręcznie).

Tę samą aplikację mógłbym zrobić na jakimś RPi (faktycznie wcześniejsza wersja chodziła na RPi 1B), ale co to za wyzwanie, zresztą takie rzeczy na co dzień we fabryce robię. ;)
zgoda
Majsterkowicz
Posty: 60
Rejestracja: 23 cze 2016, 09:58

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: zgoda » 30 cze 2016, 12:04

No i widzę już że nie działa, ale to jest raczej problem z C++ niż z samą ideą. Tworząc w pętli obiekty MenuItem i przekazując do metody add() tak naprawdę przekazuję adres zmiennej item, który w przypadku całkowicie statycznej alokacji pamięci za każdym razem jest ten sam (w każdym obrocie pętli zmienna znika bo jest poza zakresem i tworzenie nowego obiektu odbywa się w tym samym miejscu pamięci). W efekcie wszystkie wskaźniki wskazują na ten sam obszar i mam kilka razy tę samą pozycję w podmenu. Nie ukrywam, że trochę mnie to przerasta, albo mikrokontrolery nie są stworzone do takich rzeczy.
mikpachol
Młodszy majsterkowicz
Posty: 2
Rejestracja: 16 kwie 2017, 12:46

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: mikpachol » 17 kwie 2017, 15:50

Wie ktoś może jak przerobić ten kod na klawisze na pinach od 12 do 7 oraz na wyświetlacz z modułem l2c ??

wywala mi takie błędy przy mojej kompilacji

Kod: Zaznacz cały

Arduino:1.8.3 Hourly Build 2017/04/14 10:33 (Windows 10), Płytka:"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

modyfikacja_menu_woow:20: error: 'menuUseEvent' was not declared in this scope

     MenuBackend menu = MenuBackend(menuUseEvent, menuChangeEvent); // konstruktor

                                    ^

modyfikacja_menu_woow:20: error: 'menuChangeEvent' was not declared in this scope

     MenuBackend menu = MenuBackend(menuUseEvent, menuChangeEvent); // konstruktor

                                                  ^

exit status 1
'menuUseEvent' was not declared in this scope

Ten raport powinien zawierać więcej informacji jeśli w 
File -> Preferencje zostanie włączona opcja "Pokaż
szczegółowe informacje podczas kompilacji"
chudy69
Młodszy majsterkowicz
Posty: 5
Rejestracja: 17 maja 2014, 17:37

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: chudy69 » 3 lis 2018, 17:07

Witam mam pewien problem przy kompilacji oryginalnego programu lub od kolegi wojtekizk mam problem przy kompilacji zawsze wywala error przy deklaracji konstuktora.
Obrazek
Awatar użytkownika
Marhef
Złota rączka
Posty: 1134
Rejestracja: 18 lis 2011, 02:18

Re: MenuBackend jak się w nim odnaleźć ?

Post autor: Marhef » 3 lis 2018, 19:37

Wygląda to na to, że brakuje biblioteki do obsługi menu. Dodałeś tak, jak powinieneś?
ODPOWIEDZ

Strony partnerskie: