Проверьте, происходит ли набор событий в течение ограниченного периода времени

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

Я присваиваю номер каждому из датчиков, а последовательность их срабатывания сохраняется в массиве, например:

// Все соответствующие выводы ИК-датчиков устанавливаются на вход с именами ir1,ir2,ir3,ir4
int sequence[] = {0,0,0,0}
int s1 = digitalRead(ir1); //и аналогично для всех остальных пинов
int counter = 0; 

if(s1==1){
  sequence[counter] = 1; //аналогично 2 для s2 и так далее
  counter ++;
}

Я пытаюсь сделать что-то вроде этого:

if(s1 == 1 || s2==1 || s3 == 1 || s4 == 1){
   if(s1 == 1){
      sequence[counter] = 1;
      counter ++;

   // Начинаем слушать другие датчики
   } // аналогично проверяем, какой датчик сработает первым

   // Разрешить 2 секунды для ввода со всех датчиков (также не допускается ввод данных ни от одного из них)
   // Через 2 секунды выполнить некоторый код на основе массива последовательностей, который был обновлен на основе входных данных с разных датчиков
}

Как мне это сделать?

, 👍1

Обсуждение

Обязательно посмотрите на принцип синхронизации, показанный в примере «BlinkWithoutDelay», который поставляется с Arduino IDE., @chrisl


1 ответ


Лучший ответ:

0

Вот некоторый псевдокод, который может помочь:

   if millis() - start time >= 2000
         время вышло, делайте что хотите с последовательностью до сих пор
         может быть, логический флаг здесь, так что вы делаете это только один раз
   if any button is pressed
      if counter == 0
          set start time = millis() // запускаем таймер
          установить первым по порядку
      else 
          добавить кнопку в последовательность
,

Спасибо, это сработало. Я поместил код для проверки входных данных от датчиков в цикл while и использовал функцию millis() в качестве условия пока. Что-то вроде int a = millis(); int b= миллис(); while(ab <=200){... a=millis() // обновляет a в конце каждого цикла}, @RishiC