Таймер в функции
- Войдите на сайт для отправки комментариев
Сб, 11/01/2014 - 21:55
Использую такой код для обработки нажатий кнопки. Может не самый удачный(большой размер), но работает.
#define buttonPin 8 #define ledPin1 4 #define ledPin2 5 #define ledPin3 6 #define ledPin4 7 boolean ledVal1 = false; boolean ledVal2 = false; boolean ledVal3 = false; boolean ledVal4 = false; //================================================= void setup() { pinMode(buttonPin, INPUT); digitalWrite(buttonPin, HIGH ); pinMode(ledPin1, OUTPUT); digitalWrite(ledPin1, ledVal1); pinMode(ledPin2, OUTPUT); digitalWrite(ledPin2, ledVal2); pinMode(ledPin3, OUTPUT); digitalWrite(ledPin3, ledVal3); pinMode(ledPin4, OUTPUT); digitalWrite(ledPin4, ledVal4); } void loop() { int b = checkButton(); if (b == 1) clickEvent(); if (b == 2) doubleClickEvent(); if (b == 3) holdEvent(); if (b == 4) longHoldEvent(); } //================================================= void clickEvent() { ledVal1 = !ledVal1; digitalWrite(ledPin1, ledVal1); } void doubleClickEvent() { ledVal2 = !ledVal2; digitalWrite(ledPin2, ledVal2); } void holdEvent() { ledVal3 = !ledVal3; digitalWrite(ledPin3, ledVal3); } void longHoldEvent() { ledVal4 = !ledVal4; digitalWrite(ledPin4, ledVal4); } int debounce = 20; int DCgap = 250; int holdTime = 2000; int longHoldTime = 5000; boolean buttonVal = HIGH; boolean buttonLast = HIGH; boolean DCwaiting = false; boolean DConUp = false; boolean singleOK = true; long downTime = -1; long upTime = -1; boolean ignoreUp = false; boolean waitForUp = false; boolean holdEventPast = false; boolean longHoldEventPast = false; int checkButton() { int event = 0; buttonVal = digitalRead(buttonPin); if (buttonVal == HIGH && buttonLast == LOW && (millis() - upTime) > debounce) { downTime = millis(); ignoreUp = false; waitForUp = false; singleOK = true; holdEventPast = false; longHoldEventPast = false; if ((millis()-upTime) < DCgap && DConUp == false && DCwaiting == true) DConUp = true; else DConUp = false; DCwaiting = false; } else if (buttonVal == LOW && buttonLast == HIGH && (millis() - downTime) > debounce) { if (not ignoreUp) { upTime = millis(); if (DConUp == false) DCwaiting = true; else { event = 2; DConUp = false; DCwaiting = false; singleOK = false; } } } if ( buttonVal == LOW && (millis()-upTime) >= DCgap && DCwaiting == true && DConUp == false && singleOK == true) { event = 1; DCwaiting = false; } if (buttonVal == HIGH && (millis() - downTime) >= holdTime) { if (not holdEventPast) { event = 3; waitForUp = true; ignoreUp = true; DConUp = false; DCwaiting = false; holdEventPast = true; } if ((millis() - downTime) >= longHoldTime) { if (not longHoldEventPast) { event = 4; longHoldEventPast = true; } } } buttonLast = buttonVal; return event; }
Нужно при длительном нажатии кнопки (hold) не менять состояние светодиода, а чтобы он горел 2 сек. Попытки вставить код из примера " мигаем без задержек" результата не дают - светик горит постоянно. Наверное проблема с таймером - он используется в обработке кнопки. Почитал про Timer1, но как его использовать в данном случае понять не могу. Как решить такую проблемку?