Здравствуйте. Вопрос мой наверное будет весьма глупым но моих скромных знаний нехватает поэтому спрошу. Суть такова, перед нами код голосового и Ик управления реле, записанно 5 голосовых комманд к ним прикручено реле и светодиод, я пытаюсь сделать защиту от случайного срабатывания, тоесть я сначало говорю определенное слово кторое записанно в case ox11 и только потом говорю комманду которая переключит реле, всё работает замечательно но мне нужно что бы когда я говорю проверочное слово ардуино ждёт 7 секунд комманду и если она не поступила то нужно снова говорить проверочное слово а потом опять комманду, тоесть нужен некий таймер на 7 секунд в case 0x11 который не стопорил бы программу, что бы считывание других голосовых комманд было активно, естественно delay не подходит а millis туда запилить у меня не получилось. Пожалуйста подскажите как быть, я только недавно познакомился с ардуино и вот мой первый программнй ступор) Подскажите если не сложно где и как код оптимизировать можно, зараннее благодарен! Код (Text): int RECV_PIN = 4; IRrecv irrecv(RECV_PIN); decode_results results; int a=0; 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; } } }
Смотреть вам надо в сторону "машины состояний". Вот тут Мегакотейка рассказывал, если уловите суть идеи, легко решите вашу проблему
NR55RU, судя по всему, Irbis707 и пытается это реализовать, но немного заблудился. Irbis707, это элементарно, Ватсон! Ваша проблема в том, что Вы слабо представляете логику работы программы, у Вас нет в голове алгоритма работы. Попробуйте нарисовать блок-схему того, что хотите, а описать потом любым языком - дело техники. Код выкладывать пока не буду, опишу алгоритм. Код (Text): получаем команду проверяем, если триггер - флаг=true, время отсчета таймера=текущее время. если не триггер, проверяем флаг если флаг==true, проверяем команду команда1: выполняем команда2: выполняем ....................................... флаг=false (т.е. если после триггера получили правильную команду, она выполняется, не правильную - ничего не происходит, расцениваем как случайно полученный триггер, флаг слетает полюбому. Если нужно после триггера в течении таймера гарантированно выполнить какую- нибудь команду, то убираем отсюда и пишем после выполнения каждой команды. Если после триггера в течении таймера нужно выполнить несколько команд - то вообще убираем.) проверяем таймер, если отработал - флаг=false Как-то так. Попробуйте написать код. По поводу кода... Его надо как-то форматировать, для удобства чтения оппонентов как минимум. a=a+1 - как-то не комильфо... Можно a++ или ++a, в Вашем случае не принципиально. Или a+=1, если инкремент отличается от единицы
Ctrl+T в Arduino IDE == автоформатирование. И нужно нормально обозвать переменные. Глобальные переменные "i" и "a" - это однозначное зло. i годится только в качестве счетчика цикла. Имя переменной должно описывать ее суть. То же самое с константами.
Спасибо за наводки, подсказки буду пытатся разбиратся, Однако от готового кода не откажусь т.к. честно всю голову уже уломал с этой программой, а вообще вы правы я только начал знакомится с ардуино поэтому и код такой не расписанный(вы уж извините) и сам уже запутался что и как должно работать.