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

الوميض دون تأخير

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

توقّف delay() البرنامج بالكامل. أثناء انتظار وميضٍ مدته 500 ms، لا يعمل أي شيء آخر في loop(): لن تُرصد ضغطة الزر خلال هذه المدة حتى ينتهي الانتظار.

الحل هو ألّا تنتظر أبدًا. دع loop() يعمل مرارًا وتكرارًا بسرعة كبيرة، وفي كل مرة قارن الساعة باللحظة التي تغيّر فيها مؤشر LED آخر مرة. لا تفعل شيئًا إلى أن تمر 500 ms. ثم غيّر مؤشر LED وخزّن اللحظة الجديدة:

const unsigned long interval = 500;
unsigned long previousMillis = 0;   // عندما تغيّرت حالة مصباح LED آخر مرة

void loop() {
  unsigned long now = millis();
  if (now - previousMillis >= interval) {
    previousMillis = now;           // احفظ هذه اللحظة
    // بدّل حالة مصباح LED هنا
  }
  // أي شيء آخر هنا يُنفَّذ آلاف المرات في الثانية
}

now - previousMillis هو الوقت المنقضي منذ آخر تغيير. لتبديل حالة مؤشر LED، احتفظ بحالته في متغير، int redState = LOW;، واعكسها باستخدام if/else واكتبها باستخدام digitalWrite(redLed, redState);.

إذا نسيت تحديث previousMillis، فسيظل الشرط صحيحًا بعد أول 500 ms، لذا سيتغير مؤشر LED في كل دورة، وسيبدو نصف مضاء.

challenge icon

التحدي

متوسط

ينبغي أن يتبع مصباح LED الأصفر الزر، لكنه يستجيب متأخرًا لأن استدعاءات delay() الخاصة بمصباح LED الأحمر توقف الحلقة. أعد كتابة وميض المصباح الأحمر باستخدام millis():

  • أبقِ جزء الزر كما هو
  • كل 500 ms، بدّل حالة تشغيل مصباح LED الأحمر على المنفذ 13
  • لا تستخدم delay() في أي مكان

اضغط على Run، وأبقِ الزر مضغوطًا وراقب مصباحي LED، ثم اضغط على Check.

جرّب بنفسك

const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;

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

void loop() {
  // يتبع مصباح LED الأصفر حالة الزر. أبقِ هذا الجزء كما هو.
  if (digitalRead(buttonPin) == LOW) {
    digitalWrite(yellowLed, HIGH);
  } else {
    digitalWrite(yellowLed, LOW);
  }

  // يومض مصباح LED الأحمر، لكن كل استدعاء لـ delay() يوقف تنفيذ الأسطر أعلاه
  // لمدة نصف ثانية. أعد كتابة هذا الجزء باستخدام millis().
  digitalWrite(redLed, HIGH);
  delay(500);
  digitalWrite(redLed, LOW);
  delay(500);
}
quiz iconاختبر نفسك

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

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

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