什么是检测按钮按下的最佳方法-Arduino

时间:2018-12-10 19:19:42

标签: while-loop arduino do-while

我有一个基本上是使用LED和按钮的Whack-A-Mole游戏的功能。 LED-A点亮,用户必须按BTN-A才能将其关闭...,我们继续进行下一个LED / BTN组合。

我的电路正常工作,我可以分别打开/关闭每个LED并检测每个按钮的按下。但是,一旦进入游戏循环(见下文),我就会看到一些奇怪的行为。

我的代码如下:

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)也无济于事。

在while循环中检测按钮按下的最佳方法是什么。

奖金问题:我正在对游戏进行硬编码(例如LEDA,LEDB ... LEDx)。应该有一个更好的方法,也许使用数组来推动游戏序列。因为我不是程序员,所以希望您能从中获得一些指导或文章来获得更多的相关知识。谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用while循环播放,直到按下按钮为止。

使用数组将使它变得更加容易,这里我将一个数组用于led,另一个用于按钮。数组中的数字表示引脚。我插入了random()函数,这将使其更具挑战性。每个循环都为led[]接受一个随机ledPin,为btn[]接受一个对应的btnPin。

//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;
}