Обнаружение нажатия кнопки в цикле
Я разрабатываю простую игру "Саймон говорит", используя 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 работает нормально, он воспроизводит шаблон для соответствующего шаблона. Для раунда более одного, как я могу определить последовательное нажатие кнопки?. Будьте добры, скажите, что я делаю не так.
@Snoke, 👍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) {"ХОРОШО";} еще {"ПЛОХО";}
- Как повторить другое действие внутри цикла?
- Непрерывно запускайте функцию световой последовательности в операторе if
- Путаница между switch и if
- Определение того, была ли нажата и отпущена кнопка
- Хорошая кнопка debouncing/Библиотека StateChange
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Код Arduino для управления 4 светодиодами с 4 кнопок
На самом деле этот вопрос больше подходит для stackoverflow., @Swedgin