Игра на Ардуино Угадай код

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

Игра на Ардуино с кнопками «Угадай код»

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

  • Arduino Uno / Arduino Nano / Arduino Mega;
  • 3 тактовые кнопки;
  • два светодиода и резисторы;
  • макетная плата;
  • провода «папа-папа».

Сборка проекта с кнопками «Угадай код»

Сборка проекта на Ардуино с кнопками
Сборка проекта на Ардуино с кнопками — Угадай код

На картинке выше показана сборка схемы проекта с кнопками «Угадай код». Обратите внимание, что кнопки подключаются к Ардуино без резистора, так как пины платы сконфигурированы с помощью INPUT_PULLUP, при котором к портам будут подтянуты резисторы 20кОм в самом микроконтроллере. При нажатии соответствующей кнопки к строке String otvet = «»; будут прибавляться числа «1», «2» или «3».

Скетч. Проект игры «Угадай код» на Ардуино


byte x;
byte w = 1;
String otvet = "";
String KOD = "";
// массив с вариантами кода
char* kod[6] = {"123", "132", "231", "213", "321", "312"};
// переменные для считывания нажатия на кнопки
boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button3WasUp = true;

void setup() {
  Serial.begin(9600);
  // пины для подключения кнопок
  pinMode(5, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  // пины для подключения светодиодов
  pinMode(13, OUTPUT);
  pinMode(10, OUTPUT);
}

void loop() {

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

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

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

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

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

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

  1. в программе используется шесть вариантов кода, которые выбираются рандомно. Для того, чтобы угадать код — каждую кнопку следует нажимать только один раз, но в программе ограничений по нажатию нет;
  2. после того, как было введено три числа (кнопки были нажаты три раза и проверены с помощью команды digitalRead Arduino), происходит сравнение сгенерированного кода с введенным ответом.



Вывод информации на монитор порта
Вывод информации на монитор порта Arduino IDE

Заключение. Данную программу можно использовать в различных проектах, например сделать будильник на Ардуино, где звуковой сигнал будет отключаться только при правильном вводе шифра. Или сделать кодовый замок, но в этом случае шифр не должен каждый раз генерироваться (иначе его сможет открыть любой человек), а шифр при этом можно сделать сложнее, состоящим из более, чем трех чисел.



6 Replies to “Игра с кнопками на Ардуино «Угадай код»”

  1. помогите что делать если все время мигает зеленый не зависимо от нажатий ПОМОГИТЕ плс

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

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

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