//Скетч кодового замка
#include <Keypad.h> // Библиотека для работы с матричной клавиатурой
#include <Password.h> // Библиотека для работы с паролями (автор: Alexander Brevig)
String newPassword; // Переменная для хранения нового пароля
char passchars[6]; // Массив для временного хранения пароля
#include <Wire.h> // Библиотека для I2C-коммуникации
#include <LiquidCrystal_I2C.h> // Библиотека для управления LCD 1602 по I2C
LiquidCrystal_I2C lcd(0x27,16,2); // Инициализация дисплея
Password password = Password("000000"); // Создание объекта пароля с дефолтным значением "000000"
byte maxPasswordLength = 6; // Максимальная длина пароля
byte currentPasswordLength = 0; // Счетчик введенных символов
const byte ROWS = 4; // Количество строк в матричной клавиатуре
const byte COLS = 4; // Количество столбцов в матричной клавиатуре
char keys[ROWS][COLS] = { // Матрица символов, соответствующих кнопкам клавиатуры
{'1', '2', '3', 'A'}, // Первая строка кнопок
{'4', '5', '6', 'B'}, // Вторая строка кнопок
{'7', '8', '9', 'C'}, // Третья строка кнопок
{'*', '0', '#', 'D'} // Четвертая строка кнопок
};
byte rowPins[ROWS] = {9, 8, 7, 6}; // Пины Arduino, к которым подключены строки клавиатуры
byte colPins[COLS] = {5, 4, 3, 2}; // Пины Arduino, к которым подключены столбцы клавиатуры
int red = 11; // Пин для красного светодиода
int green = 12; // Пин для зеленого светодиода
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // Инициализация клавиатуры с указанными настройками
void setup() {
pinMode(red, OUTPUT); // Настройка пина красного светодиода как выхода
pinMode(green, OUTPUT); // Настройка пина зеленого светодиода как выхода
lcd.init(); // Инициализация LCD-дисплея
lcd.backlight(); // Включение подсветки дисплея
}
void loop() {
char key = keypad.getKey(); // Получение нажатой клавиши
if (key != NO_KEY) { // Если клавиша нажата
delay(60); // Задержка для антидребезга
switch (key) { // Обработка специальных клавиш
case 'A': break; // Клавиша 'A' – не назначена
case 'B': break; // Клавиша 'B' – не назначена
case 'C': break; // Клавиша 'C' – не назначена
case 'D': changePassword(); break; // Клавиша 'D' – смена пароля
case '#': checkPassword(); break; // Клавиша '#' – проверка пароля
case '*': break; // Клавиша '*' – не назначена
default: processNumberKey(key); // Цифры (0-9) – обработка ввода
}
}
}
// Функция обработки цифровых клавиш (0-9)
void processNumberKey(char key) {
lcd.print(key); // Вывод символа на экран
currentPasswordLength++; // Увеличение счетчика введенных символов
password.append(key); // Добавление символа к текущему паролю
if (currentPasswordLength == maxPasswordLength) { // Если введено 6 символов
checkPassword(); // Автоматическая проверка пароля
}
}
// Функция проверки пароля
void checkPassword() {
if (password.evaluate()) { // Если пароль верный
lcd.setCursor(0, 1); // Установка курсора на вторую строку LCD
lcd.print("OK."); // Вывод "OK" на экран
delay(1000); // Задержка 1 сек
lcd.clear(); // Очистка экрана
digitalWrite(red, LOW); // Красный светодиод выключен
digitalWrite(green, HIGH); // Зеленый светодиод включен
} else { // Если пароль неверный
digitalWrite(red, HIGH); // Красный светодиод включен
digitalWrite(green, LOW); // Зеленый светодиод выключен
lcd.clear(); // Очистка экрана
delay(150); // Короткая задержка
lcd.print("wrong password!"); // Вывод ошибки на экран
delay(1000); // Задержка 1 сек
lcd.clear(); // Очистка экрана
}
resetPassword(); // Сброс пароля после проверки
}
// Функция сброса введенного пароля
void resetPassword() {
password.reset(); // Очистка буфера пароля
currentPasswordLength = 0; // Сброс счетчика символов
}
// Функция изменения пароля
void changePassword() {
lcd.print("Change Password"); // Сообщение на экран
resetPassword(); // Сброс текущего ввода
char tempPass[7] = {0}; // Временный массив для нового пароля
lcd.setCursor(0, 1); // Устанавливаем курсор LCD на начало второй строки
// Начинаем цикл для ввода 6 цифр пароля (maxPasswordLength = 6)
for(int i = 0; i < maxPasswordLength;) {
char key = keypad.getKey(); // Считываем нажатую клавишу с матричной клавиатуры
if (key && isDigit(key)) { // Проверяем: если клавиша нажата
tempPass[i] = key; // Записываем введенную цифру во временный массив tempPass
lcd.print(key); // Выводим введенную цифру на LCD экран
i++; // Увеличиваем счетчик введенных цифр
}
}
tempPass[maxPasswordLength] = '\0'; // Переход на другую строку
password.set(tempPass); // Установка нового пароля
newPassword = String(tempPass); // Сохранение пароля в переменную
lcd.clear(); // Очистка экрана
lcd.print("Password changed"); // Сообщение об изменении пароля
delay(1000); // Задержка 1 сек
lcd.clear(); // Очистка экрана
resetPassword(); // Сброс ввода
}