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

حالات مسمّاة باستخدام enum

جزء من قسم التوقيت دون delay في رحلة Arduino على Coddy. الدرس 9 من 18.

يعمل استخدام الأوضاع المرقّمة 0 و1 و2، لكن if (mode == 2) لا يوضّح معنى الرقم 2. يمنح enum كل رقم اسمًا:

enum State { READY, RUNNING, DONE };
State state = READY;

ينشئ السطر الأول نوعًا جديدًا، State، لا تكون قيمه إلا READY وRUNNING وDONE. في الأساس تظل هذه القيم 0 و1 و2، لكن الأسماء توضّح معنى كل قيمة. ينشئ السطر الثاني متغيرًا من ذلك النوع.

يتوافق enum مع switch: حالة case واحدة لكل حالة.

switch (state) {
  case READY:
    // ما الذي تفعله READY، ومتى تنتقل إلى الحالة التالية
    break;
  case RUNNING:
    // ...
    break;
}

للانتقال إلى حالة جديدة، عيّن state وتذكّر متى بدأت: state = DONE; stateStart = millis();. بعد ذلك، تحسب كل حالة مدتها باستخدام millis() - stateStart. تُسمّى هذه الطريقة في كتابة البرنامج آلة حالات.

challenge icon

التحدي

متوسط

للآلة ثلاث حالات. تمت كتابة READY من أجلك: يكون مصباح LED الأخضر مضاءً، ويؤدي الضغط على الزر إلى تشغيل الآلة. أضف الحالتين الأخريين:

  • RUNNING: يكون مصباح LED الأصفر مضاءً. بعد 2000 ms، أطفئه وانتقل إلى DONE.
  • DONE: يكون مصباح LED الأحمر مضاءً. بعد 1000 ms، أطفئه وارجع إلى READY.

احفظ stateStart عند كل تغيير. اضغط Run، ثم اضغط الزر، ثم Check.

جرّب بنفسك

const int buttonPin = 2;
const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;

enum State { READY, RUNNING, DONE };
State state = READY;

unsigned long stateStart = 0;   // عندما بدأت الحالة الحالية

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(greenLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(redLed, OUTPUT);
}

void loop() {
  unsigned long now = millis();

  switch (state) {
    case READY:
      digitalWrite(greenLed, HIGH);
      if (digitalRead(buttonPin) == LOW) {
        digitalWrite(greenLed, LOW);
        state = RUNNING;
        stateStart = now;
      }
      break;

    // أضف حالة RUNNING: شغّل الضوء الأصفر؛ بعد 2000 ms، أطفئ الضوء الأصفر وانتقل إلى DONE

    // أضف حالة DONE: شغّل الضوء الأحمر؛ بعد 1000 ms، أطفئ الضوء الأحمر وعُد إلى READY
  }
}
quiz iconاختبر نفسك

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

جميع دروس التوقيت دون delay

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