סיימון: רצף אקראי
חלק מהיחידה פרויקטים במסלול ה-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;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה פרויקטים
תרגלו בעצמכם: Arduino אונליין