我一直在尝试编写代码,以便在一定时间内按下按钮时基本上为分数添加分数。我发现的问题是,当时间减少时,它没有检测到按下按钮的时间,事实上它只能检测时间何时开始减少,然后按钮是什么状态无关紧要继续加分。无论如何这里是主要代码:
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);
}
}
}
答案 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
在您的代码中,没有逻辑可以为分数添加分数。