Menu
CoddyTech

Game Reaksi: Timer

Termasuk bagian Proyek dalam perjalanan Arduino di Coddy. Pelajaran 6 dari 24.

Sekarang game mengukur waktu reaksimu. Waktu reaksi adalah waktu sejak LED menyala hingga kamu menekan tombol, jadi sketch perlu mengingat satu momen: saat LED menyala.

digitalWrite(ledPin, HIGH);
litAt = millis();
state = LIT;

Saat tombol ditekan dalam kondisi LIT, selisih waktunya adalah hasilnya:

unsigned long reaction = millis() - litAt;
Serial.print("Reaction: ");
Serial.print(reaction);
Serial.println(" ms");

Ini hanya berfungsi karena sketch tidak pernah berhenti dalam delay(): loop() memeriksa tombol ribuan kali setiap milidetik, jadi penekanan tombol terdeteksi kurang dari satu milidetik setelah terjadi. Kebanyakan orang membutuhkan 200 hingga 300 ms.

challenge icon

Tantangan

Sedang

Ukur waktu pemain:

  • simpan millis() di litAt saat LED menyala
  • saat tombol ditekan dalam LIT, hitung millis() - litAt
  • cetak hasilnya sebagai Reaction: 250 ms

Tekan Jalankan, mainkan, baca monitor Serial, lalu tekan Periksa.

Coba sendiri

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

// Tiga status dalam satu putaran
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // hasil pembacaan tombol sebelumnya
unsigned long waitStart = 0; // saat waktu tunggu dimulai
unsigned long waitTime = 0;  // durasi waktu tunggu ini

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);  // baru saja ditekan
  lastButton = button;
  unsigned long now = millis();

  switch (state) {
    case READY:
      if (pressed) {
        randomSeed(micros());  // waktu penekanan tidak pernah sama dua kali
        waitTime = random(1000, 3001);
        waitStart = now;
        state = WAITING;
      }
      break;
    case WAITING:
      if (now - waitStart >= waitTime) {
        digitalWrite(ledPin, HIGH);
        state = LIT;
      }
      break;
    case LIT:
      if (pressed) {
        digitalWrite(ledPin, LOW);
        state = READY;
      }
      break;
  }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Proyek

Latihan sendiri: Playground Arduino