#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#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;
// Инициализация LCD дисплея с адресом 0x27 и размером 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Предварительное объявление функции displayInput
void displayInput();
void setup() {
Serial.begin(9600);
pinMode(RED, OUTPUT);
pinMode(GRN, OUTPUT);
pinMode(B1, INPUT_PULLUP);
pinMode(B2, INPUT_PULLUP);
pinMode(B3, INPUT_PULLUP);
// Инициализация дисплея
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Введите код:");
}
void loop() {
/// ФУНКЦИЯ ГЕНЕРАЦИИ КОДА ///
while (w == 1) {
delay(500);
digitalWrite(RED, HIGH);
digitalWrite(GRN, HIGH);
delay(100);
digitalWrite(RED, LOW);
digitalWrite(GRN, LOW);
x = random(0, 3); // Изменено на 3 для правильного выбора из массива
KOD = String(kod[x]);
Serial.print("KOD - ");
Serial.println(KOD);
Serial.println("");
Serial.print("OTVET - ");
w = 2;
}
/// ВВОДИМ ПЕРВОЕ ЧИСЛО ///
while (w == 2) {
displayInput(); // Отображаем введенные цифры на LCD
// узнаем текущее состояние кнопок
boolean button1IsUp = digitalRead(B1);
boolean button2IsUp = digitalRead(B2);
boolean button3IsUp = digitalRead(B3);
// если первая кнопка была нажата, добавляем к строке "1"
if (button1WasUp && !button1IsUp) {
delay(10);
button1IsUp = digitalRead(B1);
if (!button1IsUp) {
otvet += "1";
Serial.print("1");
displayInput(); // Обновляем LCD
w = 3;
}
}
button1WasUp = button1IsUp;
// если вторая кнопка была нажата, добавляем к строке "2"
if (button2WasUp && !button2IsUp) {
delay(10);
button2IsUp = digitalRead(B2);
if (!button2IsUp) {
otvet += "2";
Serial.print("2");
displayInput(); // Обновляем LCD
w = 3;
}
}
button2WasUp = button2IsUp;
// если третья кнопка была нажата, добавляем к строке "3"
if (button3WasUp && !button3IsUp) {
delay(10);
button3IsUp = digitalRead(B3);
if (!button3IsUp) {
otvet += "3";
Serial.print("3");
displayInput(); // Обновляем LCD
w = 3;
}
}
button3WasUp = button3IsUp;
}
/// ВВОДИМ ВТОРОЕ ЧИСЛО ///
while (w == 3) {
displayInput(); // Отображаем введенные цифры на LCD
// узнаем текущее состояние кнопок
boolean button1IsUp = digitalRead(B1);
boolean button2IsUp = digitalRead(B2);
boolean button3IsUp = digitalRead(B3);
// если первая кнопка была нажата, добавляем к строке "1"
if (button1WasUp && !button1IsUp) {
delay(10);
button1IsUp = digitalRead(B1);
if (!button1IsUp) {
otvet += "1";
Serial.print("1");
displayInput(); // Обновляем LCD
w = 4;
}
}
button1WasUp = button1IsUp;
// если вторая кнопка была нажата, добавляем к строке "2"
if (button2WasUp && !button2IsUp) {
delay(10);
button2IsUp = digitalRead(B2);
if (!button2IsUp) {
otvet += "2";
Serial.print("2");
displayInput(); // Обновляем LCD
w = 4;
}
}
button2WasUp = button2IsUp;
// если третья кнопка была нажата, добавляем к строке "3"
if (button3WasUp && !button3IsUp) {
delay(10);
button3IsUp = digitalRead(B3);
if (!button3IsUp) {
otvet += "3";
Serial.print("3");
displayInput(); // Обновляем LCD
w = 4;
}
}
button3WasUp = button3IsUp;
}
/// ВВОДИМ ТРЕТЬЕ ЧИСЛО ///
while (w == 4) {
displayInput(); // Отображаем введенные цифры на LCD
// узнаем текущее состояние кнопок
boolean button1IsUp = digitalRead(B1);
boolean button2IsUp = digitalRead(B2);
boolean button3IsUp = digitalRead(B3);
// если первая кнопка была нажата, добавляем к строке "1"
if (button1WasUp && !button1IsUp) {
delay(10);
button1IsUp = digitalRead(B1);
if (!button1IsUp) {
otvet += "1";
Serial.println("1");
displayInput(); // Обновляем LCD
w = 5;
}
}
button1WasUp = button1IsUp;
// если вторая кнопка была нажата, добавляем к строке "2"
if (button2WasUp && !button2IsUp) {
delay(10);
button2IsUp = digitalRead(B2);
if (!button2IsUp) {
otvet += "2";
Serial.println("2");
displayInput(); // Обновляем LCD
w = 5;
}
}
button2WasUp = button2IsUp;
// если третья кнопка была нажата, добавляем к строке "3"
if (button3WasUp && !button3IsUp) {
delay(10);
button3IsUp = digitalRead(B3);
if (!button3IsUp) {
otvet += "3";
Serial.println("3");
displayInput(); // Обновляем LCD
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; // генерируем новый код
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Vvedite kod:");
} else {
Serial.println(""); Serial.println("no!"); Serial.println("");
Serial.print("OTVET - ");
digitalWrite(RED, HIGH); delay(1000); digitalWrite(RED, LOW);
otvet = ""; // стираем строку
w = 2; // новая попытка ввода кода
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ne norm");
}
}
// Функция для отображения введенных цифр на дисплее
void displayInput() {
lcd.setCursor(0, 1); // Установка курсора на вторую строку
lcd.print("kod: ");
lcd.print(otvet); // Печать введенного кода на дисплее
}