Arduino:检测在while循环中按下的按钮

时间:2017-04-27 09:36:40

标签: c loops if-statement while-loop arduino

我一直在尝试编写代码,以便在一定时间内按下按钮时基本上为分数添加分数。我发现的问题是,当时间减少时,它没有检测到按下按钮的时间,事实上它只能检测时间何时开始减少,然后按钮是什么状态无关紧要继续加分。无论如何这里是主要代码:

void loop() {
  buttonState01 = digitalRead(button01);
  buttonState02 = digitalRead(button02);
  buttonState03 = digitalRead(button03);

if (buttonState01){

time = 3000;
    while(time > 0){
      if (buttonState02){
        score += 10;
        Serial.println(score);
      }
  time--;
Serial.println(time);
    }
  }
}

如果需要,这是完整的代码:

int button01 = 4;
int button02 = 3;
int button03 = 2;

int buttonState01 = 0;
int buttonState02 = 0;
int buttonState03 = 0;

float time;
int score;

void setup() {
  score = 0;

  time = 0;

  pinMode(button01, INPUT);
  pinMode(button02, INPUT);
  pinMode(button03, INPUT);

  Serial.begin(9600);
}

void loop() {
  buttonState01 = digitalRead(button01);
  buttonState02 = digitalRead(button02);
  buttonState03 = digitalRead(button03);

  if (buttonState01){
    time = 3000;
    while(time > 0){
      if (buttonState02){
        Serial.println("Points");
      }
      time--;
      Serial.println(time);  
    }
  }
}

2 个答案:

答案 0 :(得分:1)

硬件中断可以完全满足您的需求。

将中断例程附加到您的按钮所链接的图钉上,然后将其设置为'得分'变量。确保引入某种超时以避免按钮弹跳(即,当您增加分数时设置LastTimeIncremented,并且只有在LastTimeIncremented超过1秒之前才增加分数)

这样,无论程序可能做什么,总是会设置得分。

有关这方面的信息可以在Arduino https://www.arduino.cc/en/Reference/attachInterrupt

中找到

该页面上的示例将完全符合您的要求,只需替换“闪烁”即可。使用' incrementScore'并且你已经完成了很多工作

 const byte ledPin = 13;
 const byte interruptPin = 2;
 int score = 0;
 int increment = 1;


void setup() {
   pinMode(ledPin, OUTPUT);
   pinMode(interruptPin, INPUT_PULLUP);
   attachInterrupt(digitalPinToInterrupt(interruptPin), incScore, RISING);
}

void loop() {
   digitalWrite(ledPin, state);
}

void incScore() {
   score = score+increment;
   // add anti-bounce functionality here
}

答案 1 :(得分:0)

您应该阅读while循环内按钮的状态。像这样:

select  t1.user_id, t2.answer as first_answer, t3.answer as last_answer
from    (
            select  user_id, min(answer_id) min_answer, max(answer_id) max_answer
            from    yourTable
            group by user_id
        ) t1
join    yourTable t2
on      t2.answer_id = t1.min_answer
join    yourTable t3
on      t3.answer_id = t1.max_answer

在您的代码中,没有逻辑可以为分数添加分数。