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

آلة حالات إشارة المرور

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

إشارة المرور آلة حالات: تكون دائمًا في حالة واحدة (أخضر أو أصفر أو أحمر)، وتستمر كل حالة مدة محددة، وتعرف كل حالة الحالة التي تليها:

  • GREEN: الضوء الأخضر مضاء؛ بعد 2 s، انتقل إلى YELLOW
  • YELLOW: الضوء الأصفر مضاء؛ بعد 1 s، انتقل إلى RED
  • RED: الضوء الأحمر مضاء؛ بعد 2 s، انتقل إلى GREEN

يصبح كل سطر عبارة عن case واحدة:

case GREEN:
  setLights(HIGH, LOW, LOW);
  if (now - lightStart >= 2000) {
    light = YELLOW;
    lightStart = now;
  }
  break;

باستخدام delay(2000) ستعمل الإشارة أيضًا، لكن لن يكون بالإمكان تشغيل أي شيء آخر. باستخدام millis()، تستغرق كل دورة عبر loop() بضع ميكروثوانٍ، لذا يتوفر للوحة وقت لتنفيذ مهام أخرى: وهنا، مؤشر LED للحالة يومض طوال الوقت لإظهار أن وحدة التحكم تعمل.

challenge icon

التحدي

متوسط

يومض مصباح LED للحالة على المنفذ 13 بالفعل، كما أن enum وlightStart جاهزان. اكتب إشارة المرور باستخدام switch (light) مع case لكل ضوء:

  • الأخضر لمدة 2 s، والأصفر لمدة 1 s، والأحمر لمدة 2 s، ثم الأخضر مجددًا
  • مصباح LED واحد في كل مرة، باستخدام setLights()
  • من دون delay()، حتى يستمر مصباح LED للحالة في الوميض

اضغط على Run، ثم Check.

جرّب بنفسك

const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;
const int statusLed = 13;   // مصباح LED الخاص باللوحة

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;   // وقت إضاءة المصباح الحالي

unsigned long statusPrevious = 0;
int statusState = LOW;

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

void setLights(int green, int yellow, int red) {
  digitalWrite(greenLed, green);
  digitalWrite(yellowLed, yellow);
  digitalWrite(redLed, red);
}

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

  // تتغير حالة مصباح LED كل 250 ms، لإظهار أن وحدة التحكم تعمل
  if (now - statusPrevious >= 250) {
    statusPrevious = now;
    if (statusState == LOW) {
      statusState = HIGH;
    } else {
      statusState = LOW;
    }
    digitalWrite(statusLed, statusState);
  }

  // إشارة المرور: تعليمة switch ‏(light) مع حالة case لكل لون
  // الأخضر 2 s، الأصفر 1 s، الأحمر 2 s، ثم الأخضر مجددًا
}
quiz iconاختبر نفسك

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

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

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