Skocz do zawartości

Menu obsługiwane za pomocą przycisków.


Pomocna odpowiedź

No przycisk jest to numer klawisza, który zwraca funkcja POBIERZ_PRZYCISK.

U góry sobie dodałem taki zapis (nie ma u góry):

enum {BRAK, PRZYCISK1, PRZYCISK2, PRZYCISK3, PRZYCISK4};

2 minuty temu, dragolice napisał:

No przycisk jest to numer klawisza, który zwraca funkcja POBIERZ_PRZYCISK.

U góry sobie dodałem taki zapis (nie ma u góry):

enum {BRAK, PRZYCISK1, PRZYCISK2, PRZYCISK3, PRZYCISK4};

OK, a gdzie wywołujesz ten PRZYCISK1 albo PRZYCISK2...?

int PRZYCISK = 0;
enum {BRAK, PRZYCISK1, PRZYCISK2, PRZYCISK3, PRZYCISK4};


PRZYCISK = POBIERZ_PRZYCISK();

switch(PRZYCISK)
{
     case 1:
       Zrób to tak;
       PRZYCISK = POBIERZ_PRZYCISK();
    
       switch(PRZYCISK)
       {
         case 1:
           Zrób w ten sposób;
           
         case 2:
           Ato w ten;
       }

     case 2:
       chce do case 1 w switchu w case 1 tego switcha;
}

int POBIERZ_PRZYCISK(void)
{
  int PRZYCISK = BRAK;

  while (PRZYCISK != PRZYCISK1 && PRZYCISK != PRZYCISK2 && PRZYCISK != PRZYCISK3 && PRZYCISK != PRZYCISK4)
  {
    if (digitalRead(2) == LOW)
    {
      PRZYCISK = PRZYCISK1;
    }

    if (digitalRead(3) == LOW)
    {
      PRZYCISK = PRZYCISK2;
    }

    if (digitalRead(4) == LOW)
    {
      PRZYCISK = PRZYCISK3;
    }

    if (digitalRead(5) == LOW)
    {
      PRZYCISK = PRZYCISK4;
    }
  }
  while (digitalRead(2) == LOW || digitalRead(3) == LOW || digitalRead(4) == LOW || digitalRead(5) == LOW);
  return PRZYCISK;
}


To może inaczej. Od początku. Z tego co się orientuję to jak wywołam tą funkcję na dole, czyli POBIERZ_PRZYCISK to na pinie gdzie pojawi się stan niski zostanie on wykryty. Jak zostanie on wykryty np. na pinie 4 to do zmiennej PRZYCISK będzie przypisana wartość zmiennej PRZYCISK3, a wynosi ona 3, bo tak wynika z jej deklaracji. Czyli jeśli zmienna PRZYCISK wynosi 3 to jest zwracana przez funkcję POBIERZ_PRZYCISK po jego zwolnieniu.

Po wywołaniu funkcji POBIERZ_PRZYCISK i otrzymaniu wartości klawisza w zmiennej PRZYCISK mogę zrobić switch(PRZYCISK) bo wynosi on 3 i będzie odpowiadał dla case 3:.

Każdorazowe wywołanie funkcji POBIERZ_PRZYCISK w locie podmienia wartość zmiennej PRZYCISK stąd drugi switch(PRZYCISK) już może być wykonany dla innego case, np. 2.

Napisałem bo wcześniej ktoś pisał, że mało prawdopodobne, że będzie inna wartość zmiennej w tym drugim switchu.

 

(edytowany)

To nie tak.

Konstrukcja loop:

Pobierz przycisk.

Jeśli wciśnięty, zrób coś

Koniec

Poza tym w większości przypadków nie "przycisk jest wciśnięty" tylko "przycisk został wciśnięty" (inaczej: przed chwilą nie był a teraz jest).

Edytowano przez ethanak

Którego słowa w zdaniu "przycisk został wciśniety" nie rozumiesz?

Dobra rada dziadka ethanaka: posłuchaj rad kolegi @SOYER, bo ma trochę większe doswiadczenie w tym, co chcesz zrobić.

Oczywiscie nie musisz - ale to już nie nasz problem.

Nie wiem do czego pijesz, bo nigdzie nie napisałem, że przycisk "jest wciśnięty", w funkcji POBIERZ_PRZYCISK też jest pętla, która puszcza dalej kod tylko wtedy gdy przycisk zostanie zwolniony.

Piszesz niejasno i stąd moje pytanie. To tyle.

(edytowany)

Poszedłem na łatwiznę i zrobiłem to menu z wykorzystaniem dotykowego wyświetlacza.
Niestety mam kłopot bo przełącza mi kolejne ekrany "automatycznie", nie czekając na przycisk. Warunki jakie są postawione wewnątrz pętli while jakby nie istniały.
Rzuci ktoś pomocnym okiem?

#include <UTFT.h>                                     // Dołączenie biblioteki do obsługi wyświetlacza
#include <URTouch.h>
#include <UTFT_Buttons.h>

extern uint8_t SmallFont[];                           // Deklaracja małej czcionki
extern uint8_t BigFont[];                             // Deklaracja dużej czcionki
extern uint8_t Dingbats1_XL[];

UTFT myGLCD(ITDB32S, 38, 39, 40, 41);                 // Deklaracja wyświetlacza i jego pinów () RS, WR, CS, RSET
URTouch myTouch(6, 5, 4, 3, 2);
UTFT_Buttons  myButtons(&myGLCD, &myTouch);

boolean default_colors = true;

int pressed_button;
int but11, but12;
int but21, but22;
int but31, but32;

void setup()
{
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);

  myTouch.InitTouch();
  myTouch.setPrecision(PREC_HI);

  myButtons.setTextFont(SmallFont);
  myButtons.setSymbolFont(Dingbats1_XL);

  menu1();
}

void loop()
{
  while (myTouch.dataAvailable() == true)
  {
    pressed_button = myButtons.checkButtons();

    if (pressed_button == but11)
    {
      myGLCD.print("Button 1", 110, 220);
      myButtons.deleteButton(but11);
      myButtons.deleteButton(but12);
      menu2();
    }

    if (pressed_button == but12)
    {
      myGLCD.print("Button 2", 110, 220);
      myButtons.deleteButton(but11);
      myButtons.deleteButton(but12);
      menu3();
    }

    if (pressed_button == but21)
    {
      myGLCD.print("Button 21", 110, 220);
    }

    if (pressed_button == but22)
    {
      myGLCD.print("Button 22", 110, 220);
      myButtons.deleteButton(but21);
      myButtons.deleteButton(but22);
      menu1();
    }
    /////////////////////////////////////////////////////////////

    if (pressed_button == but31)
      myGLCD.print("Button 31", 110, 220);

    if (pressed_button == but32)
    {
      myGLCD.print("Button 32", 110, 220);
      myButtons.deleteButton(but31);
      myButtons.deleteButton(but32);
      menu1();
    }
  }
}
  
  void menu1()
  {
    myGLCD.clrScr();

    myButtons.setButtonColors(VGA_WHITE, VGA_GRAY, VGA_BLACK, VGA_RED, 0xC618);
    but11 = myButtons.addButton(10, 40, 145, 70, "Obrabiarka 1");
    but12 = myButtons.addButton(165, 40, 145, 70, "Obrabiarka 2");
    myButtons.drawButtons();
  }

  void menu2()
  {
    myGLCD.clrScr();

    myButtons.setButtonColors(VGA_WHITE, VGA_GRAY, VGA_BLACK, VGA_RED, 0xC618);
    but21 = myButtons.addButton( 170,  80, 65,  30, "Wlacz");
    but22 = myButtons.addButton( 245,  80, 65,  30, "Wylacz");
    myButtons.drawButtons();
  }

  void menu3()
  {
    myGLCD.clrScr();

    myButtons.setButtonColors(VGA_WHITE, VGA_GRAY, VGA_BLACK, VGA_RED, 0xC618);
    but31 = myButtons.addButton( 170,  80, 65,  30, "Wlacz");
    but32 = myButtons.addButton( 245,  80, 65,  30, "Wylacz");
    myButtons.drawButtons();
  }

Z tego co udało mi się ustalić to pokazuje się informacja "Button 11" potem "Button21" tak jakby te przyciski były wciskane i zgłupiałem, czy jest błąd w programie, czy to przyciski w jakiś magiczny sposób są wciskane i trzeba dodać jakieś obejście?

Film prezentujący zachowanie programu:

https://www.youtube.com/watch?v=k22HivovR7E

 

Po wprowadzeniu takich zmian sytacja ma się lepiej, lecz widać przy drugim przycisku w menu 1, że automatycznie z niego wychodzi. Natomiast w przypadku gdy w menu 1 wcisnę przycisk obrabiarka 1 i przejdę do menu 2 to zainstalowany licznik liczy, że przycisk but21 jest automatycznie wciskany gdy się do niego przejdzie.

#include <UTFT.h>                                     // Dołączenie biblioteki do obsługi wyświetlacza
#include <URTouch.h>
#include <UTFT_Buttons.h>

extern uint8_t SmallFont[];                           // Deklaracja małej czcionki
extern uint8_t BigFont[];                             // Deklaracja dużej czcionki
extern uint8_t Dingbats1_XL[];

UTFT myGLCD(ITDB32S, 38, 39, 40, 41);                 // Deklaracja wyświetlacza i jego pinów () RS, WR, CS, RSET
URTouch myTouch(6, 5, 4, 3, 2);
UTFT_Buttons  myButtons(&myGLCD, &myTouch);

boolean default_colors = true;

int pressed_button;
int but11, but12;
int but21, but22;
int but31, but32;

int menu = 1;
int i = 0;

void setup()
{
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);

  myTouch.InitTouch();
  myTouch.setPrecision(PREC_HI);

  myButtons.setTextFont(SmallFont);
  myButtons.setSymbolFont(Dingbats1_XL);

  menu1();
}

void loop()
{
  while (myTouch.dataAvailable() == true)
  {
    pressed_button = myButtons.checkButtons();
    if (menu == 1)
    {
      if (pressed_button == but11)
      {
        myGLCD.print("Button 1", 110, 220);
        myButtons.deleteButton(but11);
        myButtons.deleteButton(but12);
        menu = 2;
        menu2();
      }

      if (pressed_button == but12)
      {
        myGLCD.print("Button 2", 110, 220);
        myButtons.deleteButton(but11);
        myButtons.deleteButton(but12);
        menu = 3;
        menu3();
      }
    }
    if (menu == 2)
    {
      if (pressed_button == but21)
      {
        i++;
        myGLCD.printNumI(i, 110, 220);
      }

      if (pressed_button == but22)
      {
        myGLCD.print("Button 22", 110, 220);
        myButtons.deleteButton(but21);
        myButtons.deleteButton(but22);
        menu = 1;
        menu1();
      }
    }
    /////////////////////////////////////////////////////////////
    if (menu == 3)
    {
      if (pressed_button == but31)
        myGLCD.print("Button 31", 110, 220);

      if (pressed_button == but32)
      {
        myGLCD.print("Button 32", 110, 220);
        myButtons.deleteButton(but31);
        myButtons.deleteButton(but32);
        menu = 1;
        menu1();
      }
    }
  }
}

void menu1()
{
  myGLCD.clrScr();

  myButtons.setButtonColors(VGA_WHITE, VGA_GRAY, VGA_BLACK, VGA_RED, 0xC618);
  but11 = myButtons.addButton(10, 40, 145, 70, "Obrabiarka 1");
  but12 = myButtons.addButton(165, 40, 145, 70, "Obrabiarka 2");
  myButtons.drawButtons();
}

void menu2()
{
  myGLCD.clrScr();

  myButtons.setButtonColors(VGA_WHITE, VGA_GRAY, VGA_BLACK, VGA_RED, 0xC618);
  but21 = myButtons.addButton( 170,  80, 65,  30, "Wlacz");
  but22 = myButtons.addButton( 245,  80, 65,  30, "Wylacz");
  myButtons.drawButtons();
}

void menu3()
{
  myGLCD.clrScr();

  myButtons.setButtonColors(VGA_WHITE, VGA_GRAY, VGA_BLACK, VGA_RED, 0xC618);
  but31 = myButtons.addButton( 170,  80, 65,  30, "Wlacz");
  but32 = myButtons.addButton( 245,  80, 65,  30, "Wylacz");
  myButtons.drawButtons();
}

Film prezentujący zachowanie programu:

https://www.youtube.com/watch?v=-TWKzxrSYiI

Edytowano przez dragolice

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...