Menu
CoddyTech

Game Reaksi: Mulai Terlalu Cepat

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

Saat ini, pemain yang cerdik bisa curang: tekan tombol berulang kali selama menunggu, dan salah satu tekanan tombol akan terjadi tepat setelah lampu menyala. Dalam perlombaan, ada aturan untuk hal ini: bergerak sebelum sinyal disebut start prematur, dan start dibatalkan.

Mesin status sudah mengetahui kapan pemain terlalu cepat: setiap tekanan tombol dalam status WAITING. Periksa di sana, sebelum memeriksa waktu:

case WAITING:
  if (pressed) {
    Serial.println("Too soon!");
    state = READY;
  } else if (millis() - waitStart >= waitTime) {
    // nyalakan LED seperti sebelumnya
  }
  break;

Kembali ke READY mengakhiri ronde: LED tidak akan menyala, dan tekanan tombol berikutnya memulai permainan baru dengan waktu tunggu acak yang baru. Dengan delay(waitTime), papan tidak bisa mendeteksi tekanan tombol ini sama sekali.

challenge icon

Tantangan

Sedang

Cegah start palsu:

  • di WAITING, saat tombol ditekan, program mencetak Too soon! dan kembali ke READY tanpa menyalakan LED
  • hal lainnya tetap sama: tekanan berikutnya memulai ronde baru

Tekan Jalankan, coba tekan tombol dua kali dengan cepat, lalu tekan Periksa.

Coba sendiri

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

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

int lastButton = HIGH;       // pembacaan tombol sebelumnya
unsigned long waitStart = 0; // saat penantian dimulai
unsigned long waitTime = 0;  // lama penantian ini berlangsung
unsigned long litAt = 0;     // saat LED menyala

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);
        litAt = now;
        state = LIT;
      }
      break;
    case LIT:
      if (pressed) {
        digitalWrite(ledPin, LOW);
        unsigned long reaction = now - litAt;
        Serial.print("Reaction: ");
        Serial.print(reaction);
        Serial.println(" ms");
        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