Помогите с таймером на голосовом управлении

Нет ответов
Artem787
Offline
Зарегистрирован: 19.01.2014










Здравствуйте. Вопрос мой наверное будет весьма глупым но моих скромных знаний нехватает поэтому спрошу. 
Суть такова, перед нами код голосового и Ик управления реле, записанно 5 голосовых комманд к ним прикручено реле и светодиод, я пытаюсь сделать защиту от случайного срабатывания, тоесть я сначало говорю определенное слово кторое записанно в case ox11 и только потом говорю комманду которая переключит реле, всё работает замечательно но мне нужно что бы когда я говорю проверочное слово ардуино зажигает лампочку и ждёт 7 секунд комманду и если она не поступила то лампочка гаснет и нужно снова говорить проверочное слово а потом опять комманду, тоесть нужен некий таймер на 7 секунд в case 0x11 который не стопорил бы программу, что бы считывание других голосовых комманд было активно, естественно delay не подходит а millis туда запилить у меня не получилось. Пожалуйста подскажите как быть, я только недавно познакомился с ардуино и вот мой первый программнй ступор) Подскажите если не сложно где и как код оптимизировать можно, зараннее благодарен! 
#include <IRremote.h>

int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;
int a=0;
long previousMillis = 0; 
long interval = 4000;
int ledPin = 13; //Реле
int yPin = 8; //Диод 1
int i=0; // переменная для триггера
int sPin = 7; 
byte com = 0; //для инициализации голосового модуля

void setup()
{
irrecv.enableIRIn(); // включить приемник  

Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(yPin, OUTPUT);
pinMode(sPin, OUTPUT);// все 3 пина как выходы
delay(2000);
Serial.write(0xAA);
Serial.write(0x37);
delay(1000);
Serial.write(0xAA);
Serial.write(0x21);
}

void loop()
{
if (irrecv.decode(&results)) {

if (results.value == 0x10EFE31C) {a=a+1;} // обработка нажитя клавиши, здесь переменная принимает значение +1
if (a==1){digitalWrite(ledPin, LOW);} else {digitalWrite(ledPin, HIGH),digitalWrite(yPin, LOW); a=0;} // действие после нажатия кнопки

irrecv.resume();
}
while(Serial.available())
{
com = Serial.read();
switch(com)
{
case 0x11:
i=1;// Сам триггер, включён
digitalWrite(sPin, HIGH);
break;

case 0x12:// переключение реле
if (i==1){digitalWrite(ledPin, LOW),digitalWrite(sPin, LOW);}
i=0; //возвращает триггер в начальное состояние
break;

case 0x13:
if (i==1){digitalWrite(yPin, HIGH),digitalWrite(sPin, LOW);}
i=0;
break;

case 0x14://выключение всего
digitalWrite(yPin, LOW);
digitalWrite(ledPin, HIGH);
digitalWrite(sPin, LOW);
i=0;
break;

case 0x15:

break;

}

}

}