Помогите с кодом, никто пока не смог осилить...

Тема в разделе "Arduino & Shields", создана пользователем Irbis707, 22 янв 2014.

  1. Irbis707

    Irbis707 Нуб

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

    }

    }

    }
     
  2. NR55RU

    NR55RU Гик

    Смотреть вам надо в сторону "машины состояний".
    Вот тут Мегакотейка рассказывал, если уловите суть идеи, легко решите вашу проблему :)
     
  3. rav_75

    rav_75 Гик

    NR55RU, судя по всему, Irbis707 и пытается это реализовать, но немного заблудился.
    Irbis707, это элементарно, Ватсон! Ваша проблема в том, что Вы слабо представляете логику работы программы, у Вас нет в голове алгоритма работы. Попробуйте нарисовать блок-схему того, что хотите, а описать потом любым языком - дело техники. Код выкладывать пока не буду, опишу алгоритм.
    Код (Text):

    получаем команду
    проверяем,
      если триггер - флаг=true, время отсчета таймера=текущее время.
      если не триггер, проверяем флаг
        если флаг==true, проверяем команду
          команда1: выполняем
          команда2: выполняем
          .......................................
        флаг=false (т.е. если после триггера получили правильную команду, она
                         выполняется, не правильную - ничего не происходит, расцениваем как
                         случайно полученный триггер, флаг слетает полюбому. Если нужно
                         после триггера в течении таймера гарантированно выполнить какую-
                         нибудь команду, то убираем отсюда и пишем после выполнения каждой
                         команды. Если после триггера в течении таймера нужно выполнить
                         несколько команд - то вообще убираем.)
    проверяем таймер, если отработал - флаг=false
    Как-то так. Попробуйте написать код.
    По поводу кода... Его надо как-то форматировать, для удобства чтения оппонентов как минимум.
    a=a+1 - как-то не комильфо... Можно a++ или ++a, в Вашем случае не принципиально. Или a+=1, если инкремент отличается от единицы
     
    Последнее редактирование: 22 янв 2014
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Ctrl+T в Arduino IDE == автоформатирование.

    И нужно нормально обозвать переменные. Глобальные переменные "i" и "a" - это однозначное зло. i годится только в качестве счетчика цикла. Имя переменной должно описывать ее суть. То же самое с константами.
     
  5. Irbis707

    Irbis707 Нуб

    Спасибо за наводки, подсказки буду пытатся разбиратся, Однако от готового кода не откажусь т.к. честно всю голову уже уломал с этой программой, а вообще вы правы я только начал знакомится с ардуино поэтому и код такой не расписанный(вы уж извините) и сам уже запутался что и как должно работать.