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

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

Для этого проекта потребуется:

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

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

Игра на Arduino Повтори последовательность
Игра со светодиодами на Arduino «Повтори последовательность»

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

Скетч для игры «Повтори последовательность»

// пин для подключения динамика
#define buzzer 11
// пины подключения светодиодов
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;
    }

  }
}

Пояснения к коду:

  1. после 10 уровня скорость включения светодиодов уже не увеличивается;
  2. порты для подключения кнопок и светодиодов можно поменять в программе, при этом команды digitalRead и digitalWrite в скетче изменять не надо.



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



14 Replies to “Игра со светодиодами «Повтори последовательность»”

  1. На картинке подпись аналоговых пинов и действительное подключение (если верить подключению проводов) противоположное, что правильно?

    1. Неправильно были подписаны пины. Спасибо — исправили схему подключения кнопок в игре «Саймон говорит»

  2. Здраствуйте подскажите пожалуйста почему светодиод который подключен к пину d2 светит ну прям очень бледно как исправить?

  3. В какую строчку нужно поставить i чтобы светодиод который подключен к пину d2 горел ярче. Если смотреть библиотеку у меня в этой строке написан комментарий // настраиваем пины для светодиодов.Помоги пожалуйста.

  4. А что если после первого уровня игра перестает работать? То есть горят и не погасают светодиоды?

    1. Если в скетче ничего не меняли, то проверьте подключение. Такого ни у кого еще не было

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.