Многопоточно или как?

Тема в разделе "Arduino & Shields", создана пользователем FunApple, 20 июн 2015.

  1. FunApple

    FunApple Нуб

    Всем здрасьте.
    Давно горю идеей создать что-то вроде имитации бомбы из cs для страйкбола. Между делом, туда вносится еще и возможность играть в захват и удержание точки.
    Все детали: мониторчик, клавиатура, большиые цветные кнопки - уже приехали. Остался вопрос непосредственно в написании кода.

    Нужно реализовать примерно такой алгоритм:

    На экране отображается меню выбора игры
    |
    \/
    Нажатие на соответствующую кнопку на клавиатуре переводит в меню настройки игры
    |
    \/
    Отображается список настроек
    |
    \/
    Нажатие на соответствующую кнопку переводит в режим числового набора, дальше сохранение и возврат обратно в список настроек ^
    |
    \/
    Нажатие на соответствующую кнопку включает игру (например захват точки)
    |
    \/
    Дальше сама игра, кто зажал и подержал свою кнопку, тот захватил точку, тому капают очки что отображаются на экране. Вопрос основной, наверное, в том, что обычное чередование функций тут не прокатит, надо и отсчитывать время и пищать и в то же время ожидать нажатия кнопок и реагировать на них.

    Вот такой вопрос, как можно реализовать нечто подобное?
     
  2. DrProg

    DrProg Вечный нерд

    Не совсем понял при чем тут бомба, но отсчитывать время, пищать и ждать нажатия кнопки одновременно можно легко.
     
  3. FunApple

    FunApple Нуб

    Я просто не понимаю как это реализовать.
    Если отсчитывать секунды в цикле: {i++, показать на экране i} используя задержку, то как там правильно впихнуть ожидание нажатия какой-либо кнопки?
     
  4. DrProg

    DrProg Вечный нерд

    Задержку использовать нельзя. Нужно использовать таймер. Принцип такой: при запуске запоминается колво милисекунд и в лупе постоянно сравнивается с текущим колвом милисекунд, если разница больше или равна заданной, то срабатывает условие, выполняется функция и запоминается новое колво милисекунд для дальнейшего отсчета. И таких проверок столько, сколько нужно зависящих от времени действий. Между этим в лупе еще и опрашивается нажатие кнопки. В данном примере в программе три if: отсчет таймера, пищалка и нажатие кнопки. Можно кнопку и на прерывание повесить, в этом есть свои плюсы и минусы.

    пс: я в контру толком не играл, опишите как себя ведет бомба, сколько удерживать для захвата и прочее
     
    Последнее редактирование: 20 июн 2015
  5. FunApple

    FunApple Нуб

    Пример с таймером понял. А можно какой-нибудь мануал по его использованию?

    В кс бомба как бомба, набрал код, активировала, набрал код снова - деактивировалась, не разминировал - взорвалась через время.
    Я хочу сделать эдакое универсальное устройство с несколькими режимами игр, таких как та же бомба, где устройство будет себя вести как только что сказал; удержание точки, когда начисляются тем, кто держит активным эту точку, а если пришел враг и перехватил точку (в данном случае зажатие спец. кнопки), то очки начинают капать ему и т.д.

    При этом тут хочу сделать возможность настраивать игру: изменить время срабатывания бомбы, времени, необходимого на активацию точки, кол-во миллисекунд, через которое удерживающей команде начисляется очко и все такое.

    Кстати говоря, вот хороший пример:

     
  6. DrProg

    DrProg Вечный нерд

    Правильно понимаю, что это вроде шахматных часов?
     
  7. FunApple

    FunApple Нуб

    Можно сказать и так, принцип похож
    Только кнопку надо зажимать
     
    Последнее редактирование: 20 июн 2015
  8. DrProg

    DrProg Вечный нерд

    Общая часть кода выглядит примерно так:
    Код (Text):
    #define LP1 9
    #define LP2 8
    #define LP3 10
    #define BUTTON 12
    // независимые таймеры событий
    unsigned long timer1;
    unsigned long timer2;
    // состояние светодиодов
    boolean lpSet1 = 0;
    boolean lpSet2 = 0;


    void setup() {
    pinMode(LP1, OUTPUT);
    pinMode(LP2, OUTPUT);
    pinMode(LP3, OUTPUT);
    pinMode(BUTTON, INPUT_PULLUP);
    // начало отсчета
    timer1 = millis();
    timer2 = timer1;
    }

    void loop() {

    // каждые 500мс срабатывает эта часть кода
    if ((millis() - timer1) >= 500) {
      lpSet1 = !lpSet1;
      digitalWrite(LP1, lpSet1);
      timer1 = millis();
    }

    // каждые 100мс эта часть
    if ((millis() - timer2) >= 100) {
      lpSet2 = !lpSet2;
      digitalWrite(LP2, lpSet2);
      timer2 = millis();
    }

    // когда нажата кнопка срабатывает эта часть
    if (!digitalRead(BUTTON)){
      digitalWrite(LP3, HIGH);
    } else {
      digitalWrite(LP3, LOW);
    }
    }