آلة حالات إشارة المرور
جزء من قسم التوقيت دون 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 للحالة يومض طوال الوقت لإظهار أن وحدة التحكم تعمل.
التحدي
متوسطيومض مصباح 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، ثم الأخضر مجددًا
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس التوقيت دون delay
تدرّب بنفسك: Playground لـ Arduino