目前我正在尝试通过 arduino 开发一个光响应训练器,一开始我使用了 3 个 LED 和 3 个按钮,LED 必须随机工作,当 ledx 闪烁时,用户按 push bottonx 等当然,我必须使用近似传感器或类似的东西才能更可靠
上传以下代码时,所有 LED 连续周发光(闪烁)有什么问题? 谢谢你的帮助。
int ledselect = 0;
int led1 = 11;
int led2 = 12;
int led3 = 13;
int pb1 = 4;
int pb2 = 5;
int pb3 = 6;
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(pb1, INPUT);
pinMode(pb2, INPUT);
pinMode(pb3, INPUT);
}
void loop() {
int ledselect = random(3);
switch (ledselect) {
case 0: //if ledcolor equals 0 then the led1 will turn on
digitalWrite(led1, HIGH);
if (digitalRead(pb1),HIGH)
digitalWrite(led1,LOW);
break;
case 1: //if ledcolor equals 1 then the led2 will turn on
digitalWrite(led2, HIGH);
if (digitalRead(pb2),HIGH)
digitalWrite(led2,LOW);
break;
case 2: //if ledcolor equals 2 then the led3 will turn on
digitalWrite(led3, HIGH);
if (digitalRead(pb3),HIGH)
digitalWrite(led3,LOW);
break;
}
}
该程序中有两个时序问题:1)循环执行得太快而无法看到响应,2)在人有时间响应LED之前读取按钮。
我建议重组你的loop()以具有以下一般结构:
- 打开 LED,基于 random()
- 延迟给对方时间做出回应。例如,延迟(500);将等待 1/2 秒 (1000/2)。
- 读取基于第二个开关(LEDSELECT)代码块的按钮。
- 延迟,让该人有时间为下一个循环做好准备。 例如,延迟(1000);
非常感谢我抓住了它,我改变了电路,所以我连接了所有输出的开关并连接到 arduino 中的引脚 4(每个开关只有在他的 LED 亮起时才处于活动状态)
int ledselect = 0;
int led1 = 11;
int led2 = 12;
int led3 = 13;
int pb = 4;
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(pb, INPUT);
}
void loop() {
int ledselect = random(3);
switch (ledselect) {
case 0:
digitalWrite(led1, HIGH);
delay(20);
while(digitalRead(pb) != HIGH){delay(20);}
digitalWrite(led1,LOW);
break;
case 1:
digitalWrite(led2, HIGH);
delay(20);
while(digitalRead(pb) != HIGH){delay(20);}
digitalWrite(led2,LOW);
break;
case 2:
digitalWrite(led3, HIGH);
delay(20);
while(digitalRead(pb) != HIGH){delay(20);}
digitalWrite(led3,LOW);
break;
default:
delay(20);
break;
}
}