Arduino Polska Forum
Jeden przycisk kilka funkcji - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino)
+--- Wątek: Jeden przycisk kilka funkcji (/watek-jeden-przycisk-kilka-funkcji)



Jeden przycisk kilka funkcji - elkriso83 - 22-08-2017

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: [attachment=370]

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;
}