09-04-2017, 22:40
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:
najpierw deklaruje zmienne niezbędne do działania programu. A następnie sam program
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.
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;
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.