Таймер в функции

Нет ответов
vvadim
Offline
Зарегистрирован: 23.05.2012

Использую такой код для обработки нажатий кнопки. Может не самый удачный(большой размер), но работает.

#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, но как его использовать в данном случае понять не могу. Как решить такую проблемку?