Menu
CoddyTech

Tepki Oyunu: Zamanlayıcı

Coddy'nin Arduino Journey'sinin Projeler bölümünün bir parçası. Ders 6 / 24.

Şimdi oyun seni ölçüyor. Tepki süresi, LED'in yanması ile düğmeye basman arasındaki süredir; bu yüzden sketch'in bir anı hatırlaması gerekir: LED'i yaktığı anı.

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

LIT durumundayken düğmeye basıldığında, fark yanıtı verir:

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

Bu yalnızca sketch hiçbir zaman delay() içinde beklemediği için işe yarar: loop(), düğmeyi her milisaniyede binlerce kez kontrol eder; bu yüzden basış, gerçekleşmesinden bir milisaniyeden kısa süre sonra algılanır. Çoğu insanın tepki süresi 200 ila 300 ms'dir.

challenge icon

Görev

Orta

Süreyi oyuncu için ölç:

  • LED yandığında millis() değerini litAt içine kaydet
  • basış LIT durumundayken geldiğinde millis() - litAt işlemini hesapla
  • Reaction: 250 ms biçiminde yazdır

Run'a bas, oyna, Serial monitörünü oku, ardından Check'e bas.

Kendin dene

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

// Bir turun üç durumu
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // önceki düğme okuması
unsigned long waitStart = 0; // beklemenin başladığı zaman
unsigned long waitTime = 0;  // bu beklemenin ne kadar süreceği

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);  // düğmeye az önce basıldı
  lastButton = button;
  unsigned long now = millis();

  switch (state) {
    case READY:
      if (pressed) {
        randomSeed(micros());  // düğmeye basılma zamanı hiçbir zaman iki kez aynı olmaz
        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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Projeler bölümündeki tüm dersler

Kendi başına pratik yap: Arduino playground