Menu
CoddyTech

Trò chơi phản xạ: Thời gian chờ ngẫu nhiên

Thuộc phần Dự án trong hành trình Arduino của Coddy. Bài học 5 trên 24.

Dự án tiếp theo là một trò chơi phản xạ. Bạn nhấn nút, bo mạch chờ, sau đó bật đèn LED và bạn nhấn lại nhanh nhất có thể.

Thời gian chờ là ngẫu nhiên, nếu không bạn sẽ học được nhịp. random(1000, 3001) cho ra một số nguyên từ 1000 đến 3000.

random() là một phép tính: sau mỗi lần bật nguồn, hàm này cho ra cùng các số theo cùng thứ tự. randomSeed() chọn điểm bắt đầu của dãy đó. Khởi tạo hạt giống bằng thời điểm nhấn nút, tính bằng micro giây, thời điểm này khác nhau trong mỗi ván:

randomSeed(micros());
waitTime = random(1000, 3001);

Trò chơi là một máy trạng thái với ba trạng thái: READY (chờ nhấn nút), WAITING (thời gian chờ ngẫu nhiên) và LIT (đèn LED đang sáng). Thời gian chờ sử dụng millis(), nhờ đó các bước tiếp theo có thể theo dõi nút trong lúc chờ.

Phần code khởi đầu đã tính pressed: hiện tại nút đọc là LOW, còn lần trước đọc là HIGH. Nút này không bị nảy, nên không cần chống dội.

challenge icon

Thử thách

Trung bình

Nút nhấn nối với chân 2 và LED nối với chân 12. Điền ba trạng thái:

  • READY: khi nhấn nút, khởi tạo hạt giống bằng micros(), chọn thời gian chờ từ 1000 đến 3000 ms, lưu thời điểm bắt đầu rồi chuyển sang WAITING
  • WAITING: khi hết thời gian chờ, bật LED rồi chuyển sang LIT
  • LIT: khi nhấn nút, tắt LED rồi chuyển sang READY

Nhấn Chạy, chơi vài lượt, rồi nhấn Kiểm tra.

Tự làm thử

const int ledPin = 12;
const int buttonPin = 2;

// Ba trạng thái của một lượt chơi
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // Giá trị nút bấm ở lần đọc trước
unsigned long waitStart = 0; // Thời điểm bắt đầu chờ
unsigned long waitTime = 0;  // Thời gian chờ kéo dài bao lâu

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);  // Vừa được nhấn
  lastButton = button;

  // READY: nhấn nút để bắt đầu chờ
  // WAITING: khi hết thời gian chờ, bật đèn LED
  // LIT: nhấn nút để tắt đèn LED và trò chơi sẵn sàng bắt đầu lại

}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Dự án

Tự luyện tập: Playground Arduino