dragolice Luty 28, 2023 Autor tematu Udostępnij Luty 28, 2023 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}; Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Luty 28, 2023 Udostępnij Luty 28, 2023 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...? Cytuj Link do komentarza Share on other sites More sharing options...
dragolice Luty 28, 2023 Autor tematu Udostępnij Luty 28, 2023 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. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Luty 28, 2023 Udostępnij Luty 28, 2023 (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 Luty 28, 2023 przez ethanak Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
SOYER Luty 28, 2023 Udostępnij Luty 28, 2023 @dragolice to niby zadziała ale się pogubisz. @ethanak ma rację, rozpisz sobie kolejne case jako kolejne ekrany, a w tych case reaguj na funkcję zwaracającą który przycisk wciśnięty. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Luty 28, 2023 Udostępnij Luty 28, 2023 A tak przy okazji biblioteka Bounce2 i metody fell() i rose(). Cytuj Link do komentarza Share on other sites More sharing options...
dragolice Luty 28, 2023 Autor tematu Udostępnij Luty 28, 2023 10 minut temu, ethanak napisał: Poza tym w większości przypadków nie "przycisk jest wciśnięty" Ale kto tak napisał? 🙂 Ok, czyli zagmatwane, ale zadziała 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Luty 28, 2023 Udostępnij Luty 28, 2023 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. Cytuj Link do komentarza Share on other sites More sharing options...
dragolice Luty 28, 2023 Autor tematu Udostępnij Luty 28, 2023 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. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Luty 28, 2023 Udostępnij Luty 28, 2023 Czyli podstawowy błąd... Cytuj Link do komentarza Share on other sites More sharing options...
dragolice Marzec 2, 2023 Autor tematu Udostępnij Marzec 2, 2023 (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 Marzec 2, 2023 przez dragolice Cytuj Link do komentarza Share on other sites More sharing options...
dragolice Marzec 5, 2023 Autor tematu Udostępnij Marzec 5, 2023 Dodałem returny w ifach i działa. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!