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