Обнаружение нажатия кнопки в цикле

Я разрабатываю простую игру "Саймон говорит", используя Arduino. Саймон говорит, что это игра, в которой воспроизводится светодиодный шаблон, и пользователь должен имитировать этот шаблон. Есть 10 раундов. Первый раунд = 1 светодиод, второй раунд = 2 светодиода и так далее. Когда разыгрывается первый раунд, мигает один светодиод, и игрок должен нажать соответствующую кнопку. Затем, если он нажмет правую кнопку, начнется следующий раунд, в котором будут светиться два светодиода, и игрок должен последовательно нажать 2 кнопки. У меня возникли проблемы с обнаружением нажатия кнопки в цикле более 1 раунда. Вот фрагмент кода:

void loop() {
  for (int i = 1; i <= ROUNDS; i++)
  {
    digitalWriteGeneric(i);
    bool wait = 1;
    int expected = Sequence[i - 1];
    while (wait)
    {
      int value = digitalReadGeneric();
      if (expected == value)
      {
        Serial.print("Right");
        wait = 0;
        break;
      }
    }
  }
}
int digitalReadGeneric()
{
  for (int i = 0; i < NUM_LIGHTS; i++)
  {
    Readings[i] = digitalRead(buttonPin[i]);
    if (Readings[i] == 1)
    {
      return i;
    }
  }

}

Здесь ROUNDS = 10 digitalwritegeneric работает нормально, он воспроизводит шаблон для соответствующего шаблона. Для раунда более одного, как я могу определить последовательное нажатие кнопки?. Будьте добры, скажите, что я делаю не так.

, 👍1

Обсуждение

На самом деле этот вопрос больше подходит для stackoverflow., @Swedgin


1 ответ


1

Заглядывая в свой цикл поиска:

for (int i = 1; i <= ROUNDS; i++)
  {

    // Write sequence
    digitalWriteGeneric(i);

    // Read sequence
    bool wait = 1;
    int expected = Sequence[i - 1];
    while (wait)
      {
        int value = digitalReadGeneric();
        if (expected == value)
          {
            Serial.print("Right");
            wait = 0;
            break;

            // Setting vlag to false will exit the while loop
            // break will also exit the while loop
            // so only need to do 1 of the 2
            // but then you won't be able to read anymore, it exited the while-loop
          }
      }
  }

Вы проверяете только первую кнопку, и если она верна, вы выходите из цикла while, завершая чтение.

Вы можете изменить тип переменной wait на uint8_t (init на 0), и если значение правильное, увеличьте ожидание. Цикл while становится: while (wait < i) {}. Вы можете использовать перерыв, чтобы остановить чтение, когда игрок нажал не ту кнопку.

Чтобы проверить, правильно ли игрок выполнил последовательность: если (подождите == i) {"ХОРОШО";} еще {"ПЛОХО";}

,