سايمون: تسلسل عشوائي
جزء من قسم المشاريع في رحلة Arduino على Coddy. الدرس 14 من 24.
الآن يحين دور اللوحة. في المرة الأولى التي يُترك فيها زر، تبدأ اللعبة: تختار اللوحة أربعة ألوان عشوائية، وتحتفظ بها في مصفوفة، ثم تعرضها.
تعطي random(4) القيمة 0 أو 1 أو 2 أو 3: لونًا واحدًا. تملأ حلقة for المصفوفة. كما في لعبة رد الفعل، ابدأ بالبذر باستخدام micros() عند الضغط، وإلا فستعرض كل لعبة الألوان نفسها:
randomSeed(micros());
for (int i = 0; i < 4; i++) {
sequence[i] = random(4);
}تعرض حلقة for ثانية النمط: أضئ لونًا مع نغمته، وانتظر، ثم أطفئه، وانتظر مرة أخرى. الانتظار الثاني مهم عندما يظهر اللون مرتين: فبدونه، يبدو الأحمر ثم الأحمر كأنه لون أحمر واحد طويل. اللاعب يراقب فقط الآن، لذا فإن delay() مناسب.
for (int i = 0; i < 4; i++) {
lightOn(sequence[i]);
delay(400);
lightOff(sequence[i]);
delay(200);
}يتذكر متغير bool يُسمى playing أن اللعبة قد بدأت، لذا فإن الضغطة الأولى فقط هي التي تبدأها.
التحدي
متوسطاجعل اللوحة تعزف نمطًا:
- أضف
int sequence[4];وbool playing = false; - عند ترك زر وكان
playingهوfalse: ابدأ البذرة، واملأ المصفوفة باستخدامrandom(4)، واضبطplayingعلىtrue، ثم اعزف النمط - النمط: انتظر 500 ms، ثم اعزف كل لون مع نغمته لمدة 400 ms، وبعده 200 ms من الصمت
بعد ذلك، تضيء الأزرار وتعزف كما في السابق. اضغط على Run، ثم اضغط على زر، ثم اضغط على Check.
جرّب بنفسك
// عنصر واحد لكل لون: أحمر، أخضر، أزرق، أصفر
const int ledPins[4] = {9, 10, 11, 12};
const int buttonPins[4] = {2, 3, 4, 5};
const int notes[4] = {262, 330, 392, 523}; // C وE وG وC العالية
const int buzzerPin = 8;
int lastState[4] = {HIGH, HIGH, HIGH, HIGH}; // آخر قراءة لكل زر
// أضئ اللون i وشغّل نغمته.
void lightOn(int i) {
digitalWrite(ledPins[i], HIGH);
tone(buzzerPin, notes[i]);
}
// أطفئ اللون i وأوقف الصوت.
void lightOff(int i) {
digitalWrite(ledPins[i], LOW);
noTone(buzzerPin);
}
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
pinMode(buttonPins[i], INPUT_PULLUP);
}
}
void loop() {
for (int i = 0; i < 4; i++) {
int state = digitalRead(buttonPins[i]);
if (state == LOW && lastState[i] == HIGH) { // مضغوط
lightOn(i);
}
if (state == HIGH && lastState[i] == LOW) { // أُفلت
lightOff(i);
}
lastState[i] = state;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المشاريع
تدرّب بنفسك: Playground لـ Arduino