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

إشارة المشاة والصفّارة

جزء من قسم المشاريع في رحلة Arduino على Coddy. الدرس 4 من 24.

للمشاة إشاراتهم الخاصة: حمراء على المنفذ 7 (انتظر) وخضراء على المنفذ 6 (اعبر). عندما تكون إشارة السيارات حمراء، يرى المشاة اللون الأخضر؛ وفي بقية الوقت يرون اللون الأحمر.

تتغير إشارة عبور المشاة في لحظتين فقط: عندما تتحول إشارة السيارات إلى الأحمر وعندما تغادره. اكتب دالة لإشارات المشاة واستدعها في هذين الموضعين:

void showWalk(bool walk) {
  if (walk) {
    digitalWrite(walkRedPin, LOW);
    digitalWrite(walkGreenPin, HIGH);
  } else {
    digitalWrite(walkGreenPin, LOW);
    digitalWrite(walkRedPin, HIGH);
  }
}

تصدر إشارات العبور أيضًا صفيرًا عندما يكون العبور آمنًا، لمساعدة الأشخاص الذين لا يستطيعون رؤية الأضواء. يمكن أن تأخذ tone() رقمًا ثالثًا يحدد مدة التشغيل: تصدر tone(buzzerPin, 1000, 100) نغمة بتردد 1000 Hz لمدة 100 ms ثم تتوقف تلقائيًا. لا ينتظر البرنامج انتهاءها.

لإصدار صفير كل 500 ms أثناء الإشارة الحمراء فقط، أضف مؤقتًا ثالثًا باستخدام millis() داخل case RED:.

challenge icon

التحدي

متوسط

أضف إشارة عبور المشاة والصفّارة الخاصة بها:

  • إشارة المشاة الحمراء على المنفذ 7 وإشارة المشاة الخضراء على المنفذ 6، وكلتاهما كمخرجات
  • عندما تكون إشارة السيارات حمراء: إشارة المشاة الخضراء مضاءة، والحمراء مطفأة، وصفّارة مدتها 100 ms بتردد 1000 Hz على المنفذ 8 كل 500 ms
  • في بقية الوقت: إشارة المشاة الحمراء مضاءة، والخضراء مطفأة، دون صوت

اضغط Run، ثم Check.

جرّب بنفسك

// أضواء السيارات
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// مصباح LED الخاص باللوحة: ضوء حالة وحدة التحكم
const int statusPin = 13;
// زر العبور
const int buttonPin = 2;

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

bool statusOn = false;
unsigned long lastBlink = 0;

// شغّل مصباحًا واحدًا وأطفئ المصباحين الآخرين.
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);
  pinMode(statusPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  showLight(greenPin);
}

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

  switch (light) {
    case GREEN:
      // الضغط على زر العبور ينهي الضوء الأخضر مبكرًا.
      if (now - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
        light = YELLOW;
        lightStart = now;
        showLight(yellowPin);
      }
      break;
    case YELLOW:
      if (now - lightStart >= 1000) {
        light = RED;
        lightStart = now;
        showLight(redPin);
      }
      break;
    case RED:
      if (now - lightStart >= 3000) {
        light = GREEN;
        lightStart = now;
        showLight(greenPin);
      }
      break;
  }

  // يومض ضوء الحالة كل 500 ms، بغض النظر عما تفعله أضواء السيارات.
  if (now - lastBlink >= 500) {
    lastBlink = now;
    if (statusOn) {
      statusOn = false;
      digitalWrite(statusPin, LOW);
    } else {
      statusOn = true;
      digitalWrite(statusPin, HIGH);
    }
  }
}
quiz iconاختبر نفسك

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

جميع دروس المشاريع

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