Помогите с таймером на голосовом управлении
- Войдите на сайт для отправки комментариев
Вс, 19/01/2014 - 21:33
Здравствуйте. Вопрос мой наверное будет весьма глупым но моих скромных знаний нехватает поэтому спрошу.
Суть такова, перед нами код голосового и Ик управления реле, записанно 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;
}
}
}