زر عبور المشاة
جزء من قسم المشاريع في رحلة Arduino على Coddy. الدرس 3 من 24.
يحتاج المشاة إلى طريقة لطلب العبور. الزر الأزرق على المنفذ 2 هو زر العبور: الضغط عليه أثناء الإشارة الخضراء ينهي اللون الأخضر فورًا، فتتحول إشارة السيارات إلى الأصفر، ثم الأحمر.
بما أن الأضواء تعمل باستخدام millis()، تمرّ loop() على حالة اللون الأخضر آلاف المرات في الثانية، ويمكنها قراءة الزر في كل مرة، وكذلك قراءة الساعة. ينتهي اللون الأخضر عندما يتحقق أيٌّ منهما، وهذا ما يعنيه || (أو):
case GREEN:
if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
// انتقل إلى الأصفر
}
break;يوصل الزر المنفذ 2 بالأرضي، لذا اضبط المنفذ على INPUT_PULLUP: يقرأ HIGH إلى أن يسحبه الزر إلى LOW.
حالة اللون الأخضر وحدها تقرأ الزر. في حالتي الأصفر والأحمر تكون السيارات قد بدأت بالتوقف بالفعل، ويستمر اللون الأصفر لثانيته الكاملة حتى يتوفر للسائقين وقت للتوقف.
التحدي
متوسطأضف زر العبور إلى المنفذ 2:
- اضبط المنفذ 2 على
INPUT_PULLUP - أثناء إضاءة الضوء الأخضر، تنهي الضغطة اللون الأخضر فورًا (يتحول الضوء إلى الأصفر)
- يستمر اللونان الأصفر والأحمر بالمدتين المحددتين، سواء ضُغط الزر أم لا
اضغط Run، وانتظر ظهور الضوء الأخضر، ثم اضغط الزر الأزرق، وبعدها اضغط Check.
جرّب بنفسك
// أضواء السيارات
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// مصباح LED الخاص باللوحة: ضوء حالة وحدة التحكم
const int statusPin = 13;
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);
showLight(greenPin);
}
void loop() {
unsigned long now = millis();
switch (light) {
case GREEN:
if (now - lightStart >= 3000) {
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);
}
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المشاريع
تدرّب بنفسك: Playground لـ Arduino