Как лучше всего обнаружить нажатие кнопки - Arduino - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть функция, которая в основном представляет собой игру в стиле Whack-A-Mole с использованием светодиодов и кнопок.LED-A загорается, и пользователь должен нажать BTN-A, чтобы выключить его ... и мы переходим к следующей комбинации LED / BTN.

Моя схема работает, и я могу включить каждый светодиод/ отключить и определять каждое нажатие кнопки.Однако, попав в игровой цикл (см. Ниже), я вижу странное поведение.

Мой код выглядит так:

void gameTwo(){
  Serial.println("We are in Game 2");
  playGameTwo();
  //lightShowTwo();

  // Set game state
  int gameState = 0;

  // Start counter
  elapsedMillis timeElapsed;

  // First LED
  digitalWrite(ledB, HIGH);
  while(digitalRead(btnB) != HIGH){
    //Serial.print("btnBstate is:  ");
    //Serial.println(digitalRead(btnB));
    if(digitalRead(btnB) == 1){
      delay(50);
      digitalWrite(ledB, LOW);
      Serial.print(timeElapsed);
    }
  }

  // Second LED
  digitalWrite(ledE, HIGH);
  while(digitalRead(btnE) != HIGH){
    //Serial.print("btnBstate is:  ");
    //Serial.println(digitalRead(btnE));
    if(digitalRead(btnE) == 1){
      delay(50);
      digitalWrite(ledE, LOW);
      Serial.print(timeElapsed);
    }
  }

  // Third LED
  digitalWrite(ledF, HIGH);
  while(digitalRead(btnF) != HIGH){
    //Serial.print("btnBstate is:  ");
    //Serial.println(digitalRead(btnE));
    if(digitalRead(btnF) == 1){
      delay(50); // these dalays DO NOT work
      digitalWrite(ledF, LOW);
      Serial.print(timeElapsed);
    }
  }  

  // End Game - Publish Elapsed Time
    gameState = 1;

  // record user's elapsed time
  int userTime = timeElapsed;
  Serial.print("Game Finished - Your time was:  ");
  Serial.print(timeElapsed);
  Serial.println(" ms!");



}

Проблема в том, что он не всегда работает.Иногда LED-A выключается, иногда горит.

Как видите, я пытался добавить небольшую задержку (50), но безрезультатно.

Как лучшеобнаружение нажатий кнопок во время цикла.

Дополнительный вопрос: я жестко программирую игру (например, LEDA, LEDB ... LEDx).Там должен быть лучший способ, возможно, с использованием массива, чтобы протолкнуть последовательность игры.Поскольку я не программист, я был бы признателен за некоторые рекомендации или статьи, чтобы прочитать, чтобы получить больше информации об этом.Спасибо.

1 Ответ

0 голосов
/ 10 декабря 2018

Вы можете использовать while для зацикливания до нажатия кнопки.

Использование массивов сделает это намного проще, здесь я использую массив для светодиодов, а другой - для кнопок.Числа в массивах представляют контакты.Я вставил random() функцию, которая сделает его более сложным.Каждый цикл принимает случайный ledPin для led[] и соответствующий btnPin для btn[].

//suppose that the button in pin 4 is for led in pin 1
//the button in pin 5 is for led in pin 2
//and the button in pin 6 is for led in pin 3

int led[] = {1, 2, 3};
int btn[] = {4, 5, 6};
int count = 3;
int ledPin = 0;
int btnPin = 0;
int previous = 0;

void setup() {
 for( ledPin=0; ledPin<count; ledPin++ ){
  pinMode(led[ledPin], OUTPUT);
 }
}

void loop() {
  ledPin = random(1, 4);              //pick a random number 1-3
  while( ledPin == previous ){        //if it is the same as previous, change it
    ledPin = random(3); }
  btnPin = ledPin + 3;                //btnPin set to 4-6
  digitalWrite(led[ledPin], HIGH);
  while( digitalRead(btn[btnPin]) == LOW ){}    //or HIGH according to pulling method
  digitalWrite(led[ledPin],LOW);
  previous = ledPin;
}
...