إشارة المرور باستخدام millis()
جزء من قسم المشاريع في رحلة Arduino على Coddy. الدرس 2 من 24.
أثناء كل delay(3000) لا تفعل اللوحة أي شيء آخر، لذا لن تتمكن من ملاحظة زر عبور المشاة الذي تضيفه الخطوة التالية. ينتقل التوقيت إلى millis().
الضوء هو آلة حالات: يكون دائمًا في حالة واحدة (أخضر أو أصفر أو أحمر)، وينتقل إلى الحالة التالية عندما تستمر تلك الحالة مدة كافية. تسمّي enum الحالات، ويحتفظ متغير بالحالة الحالية، ويحتفظ متغير آخر بوقت بدئها:
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;الحالة الأولى هي الأخضر، لذا أضئ الضوء الأخضر في setup(). في كل مرة تنفذ فيها loop() دورة، يسأل switch الحالة الحالية عمّا إذا كانت قد استمرت مدة كافية، وعندئذ فقط ينتقل إلى الحالة التالية ويغيّر الأضواء:
case GREEN:
if (millis() - lightStart >= 3000) {
light = YELLOW;
lightStart = millis();
showLight(yellowPin);
}
break;لا يوجد أي انتظار، لذا تكون loop() متاحة لمهام أخرى. أثبت ذلك باستخدام ضوء الحالة: اجعل LED المدمج في اللوحة، على المنفذ 13، يومض كل 500 ms.
التحدي
متوسطأعِد كتابة التوقيت من دون delay():
- أبقِ الضوء الأخضر لمدة 3000 ms، والأصفر لمدة 1000 ms، والأحمر لمدة 3000 ms
- استخدم
enumللحالات الثلاث، وswitch، وmillis() - أضئ الضوء الأخضر في
setup()، واستدعِshowLight()فقط عند تغيّر الحالة - اجعل المنفذ 13 يومض كل 500 ms (مضاء لمدة 500 ms، ومطفأ لمدة 500 ms)، طوال الوقت
اضغط على Run، ثم Check.
جرّب بنفسك
// أضواء السيارات
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// شغّل ضوءًا واحدًا وأطفئ الضوءين الآخرين.
void showLight(int pin) {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(pin, HIGH);
}
void setup() {
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
}
void loop() {
showLight(greenPin);
delay(3000);
showLight(yellowPin);
delay(1000);
showLight(redPin);
delay(3000);
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المشاريع
تدرّب بنفسك: Playground لـ Arduino