Menu
CoddyTech

Саймон: случайная последовательность

Часть раздела Проекты путешествия по 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 запоминает, что игра началась, поэтому её запускает только первое нажатие.

challenge icon

Задание

Средне

Сделай так, чтобы плата воспроизводила последовательность:

  • добавь 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;
  }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Проекты

Потренируйтесь самостоятельно: Песочница Arduino