• 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
obsługa przycisku - problem
#1
Witam!
Mam następujący problem. Chciałem napisać program, w którym obsługiwane byłyby dwa zdarzenia za pomocą jednego przycisku. Mianowicie te zdarzenia muszą być obsługiwane niezależnie(czyli nie ważne czy pierwsze zdarzenie działa czy nie drugie musi być obsłużone przez ten sam przycisk i odwrotnie). Przycisk reagowałby na przyciśnięcie poniżej jednej sekundy(pierwsze zdarzenie) oraz powyżej 2 sekund ( drugie zdarzenie). Czyli np. jeśli wciskam przycisk i trzymam go mniej niż 1 sekunda to załączam diodę nr 1 jeśli znowu trzymam przycisk krócej niż 1 sek to dioda nr 1 gaśnie, następnie jeśli trzymam przycisk dłużej niż 2 sekundy to załączam diodę nr 2 i jeśli trzymam dłużej niż 2sek to dioda 2 gaśnie. Oczywiście zachowując niezależność działania czyli jeśli trzymam 2 sekundy zaświecam diodę 2 następnie jeśli trzymam krócej niż 1 sek zaświecam diodę 1 następnie jeśli trzymam znowu krócej niż 1 sek dioda nr jeden gaśnie i jeśli trzymam krócej dłużej niż 2 sek dioda 2 gaśnie. Siedziałem nad tym trochę czasu i znalazłem bibliotekę button.h w której była funkcja isPressed(); Funkcja ta reaguje na wciśnięcie przycisku. Więc napisałem mój program z wykorzystaniem tej funkcji: 
Kod:
Button         przycisk = Button(2, PULLUP);        // pin drugi podlaczamy do przycisku a druga koncowka przycisku do masy
int            bWlaczWylacz = 0;
unsigned long  bWcisnietyCzasStart = 0;
unsigned long  bWcisnietyCzas = 0;
 najpierw deklaruje zmienne niezbędne do działania programu. A następnie sam program
Kod:
 if(przycisk.isPressed())
 {
   if(bWlaczWylacz==0)
   bWcisnietyCzasStart = millis();
   bWlaczWylacz=1;
 }
 else
 {
   if(bWlaczWylacz==1)
   {
     bWlaczWylacz=0;
     bWcisnietyCzas = millis() - bWcisnietyCzasStart;
     if (bWcisnietyCzas<=1000)                           // czas wcisniecia przycisku w celu wyciszenia buzera
     {
       jakas_funkcja();
     }
     }
    if (bWcisnietyCzas>=1000)                // czas wcisniecia przycisku w celu wylaczenia/wylaczenia urzadzenia
     {
   jakas_funkcja2();
     }
       
     }
 

I wszystko powiedzmy ze działa z jednym mankamentem, którego nie mogę się pozbyć. Po naciśnięciu przycisku program dopiero zareaguje jak zwolnię przycisk. Natomiast z pozycji użytkownika to raczej po przyciśnięciu przycisku i po upływie 2 sekund mimo, że się tego przycisku nie zwolniło to powinno się coś wykonać. np. jeśli trzymamy 2 sekundy przycisk czy nawet 3 sekundy to po upływie 2 sekund powinno się coś wykonać np zaświecić dioda bez względu czy przycisk został zwolniony czy nie. To własnie zaświecona dioda powinna być sygnałem dla użytkownika, że może już zwolnić przycisk bo coś się wykonało a nie tak jak to w tym programie że dopiero po zwolnieniu przycisku dioda się zaświeci. Nie mogę sobie poradzić z tym tematem pewnie rozwiązanie jest banalne tylko nie mogę go jakoś wymyślić. Może ktoś zmierzył się z tym problemem. Takie rozwiązania są zastosowane np w sterownikach kotłów. jeden przycisk np przytrzymany 2 sek. wchodzi w menu kotła a jeśli będzie krótkie kliknięcie to wyświetla np parametry kotła. Z góry dziękuje za wszelkie podpowiedzi i pozdrawiam.
 
Odpowiedź
  


Wiadomości w tym wątku
obsługa przycisku - problem - przez kazik83 - 09-04-2017, 22:40
RE: obsługa przycisku - problem - przez namok - 10-04-2017, 11:22
RE: obsługa przycisku - problem - przez kazik83 - 10-04-2017, 21:12
RE: obsługa przycisku - problem - przez namok - 11-04-2017, 08:38
RE: obsługa przycisku - problem - przez OMK - 01-03-2020, 23:07
RE: obsługa przycisku - problem - przez kaczakat - 02-03-2020, 13:16

Skocz do:


Przeglądający: 1 gości