Перейти к содержанию

Игра со светодиодами Ардуино «Саймон говорит»

Игра со светодиодами на Ардуино Саймон говорит

Игра с кнопками и светодиодами на Ардуино «Саймон говорит» (игра повтори последовательность) — еще один мини-проект с минимальным набором необходимых компонентов. Для сборки понадобится только макетная плата, кнопки и светодиоды с резисторами. Нажимая на кнопки, необходимо повторить последовательность включения светодиодов. С каждым новым уровнем скорость игры будет постепенно увеличиваться.

Необходимые компоненты:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • светодиоды
  • резисторы и кнопки
  • пьезодинамик
  • макетная плата
  • коннекторы

Дополнительные материалы на эту тему:

  1. Пианино на Ардуино с кнопками и пищалкой
  2. Включение светодиода от кнопки Ардуино
  3. Поочередное включение светодиодов от Ардуино

Игра на Ардуино «Повтори последовательность 2.0»

Игра на Ардуино Повтори последовательность

Светодиоды подключены последовательно к цифровым портам Ардуино со 2 по 6, кнопки подключены к аналоговым входам с A0 по A4. Порты подключения кнопок и светодиодов можно изменить, указав их в скетче. В программе используется только 10 комбинаций включения светодиодов — массив char* kod[]. В массив данных можно добавлять другие новые комбинации, при этом все светодиоды в комбинации должны включаться один раз.

Скетч «Simon Says Game» (повтори последовательность)


// пин для пьезо динамика
#define buzzer 12
// пины для светодиодов
int led[] = { 2, 3, 4, 5, 6 };
// пины для кнопок
int but[] = { A0, A1, A2, A3, A4 };
// варианты комбинаций
char* kod[] = { "01324", "40231", "02413", "03241", "40312",
             "14320", "13402", "12304", "41203", "10423" };
int del = 1000;
int w = -1;
byte level = 1;
byte b1, b2, b3, b4, b5;
String KOD, OTV, A;

byte num_led = sizeof(led) / sizeof(int*);
byte num_but = sizeof(but) / sizeof(int*);
byte num_cod = sizeof(kod) / sizeof(char*);
byte len = strlen(kod[0]);

boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button3WasUp = true;
boolean button4WasUp = true;
boolean button5WasUp = true;

void setup() {
  pinMode(buzzer, OUTPUT);
  for (byte i = 0; i <= num_led; i++) {
    pinMode(led[i], OUTPUT);
  }
  for (byte i = 0; i <= num_but; i++) {
    pinMode(but[i], INPUT_PULLUP);
  }
  Serial.begin(9600);
  Serial.println("LEVEL - " + String(level));
  Serial.println("");
}

void loop() {
 
  // выбираем комбинацию
  while (w == -1) {
    int  x = random(0, num_cod - 1);
    KOD = {kod[x]};
    b1 = 0; b2 = 0; b3 = 0; b4 = 0; b5 = 0;
    w = 0;
  }
 
  // поочередно включаем светодиоды
  while (w <= len - 1) {
    A = KOD[w];
    int a = A.toInt();
    digitalWrite(led[a], HIGH);
    tone(buzzer, 5 * led[a]);
    delay(10);
    noTone(buzzer);
    delay(del);
    digitalWrite(led[a], LOW);
    w++;
  }
 
    // ждем нажатия кнопок
  while (w >= len - 1 and w <= len + len) {
    boolean button1IsUp = digitalRead(but[0]);
    boolean button2IsUp = digitalRead(but[1]);
    boolean button3IsUp = digitalRead(but[2]);
    boolean button4IsUp = digitalRead(but[3]);
    boolean button5IsUp = digitalRead(but[4]);

    if (b1 == 0 and button1WasUp and !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(but[0]);
      if (!button1IsUp) {
        tone(buzzer, 5 * led[0]);
        delay(10);
        noTone(buzzer);
        OTV = OTV + "0";
        digitalWrite(led[0], HIGH);
        b1 = 1;
        w++;
      }
    }
    button1WasUp = button1IsUp;

    if (b2 == 0 and button2WasUp and !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(but[1]);
      if (!button2IsUp) {
        tone(buzzer, 5 * led[1]);
        delay(10);
        noTone(buzzer);
        OTV = OTV + "1";
        digitalWrite(led[1], HIGH);
        b2 = 1;
        w++;
      }
    }
    button2WasUp = button2IsUp;

    if (b3 == 0 and button3WasUp and !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(but[2]);
      if (!button3IsUp) {
        tone(buzzer, 5 * led[2]);
        delay(10);
        noTone(buzzer);
        OTV = OTV + "2";
        digitalWrite(led[2], HIGH);
        b3 = 1;
        w++;
      }
    }
    button3WasUp = button3IsUp;

    if (b4 == 0 and button4WasUp and !button4IsUp) {
      delay(10);
      button4IsUp = digitalRead(but[3]);
      tone(buzzer, 5 * led[3]);
      delay(10);
      noTone(buzzer);
      if (!button4IsUp) {
        OTV = OTV + "3";
        digitalWrite(led[3], HIGH);
        b4 = 1;
        w++;
      }
    }
    button4WasUp = button4IsUp;

    if (b5 == 0 and button5WasUp and !button5IsUp) {
      delay(10);
      button5IsUp = digitalRead(but[4]);
      tone(buzzer, 5 * led[4]);
      delay(10);
      noTone(buzzer);
      if (!button5IsUp) {
        OTV = OTV + "4";
        digitalWrite(led[4], HIGH);
        b5 = 1;
        w++;
      }
    }
    button5WasUp = button5IsUp;

    // если правильно - начинаем новый уровень
    if (w == len + len and OTV == KOD) {
      Serial.println("");
      Serial.println("DA!");
      Serial.println("");
      level++;
      Serial.println("LEVEL - " + String(level));
      del = del - 100;
      if (del < 10) { del = 100; }
      delay(1000);
      for (byte i = 0; i <= num_led; i++) {
        digitalWrite(led[i], LOW);
      }
      delay(2000);
      KOD = "";
      OTV = "";
      w = -1;
    }
 
    // если неправильно - задаем новую комбинацию
    if (w == len + len and OTV != KOD) {
      Serial.println("");
      Serial.println("HET!");
      Serial.println("");
      tone(buzzer, 100);
      delay(1000);
      noTone(buzzer);
      Serial.println("LEVEL - " + String(level));
      for (byte i = 0; i <= num_led; i++) {
        digitalWrite(led[i], LOW);
      }
      delay(2000);
      KOD = "";
      OTV = "";
      w = -1;
    }

  }
}

Заключение. Текущий уровень игры Simon Says отображается на мониторе порта Arduino IDE. При неправильном вводе через пьезодинамик подается неприятный звуковой сигнал. Еще один игровой проект на микроконтроллере Arduino с кнопками и светодиодами можно найти здесь — Игра Угадай код. Если у вас есть вопросы по программе или сборке схемы для проекта «Simon Says Game» — оставляйте их в комментариях к этой записи.

Комментарии 4

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

newzaym
➜