• 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
Jeden przycisk kilka funkcji
#1
Pracuję nad sterownikiem LED obsługiwanym jednym przyciskiem "dzwonkowym". 
Dostępne funkcje:
-pojedyncze nacisnięcie
-podwójne naciśnięcie
-przytrzymanie

Mam pytanie odnośnie kodu. A właściwie o funkcję millis(). Rozumiem, że po upływie niecałych 50 dni zakres typu unsigned long się skończy. Zacznie od 0?
Na końcu kodu jest warunek, który ma zapobiegać zgłupieniu sterownika po tym okresie. Jak myślicie? Zadziała?

Oto schemat podłączenia przycisku:     

Oto kod:
Kod:
int pinPrzycisku1 = 2;
int pinLED = 13;
float czasTrzymaniaPrzycisku = 0;
unsigned long czasPierwszegoWcisniecia = 0;
unsigned long czasDrugiegoWcisniecia = 0;
bool trybDwukrotnegoWcisniecia = false;
bool trybJednokrotnegoWcisniecia = false;
bool trybPrzytrzymania=false;
int czasNaPodwojneWcisniecie = 600;
int czasNaPrzytrzymaniePrzycisku = 500;

void setup() {
 // put your setup code here, to run once:
 pinMode(pinPrzycisku1, INPUT_PULLUP);
 pinMode(pinLED, OUTPUT);
 Serial.begin(9600);
}

void loop() {
 // nacisniecie przycisku

 while (digitalRead(pinPrzycisku1) == LOW)
 {
   delay(100);
   czasTrzymaniaPrzycisku = czasTrzymaniaPrzycisku + 100;
 }
 if (czasTrzymaniaPrzycisku >= 100 && czasTrzymaniaPrzycisku < 500 && czasPierwszegoWcisniecia > 0)
 {
   czasDrugiegoWcisniecia = millis();
 }
 if (czasTrzymaniaPrzycisku >= 100 && czasTrzymaniaPrzycisku < 500 && czasPierwszegoWcisniecia == 0)
 {
   czasPierwszegoWcisniecia = millis();
 }

 if (czasDrugiegoWcisniecia - czasPierwszegoWcisniecia > 0 && czasDrugiegoWcisniecia - czasPierwszegoWcisniecia < czasNaPodwojneWcisniecie)
 {
   Serial.println("Tryb dwukrotnego wcisniecia aktywowany");
   //
   //
   //Tudaj funkcja podwojnego klikniecia
   //
   //
   czasPierwszegoWcisniecia = 0;
   czasDrugiegoWcisniecia = 0;
 }
 if (millis() - czasPierwszegoWcisniecia >= czasNaPodwojneWcisniecie && czasPierwszegoWcisniecia > 0)
 {
   czasPierwszegoWcisniecia = 0;
   czasDrugiegoWcisniecia = 0;
   Serial.println("Tryb pojedynczego wcisniecia aktywowany");
   //
   //
   //Tutaj funkcja pojedynczego klikniecia
   //
   //
 }
 if (czasTrzymaniaPrzycisku >= czasNaPrzytrzymaniePrzycisku)
 {
   czasPierwszegoWcisniecia = 0;
   czasDrugiegoWcisniecia = 0;
   Serial.println("Tryb przytrzymania przycisku aktywowany");
   //
   //
   //Tutaj funkcja przytrzymania przycisku
   //
   //
 }
 //zerowanie po osiagnieciu max wartosci przez millis
 if (millis()-czasPierwszegoWcisniecia<0)
 {
   czasPierwszegoWcisniecia = 0;
   czasDrugiegoWcisniecia = 0;
 }
 czasTrzymaniaPrzycisku = 0;
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości