Не могу обойти delay()
- Войдите на сайт для отправки комментариев
Ср, 10/07/2013 - 15:15
Есть проект - управление 6 светодиодами в разных комбинациях от 8 кнопок.
Написал программу для ардуины, все собрал, работает.
Однако, когда в бесконечном цикле while (1) запускаю перебор эффектов лоя светодиодов, не могу кнопкой это действие прервать.
Грешу на паразитическую функцию delay().
Решил заменить ее функцией SetTimeOutиз либы SimpleTimeout(). Но в нее нельзя передать функцию void с параметрами, только голую.
Иначе выдает ошибки:
sketch_jul10a.ino: In function 'void FadeLED_1_Lamp(int)':
sketch_jul10a:373: error: invalid use of void expression
sketch_jul10a:383: error: invalid use of void expression
Подскажите как обойти. Скетч ниже. Спасибо, коллеги!
#include <Keypad.h> #include <SimpleTimer.h> // the timer object SimpleTimer timer; byte L[6] = {3, 5, 6, 9, 10, 11}; const byte ROWS = 4; //four rows const byte COLS = 2; //three columns char keys[ROWS][COLS] = { {'1','2'}, {'4','5'}, {'7','8'}, {'*','0'} }; byte rowPins[ROWS] = {13,12,8,7}; //connect to the row pinouts of the keypad byte colPins[COLS] = {4,2}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); int regim1=1; int regim2=1; int regim3=1; int regim4=1; int regim5=1; int regim6=1; int regim7=1; int regim8=1; void setup(){ pinMode(L[0], OUTPUT); pinMode(L[1], OUTPUT); pinMode(L[2], OUTPUT); pinMode(L[3], OUTPUT); pinMode(L[4], OUTPUT); pinMode(L[5], OUTPUT); digitalWrite(L[0], LOW); digitalWrite(L[1], LOW); digitalWrite(L[2], LOW); digitalWrite(L[3], LOW); digitalWrite(L[4], LOW); digitalWrite(L[5], LOW); Serial.begin(9600); keypad.addEventListener(keypadEvent); //add an event listener for this keypad } void loop(){ timer.run(); char key = keypad.getKey(); } //take care of some special events void keypadEvent(KeypadEvent key){ switch (keypad.getState()){ case PRESSED: switch (key){ case '1': regim2=1; regim3=1; regim4=1; regim5=1; regim6=1; regim7=1; regim8=1; regim1++; if(regim1>4)//ограничим количество режимов { regim1=1; } SingleLamp(regim1, L[1]); break; case '2': regim1=1; regim3=1; regim4=1; regim5=1; regim6=1; regim7=1; regim8=1; regim2++; if(regim2>4)//ограничим количество режимов { regim2=1; } DoubleLamp(regim2, L[0], L[2]); break; case '4': regim1=1; regim2=1; regim4=1; regim5=1; regim6=1; regim7=1; regim8=1; regim3++; if(regim3>4)//ограничим количество режимов { regim3=1; } DoubleLamp(regim3, L[3], L[4]); break; case '5': regim1=1; regim2=1; regim3=1; regim5=1; regim6=1; regim7=1; regim8=1; regim4++; if(regim4>4)//ограничим количество режимов { regim4=1; } SingleLamp(regim4, L[5]); break; case '7': regim1=1; regim2=1; regim3=1; regim4=1; regim6=1; regim7=1; regim8=1; regim5++; if(regim5>4)//ограничим количество режимов { regim5=1; } DoubleLamp(regim5, L[0], L[3]); break; case '8': regim1=1; regim2=1; regim3=1; regim4=1; regim5=1; regim7=1; regim8=1; regim6++; if(regim6>4)//ограничим количество режимов { regim6=1; } DoubleLamp(regim6, L[2], L[4]); break; case '*': regim1=1; regim2=1; regim3=1; regim4=1; regim5=1; regim6=1; regim8=1; regim7++; if(regim7>4)//ограничим количество режимов { regim7=1; } Effects1(regim7); break; case '0': break; } break; case RELEASED: switch (key){ case '*': case '1':break; } break; case HOLD: switch (key){ case '*': AllOff(); break; } break; } } void AllOff(){ digitalWrite(L[0], LOW); digitalWrite(L[1], LOW); digitalWrite(L[2], LOW); digitalWrite(L[3], LOW); digitalWrite(L[4], LOW); digitalWrite(L[5], LOW); } void DoubleLamp(int regim, int l1, int l2){ if(regim==1)//первый режим { for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { analogWrite(l1, fadeValue); analogWrite(l2, fadeValue); delay(10); } } if(regim==2)//второй режим { AllOff(); //выключаем все светодиоды for(int fadeValue = 0 ; fadeValue <= 20; fadeValue++) { analogWrite(l1, fadeValue); analogWrite(l2, fadeValue); delay(10); } } if(regim==3)//третий режим { for(int fadeValue = 20 ; fadeValue <= 100; fadeValue +=5) { analogWrite(l1, fadeValue); analogWrite(l2, fadeValue); delay(10); } } if(regim==4)//четвертый режим { for(int fadeValue = 100 ; fadeValue <= 255; fadeValue +=5) { analogWrite(l1, fadeValue); analogWrite(l2, fadeValue); delay(10); } } } void SingleLamp(int regim, int l){ if(regim==1)//первый режим { for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { analogWrite(l, fadeValue); delay(10); } } if(regim==2)//второй режим { AllOff(); //выключаем все светодиоды for(int fadeValue = 0 ; fadeValue <= 20; fadeValue++) { analogWrite(l, fadeValue); delay(10); } } if(regim==3)//третий режим { for(int fadeValue = 20 ; fadeValue <= 100; fadeValue +=5) { analogWrite(l, fadeValue); delay(10); } } if(regim==4)//четвертый режим { for(int fadeValue = 100 ; fadeValue <= 255; fadeValue +=5) { analogWrite(l, fadeValue); delay(10); } } } void Effects1(int regim){ if(regim==1)//первый режим { while (keypad.keyStateChanged()==1){ FadeLED_2_Lamps(L[0], L[2]); FadeLED_1_Lamp( L[1]); FadeLED_2_Lamps(L[0], L[2]); FadeLED_1_Lamp( L[0]); FadeLED_1_Lamp( L[1]); FadeLED_1_Lamp( L[2]); FadeLED_1_Lamp( L[1]); FadeLED_1_Lamp( L[0]); FadeLED_1_Lamp( L[1]); FadeLED_1_Lamp( L[2]); FadeLED_1_Lamp( L[3]); FadeLED_1_Lamp( L[4]); FadeLED_1_Lamp( L[5]); FadeLED_1_Lamp( L[4]); FadeLED_1_Lamp( L[3]); FadeLED_1_Lamp( L[2]); FadeLED_1_Lamp( L[1]); FadeLED_1_Lamp( L[0]); FadeLED_2_Lamps(L[0], L[1]); FadeLED_2_Lamps(L[1], L[2]); FadeLED_2_Lamps(L[2], L[3]); FadeLED_2_Lamps(L[3], L[4]); FadeLED_2_Lamps(L[4], L[5]); FadeLED_2_Lamps(L[4], L[3]); FadeLED_2_Lamps(L[3], L[2]); FadeLED_2_Lamps(L[2], L[1]); FadeLED_2_Lamps(L[1], L[0]); FadeLED_3_Lamps(L[0], L[1], L[2]); FadeLED_3_Lamps(L[1], L[2], L[3]); FadeLED_3_Lamps(L[2], L[3], L[4]); FadeLED_3_Lamps(L[3], L[4], L[5]); FadeLED_3_Lamps(L[2], L[3], L[4]); FadeLED_3_Lamps(L[1], L[2], L[3]); FadeLED_3_Lamps(L[0], L[1], L[2]); } } if(regim==2)//второй режим { FadeLED_2_Lamps(L[0], L[2]); FadeLED_1_Lamp( L[1]); } if(regim==3)//третий режим { FadeLED_1_Lamp( L[0]); FadeLED_1_Lamp( L[1]); FadeLED_1_Lamp( L[2]); FadeLED_1_Lamp( L[1]); } if(regim==4)//четвертый режим { } } void FadeLED_3_Lamps(int l1, int l2, int l3){ // fade in from min to max in increments of 5 points: for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=2) { // sets the value (range from 0 to 255): analogWrite(l1, fadeValue); analogWrite(l2, fadeValue); analogWrite(l3, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(5); } // fade out from max to min in increments of 5 points: for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=2) { // sets the value (range from 0 to 255): if (fadeValue <3 ) fadeValue=0; analogWrite(l1, fadeValue); analogWrite(l2, fadeValue); analogWrite(l3, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(5); } } void FadeLED_2_Lamps(int l1, int l2){ // fade in from min to max in increments of 5 points: for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=2) { // sets the value (range from 0 to 255): analogWrite(l1, fadeValue); analogWrite(l2, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(5); } // fade out from max to min in increments of 5 points: for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=2) { // sets the value (range from 0 to 255): if (fadeValue <3 ) fadeValue=0; analogWrite(l1, fadeValue); analogWrite(l2, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(5); } } void FadeLED_1_Lamp(int l1){ // fade in from min to max in increments of 5 points: for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=2) { // sets the value (range from 0 to 255): timer.setTimeout(1000, llamp(l1, fadeValue)); // wait for 30 milliseconds to see the dimming effect //delay(5); } // fade out from max to min in increments of 5 points: for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=2) { // sets the value (range from 0 to 255): if (fadeValue <3 ) fadeValue=0; timer.setTimeout(1000, llamp(l1, fadeValue)); // wait for 30 milliseconds to see the dimming effect //delay(5); //timer.setTimeout(10000, OnceOnlyTask); } } void llamp(int pin, byte brightness){ analogWrite(pin, brightness); } void callMeLater() { // do something }