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

Простой проект на Ардуино: игра «Угадай шифр»

Простой проект на Ардуино: игра "Угадай шифр"

Простой проект на микроконтроллере Arduino, в котором предлагается отгадать шифр из трехзначного числа. К плате Ардуино дополнительно подключено два светодиода для индикации правильного и неправильного ввода шифра от замка. Вся информация (сгенерированный код из массива и ответ пользователя) будет отображаться на мониторе порта Arduino IDE. При желании можно подключить к схеме OLED или LCD дисплей.

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

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

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

  1. Игра на Ардуино Повтори последовательность
  2. Пианино на Ардуино с кнопками и зуммером
  3. Тетрис на Ардуино с дисплеем OLED 128×64

в программе используется шесть вариантов кода в массиве char* kod[3], которые выбираются рандомно (можно добавить больше вариантов или оставить только один). При нажатии соответствующей кнопки к строке String otv = «» будут добавлены цифры «1», «2» или «3». После того, как пользователем было введено три числа, происходит сравнение кода с введенным ответом, а результат выводится на монитор порта Ардуино IDE.

Простой проект на Arduino: игра «Угадай Код»

Простой проект на Arduino: игра "Угадай Код"

На изображении выше показана сборка схемы проекта с кнопками. Обратите внимание, что кнопки подключены к Arduino без резисторов, так как пины на плате настроены в режиме INPUT_PULLUP. В этом режиме конфигурации пина, к нему автоматически подтягивается встроенный резистор 20кОм в самом микроконтроллере. После сборки схемы на макетной плате, загрузите программу в плату и откройте монитор порта Arduino IDE.

Скетч для игры «Угадай Код» с платой Arduino Uno


#define RED 13 // красный светодиод
#define GRN 10 // зеленый светодиод

#define B1 5 // первая кнопка
#define B2 4 // вторая кнопка
#define B3 3 // третья кнопка

byte x;
byte w = 1;
String otvet = "";
String KOD = "";

// массив с вариантами кода
char* kod[3] = {"123", "231", "312"};

// переменные для считывания нажатия на кнопки
boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button3WasUp = true;

void setup() {
  Serial.begin(9600);
  pinMode(RED, OUTPUT);
  pinMode(GRN, OUTPUT);
 
  pinMode(B1, INPUT_PULLUP);
  pinMode(B2, INPUT_PULLUP);
  pinMode(B3, INPUT_PULLUP);
}

void loop() {

/// ФУНКЦИЯ ГЕНЕРАЦИИ КОДА ///
  while (w == 1) {
    delay(500);
    digitalWrite(RED, HIGH); digitalWrite(GRN, HIGH);
    delay(100);
    digitalWrite(RED, LOW); digitalWrite(GRN, LOW);
    x = random(0, 2);
    KOD = String(kod[x]);
    Serial.print("KOD - "); 
    Serial.println(KOD);
    Serial.println("");
    Serial.print("OTVET - ");
    w = 2;
  }

/// ВВОДИМ ПЕРВОЕ ЧИСЛО ///
  while (w == 2) {
   // узнаем текущее состояние кнопок
   boolean button1IsUp = digitalRead(B1);
   boolean button2IsUp = digitalRead(B2);
   boolean button3IsUp = digitalRead(B3);
    
   // если первая кнопка была нажата, добавляем к строке "1"
   if (button1WasUp && !button1IsUp) {
     delay(10);
     button1IsUp = digitalRead(B1);
     if (!button1IsUp) { otvet = otvet + "1"; Serial.print("1"); w = 3;}
   }
   button1WasUp = button1IsUp;
   
   // если вторая кнопка была нажата, добавляем к строке "2"
   if (button2WasUp && !button2IsUp) {
     delay(10);
     button2IsUp = digitalRead(B2);
     if (!button2IsUp) { otvet = otvet + "2"; Serial.print("2"); w = 3;}
   }
   button2WasUp = button2IsUp;
    
   // если третья кнопка была нажата, добавляем к строке "3"
   if (button3WasUp && !button3IsUp) {
     delay(10);
     button3IsUp = digitalRead(B3);
     if (!button3IsUp) { otvet = otvet + "3"; Serial.print("3"); w = 3;}
   }
   button3WasUp = button3IsUp;
  }

/// ВВОДИМ ВТОРОЕ ЧИСЛО ///
  while (w == 3) {
   // узнаем текущее состояние кнопок
   boolean button1IsUp = digitalRead(B1);
   boolean button2IsUp = digitalRead(B2);
   boolean button3IsUp = digitalRead(B3);
    
   // если первая кнопка была нажата, добавляем к строке "1"
   if (button1WasUp && !button1IsUp) {
     delay(10);
     button1IsUp = digitalRead(B1);
     if (!button1IsUp) { otvet = otvet + "1"; Serial.print("1"); w = 4;}
   }
   button1WasUp = button1IsUp;
   
   // если вторая кнопка была нажата, добавляем к строке "2"
   if (button2WasUp && !button2IsUp) {
     delay(10);
     button2IsUp = digitalRead(B2);
     if (!button2IsUp) { otvet = otvet + "2"; Serial.print("2"); w = 4;}
   }
   button2WasUp = button2IsUp;
    
   // если третья кнопка была нажата, добавляем к строке "3"
   if (button3WasUp && !button3IsUp) {
     delay(10);
     button3IsUp = digitalRead(B3);
     if (!button3IsUp) { otvet = otvet + "3"; Serial.print("3"); w = 4;}
   }
   button3WasUp = button3IsUp;
  }

/// ВВОДИМ ТРЕТЬЕ ЧИСЛО ///
  while (w == 4) {
   // узнаем текущее состояние кнопок
   boolean button1IsUp = digitalRead(B1);
   boolean button2IsUp = digitalRead(B2);
   boolean button3IsUp = digitalRead(B3);
    
   // если первая кнопка была нажата, добавляем к строке "1"
   if (button1WasUp && !button1IsUp) {
     delay(10);
     button1IsUp = digitalRead(B1);
     if (!button1IsUp) { otvet = otvet + "1"; Serial.println("1"); w = 5;}
   }
   button1WasUp = button1IsUp;
   
   // если вторая кнопка была нажата, добавляем к строке "2"
   if (button2WasUp && !button2IsUp) {
     delay(10);
     button2IsUp = digitalRead(B2);
     if (!button2IsUp) { otvet = otvet + "2"; Serial.println("2"); w = 5;}
   }
   button2WasUp = button2IsUp;
    
   // если третья кнопка была нажата, добавляем к строке "3"
   if (button3WasUp && !button3IsUp) {
     delay(10);
     button3IsUp = digitalRead(B3);
     if (!button3IsUp) { otvet = otvet + "3"; Serial.println("3"); w = 5;}
   }
   button3WasUp = button3IsUp;
  }

/// СРАВНИВАЕМ НАШ ОТВЕТ С КОДОМ ///
  if (KOD == otvet ) {
    Serial.println(""); Serial.println("DA!"); Serial.println("");
    digitalWrite(GRN, HIGH); delay(1000); digitalWrite(GRN, LOW);
    otvet = "";  // стираем строку
    w = 1;       // генерируем новый код
  }
  else  {
    Serial.println(""); Serial.println("HET!"); Serial.println("");
    Serial.print("OTVET - ");
    digitalWrite(RED, HIGH); delay(1000); digitalWrite(RED, LOW);
    otvet = "";  // стираем строку
    w = 2;       // новая попытка ввода кода
  }
}

Заключение. Этот простой проект можно использовать в различных «умных» устройствах, например, в создании сигнализации, где зуммер сработает только в том случае, если код введен правильно. Можно также сделать кодовый замок, но в этом случае шифр не должен генерироваться каждый раз заново. Следует оставить в массиве только один вариант шифра и состоящим из пяти знаков, например, char* kod[1] = { «12321» };

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

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

newzaym
➜