反应力游戏:随机等待
本课属于 Coddy Arduino 学习旅程的“项目”单元。第 5 课,共 24 课。
下一个项目是反应游戏。你按下按钮,电路板等待一会儿,然后点亮 LED,你再尽可能快地按下按钮。
等待时间是随机的,否则你会摸清节奏。random(1000, 3001)会生成一个从 1000 到 3000 的整数。
random()是一种计算:每次通电后,它都会按相同顺序生成相同的数字。randomSeed()会选择这个序列的起点。用按下按钮的时刻(以微秒为单位)作为种子,因为每局游戏的这个时刻都不同:
randomSeed(micros());
waitTime = random(1000, 3001);这个游戏是一个有三个状态的状态机:READY(等待按下按钮)、WAITING(随机等待)和LIT(LED 已点亮)。等待过程使用millis(),这样后续步骤就能在等待期间检测按钮。
入门代码已经计算好了pressed:按钮现在读取为LOW,上一次读取为HIGH。这个按钮不会抖动,因此不需要消抖。
挑战
中等按钮连接到引脚 2,LED 连接到引脚 12。填入这三个状态:
READY:按下按钮时,用micros()设置随机种子,选择 1000 到 3000 ms 的等待时间,保存开始时间,并切换到WAITINGWAITING:等待结束时,点亮 LED 并切换到LITLIT:按下按钮时,关闭 LED 并切换到READY
按“运行”,玩几轮,然后按“检查”。
亲手试试
const int ledPin = 12;
const int buttonPin = 2;
// 一轮游戏的三种状态
enum State { READY, WAITING, LIT };
State state = READY;
int lastButton = HIGH; // 上一次读取的按钮状态
unsigned long waitStart = 0; // 开始等待的时间
unsigned long waitTime = 0; // 这次要等待多久
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Press the button to start");
}
void loop() {
int button = digitalRead(buttonPin);
bool pressed = (button == LOW && lastButton == HIGH); // 刚刚按下
lastButton = button;
// READY:按下按钮后开始等待
// WAITING:等待结束后点亮 LED
// LIT:按下按钮后关闭 LED,游戏再次进入准备状态
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
项目中的所有课
自己练习: Arduino 在线编辑器