Саймон: случайная последовательность
Часть раздела Проекты путешествия по 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 мс, затем включай каждый цвет и воспроизводи соответствующую ноту в течение 400 мс, после чего выдерживай паузу 200 мс
Затем кнопки будут загораться и воспроизводить звук, как и раньше. Нажми 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;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Проекты
4Саймон
Саймон: кнопки и нотыСаймон: случайная последовательностьСаймон: повтори последовательностьСаймон: полная играПотренируйтесь самостоятельно: Песочница Arduino