Menu
CoddyTech

Tepki Oyunu: En İyi Süre

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

Eskiz, en iyi (en düşük) süreyi bir değişkende tutar ve her turdan sonra yazdırır.

Başlangıçta henüz en iyi süre yoktur. “Henüz yok” anlamına gelmesi için hiçbir gerçek turun sahip olamayacağı bir değer olan 0'ı kullan. Her turdan sonra: henüz en iyi süre yoksa veya bu tur onu geçerse, bu tur yeni en iyi süredir.

if (best == 0 || reaction < best) {
  best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");

Bunu, turun gerçek bir süreyle sona erdiği LIT durumuna koy. Erken başlama bu koda asla ulaşmaz; bu yüzden rekor hâline de gelmez.

En iyi süre kartın belleğinde (RAM) tutulur; güç kapatıldığında bellek silinir: rekor, Run'a yeniden basana kadar kalır.

challenge icon

Görev

Orta

Bir kayıt tut:

  • başlangıçta 0 olan bir best değişkeni
  • her süre tutulan turdan sonra, best 0 ise veya tur daha hızlıysa, turu yeni en iyi süre olarak kaydet
  • her turdan sonra Best: 250 ms olarak yazdır
  • erken basışlar hiçbir şeyi değiştirmez

Run'a bas, en iyi süreni geçmeye çalış, sonra 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;       // düğmenin en son okunan durumu
unsigned long waitStart = 0; // beklemenin başladığı an
unsigned long waitTime = 0;  // bu beklemenin ne kadar sürdüğü
unsigned long litAt = 0;     // LED'in yandığı an

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

  switch (state) {
    case READY:
      if (pressed) {
        randomSeed(micros());  // basılma zamanı hiçbir zaman iki kez aynı olmaz
        waitTime = random(1000, 3001);
        waitStart = now;
        state = WAITING;
      }
      break;
    case WAITING:
      if (pressed) {
        // Işık yanmadan önce basıldı: hatalı başlangıç.
        Serial.println("Too soon!");
        state = READY;
      } else 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 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