Простой проект на микроконтроллере Arduino, в котором предлагается отгадать шифр из трехзначного числа. К плате Ардуино дополнительно подключено два светодиода для индикации правильного и неправильного ввода шифра от замка. Вся информация (сгенерированный код из массива и ответ пользователя) будет отображаться на мониторе порта Arduino IDE. При желании можно подключить к схеме OLED или LCD дисплей.
СОДЕРЖАНИЕ
Необходимые компоненты:
- Arduino Uno / Arduino Nano / Arduino Mega
- тактовые кнопки
- светодиоды и резисторы
- макетная плата
- коннекторы
Дополнительные материалы на эту тему:
в программе используется шесть вариантов кода в массиве char* kod[3], которые выбираются рандомно (можно добавить больше вариантов или оставить только один). При нажатии соответствующей кнопки к строке String otv = «» будут добавлены цифры «1», «2» или «3». После того, как пользователем было введено три числа, происходит сравнение кода с введенным ответом, а результат выводится на монитор порта Ардуино IDE.
Простой проект на 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» };
