• 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ź
#2
Program działa tak jak go napisałeś. Nie podałeś źródeł biblioteki więc trudno stwierdzić czy można go napisać inaczej.
Sprawa jest bardzo prosta Wink - krótkie naciśnięcie wykrywasz po puszczeniu przycisku a długie w trakcie trzymania. Znasz millis() to powinieneś sobie poradzić bez użycia biblioteki o której wspomniałeś. Możesz też użyć biblioteki OneButton: https://github.com/mathertel/OneButton.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
(10-04-2017, 11:22)namok napisał(a): Program działa tak jak go napisałeś. Nie podałeś źródeł biblioteki więc trudno stwierdzić czy można go napisać inaczej.
Sprawa jest bardzo prosta Wink - krótkie naciśnięcie wykrywasz po puszczeniu przycisku a długie w trakcie trzymania. Znasz millis() to powinieneś sobie poradzić bez użycia biblioteki o której wspomniałeś. Możesz też użyć biblioteki OneButton: https://github.com/mathertel/OneButton.



no właśnie działa ale nie mogę wykombinować tych warunków za każdym razem coś jest nie tak. Może mógłbyś podsunąć rozwiązanie w kodzie. a bibliotekę posiadam ze strony projektu arduino http://playground.arduino.cc/Code/Button. Już wprowadzałem różne zmienne pomocnicze i nie mam już pomyslł. Staram się w ostateczności prosić o pomoc. Za każdą pomoc z góry dziękuje.
 
Odpowiedź
#4
Użyj biblioteki którą podałem w poprzednim poście. Ma ona wszystko co potrzebujesz. Musisz tylko skonfigurować czasy.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#5
Ja mam podobny problem. Potrzebuje aby na pinie np. 2 jak będzie krótki impuls to na pinie np 4 stan niski a jak na pinie 2 będzie długi to stan na pinie 5 z wysokiego na niski. Oczywiście na pin 4 wtedy nic się nie dzieje i odwrotnie.
Próbowałem coś takiego ale nie mogę sprawdzić bo się nie kompiluje.
Kod:
#include "OneButton.h"
OneButton button(2, true);
#define przycisk
void setup() {
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
pinMode(2, INPUT_PULLUP) = przycisk
int Wylacz = 0;
unsigned long Start = 0;
unsigned long  Czas = 0;
}
void loop() {
   if(przycisk.isPressed())
{
   if(Wylacz==0){
   Start = millis();
   Wylacz=1;
}
else
{
   if(Wylacz==1){
     Wylacz=0;
     Czas = millis() - Start;
     if (Czas <= 2000){
       pinMode(4,LOW);
     }
     }
    if (Czas >= 4000){
   pinMode(5,LOW);
     }
}
}}

Może kazik83 podeśle mi swój kod bo wygląda to co mu nie działało mi by się przydało.
 
Odpowiedź
#6
Wróć do kursu Arduino lub po prostu zrób sobie chwilę przerwy, bo pinMode(5, LOW) to raczej nie jest to co chcesz robić wewnątrz loop - zmęczenie?
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości