Menu
CoddyTech
flag Ar iconالعربيةdown icon

لعبة سرعة الاستجابة: انطلاق مبكر

جزء من قسم المشاريع في رحلة Arduino على Coddy. الدرس 7 من 24.

يمكن للاعب الذكي الآن أن يغش: يضغط مرارًا أثناء الانتظار، فتأتي إحدى الضغطات مباشرة بعد إضاءة المصباح. للسباقات قاعدة بشأن هذا: التحرك قبل الإشارة يُعد انطلاقة خاطئة، ويُلغى السباق.

تعرف آلة الحالات بالفعل متى يكون اللاعب متعجلًا جدًا: عند أي ضغطة في الحالة WAITING. ابحث عن ذلك هناك، قبل التحقق من الساعة:

case WAITING:
  if (pressed) {
    Serial.println("Too soon!");
    state = READY;
  } else if (millis() - waitStart >= waitTime) {
    // أضئ مصباح LED، كما فعلت من قبل
  }
  break;

العودة إلى READY تنهي الجولة: لا يضيء مصباح LED أبدًا، وتبدأ الضغطة التالية لعبة جديدة بانتظار عشوائي جديد. مع delay(waitTime) لم يكن بإمكان اللوحة رصد هذه الضغطة إطلاقًا.

challenge icon

التحدي

متوسط

اكتشف الضغطات المبكرة:

  • في WAITING، تؤدي الضغطة إلى طباعة Too soon! والعودة إلى READY دون إضاءة LED
  • يبقى كل شيء آخر كما هو: تبدأ الضغطة التالية جولة جديدة

اضغط على تشغيل، وجرّب الضغط مرتين بسرعة، ثم اضغط على تحقّق.

جرّب بنفسك

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

// الحالات الثلاث للجولة
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // قراءة الزر في المرة السابقة
unsigned long waitStart = 0; // متى بدأ الانتظار
unsigned long waitTime = 0;  // مدة هذا الانتظار
unsigned long litAt = 0;     // متى أضاء LED

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);  // ضُغط للتو
  lastButton = button;
  unsigned long now = millis();

  switch (state) {
    case READY:
      if (pressed) {
        randomSeed(micros());  // وقت الضغط لا يتطابق مرتين أبدًا
        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 iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المشاريع

تدرّب بنفسك: Playground لـ Arduino