Skocz do zawartości

Menu obsługiwane za pomocą przycisków.


dragolice

Pomocna odpowiedź

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...?

Link do komentarza
Share on other sites

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.

 

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.