#include <LiquidCrystal_I2C.h> // Подключение библиотеки для работы с LCD-дисплеем через I2C интерфейс.
#include <Keypad.h> // Подключение библиотеки для работы с клавиатурой.
#include <Servo.h> // Подключение библиотеки для управления сервоприводом.
int servoPin = 11; // Пин, к которому подключен сервопривод.
Servo servo; // Создание объекта Servo для управления сервоприводом.
const uint8_t ROWS = 4; // Количество строк клавиатуры.
const uint8_t COLS = 4; // Количество столбцов клавиатуры.
// Массив символов, представляющий клавиши клавиатуры.
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'}, // Первая строка клавиш.
{'4', '5', '6', 'B'}, // Вторая строка клавиш.
{'7', '8', '9', 'C'}, // Третья строка клавиш.
{'*', '0', '#', 'D'} // Четвертая строка клавиш.
};
uint8_t colPins[COLS] = {5, 4, 3, 2}; // Пины подключения столбцов клавиатуры.
uint8_t rowPins[ROWS] = {9, 8, 7, 6}; // Пины подключения строк клавиатуры.
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); // Инициализация объекта клавиатуры.
LiquidCrystal_I2C lcd(0x27, 16, 2); // Инициализация объекта LCD дисплея по адресу 0x27, размером 16х2 символа.
String password = ""; // Переменная для хранения пароля.
int status = 0; // Счетчик введенных символов.
char pasw[] = {'1', '1', '1', '1'}; // Массив для хранения текущего пароля.
char enterP[] = {'0', '0', '0', '0'}; // Массив для временного хранения вводимых символов.
char rpass[] = {'*', '#', '*', '#'}; // Массив для сброса пароля.
String statusDoor = "Close"; // Строковая переменная для отображения состояния двери.
int opened = 0; // Флаг открытия двери.
int reset = 0; // Флаг сброса пароля.
int pasacc = 0; // Флаг изменения пароля.
float door = false; // Логическая переменная для отслеживания состояния двери.
void setup() {
servo.attach(11); // Привязка пина сервопривода.
Serial.begin(9600); // Инициализация последовательного порта.
lcd.init(); // Инициализация LCD дисплея.
lcd.backlight(); // Включение подсветки дисплея.
lcd.setCursor(0, 0); // Установка курсора в начало первой строки.
lcd.print("Door Close"); // Отображение сообщения о закрытом состоянии двери.
lcd.setCursor(0, 1); // Установка курсора в начало второй строки.
for (int i = 0; i <= 3; i++) { // Цикл для вывода начальных значений массива enterP.
lcd.setCursor(i, 1); // Установка позиции курсора.
lcd.print(enterP[i]); // Вывод значения элемента массива.
}
servo.write(-90); // Установка начального положения сервопривода.
}
void loop() {
char key = keypad.getKey(); // Получение нажатой клавиши.
if (key != NO_KEY) { // Если была нажата клавиша.
if (key == '1' || key == '2' || key == '3' ||
key == '4' || key == '5' || key == '6' ||
key == '7' || key == '8' || key == '9' || key == '0' || key == '*' || key == '#') {
enterP[status] = key; // Запись введенного символа в массив enterP.
} else if (status < 0) {
status--; // Уменьшение счетчика статуса при ошибке ввода.
}
if (pasacc == 1 && key == 'A') { // Если флаг изменения пароля установлен и нажата клавиша 'A'.
status = 0; // Обнуление счетчика статуса.
pasacc = 0; // Сброс флага изменения пароля.
for (int j = 0; j <= 3; j++) { // Перенос временных данных в пароль.
pasw[j] = enterP[j]; // Копирование символов из массива enterP в массив pasw.
enterP[j] = 0; // Очистка временного массива.
}
lcd.clear(); // Очистка экрана.
lcd.setCursor(0, 0); // Установка курсора в начало первой строки.
lcd.print("password changed"); // Сообщение об изменении пароля.
delay(500); // Задержка перед следующим действием.
lcd.clear(); // Очистка экрана.
lcd.setCursor(0, 0); // Установка курсора в начало первой строки.
lcd.print("Door open pres C"); // Инструкция по открытию двери.
}
status++; // Увеличение счетчика статуса после каждого ввода.
if (door == true && key == 'C') { // Если дверь открыта и нажата клавиша 'C'.
for (int j = 0; j <= 3; j++) { // Очистка временного массива.
enterP[j] = 0;
}
lcd.clear(); // Очистка экрана.
lcd.setCursor(0, 0); // Установка курсора в начало первой строки.
lcd.print("Door close"); // Сообщение о закрытии двери.
servo.write(-90); // Закрытие двери.
door = false; // Дверь закрыта.
opened = 0; // Сброс флага открытия двери.
status = 0; // Обнуление счетчика статуса.
pasacc = 0; // Сброс флага изменения пароля.
}
for (int i = 0; i <= 3; i++) { // Вывод введённых символов на экран.
for (int i = 0; i <= 3; i++) {
lcd.setCursor(i, 1); // Установка курсора.
lcd.print(enterP[i]); // Вывод символа.
}
}
}
if (status == 4) { // Если введено четыре символа.
for (int c = 0; c <= 3; c++) { // Проверка на совпадение с комбинацией для сброса пароля.
if (enterP[c] == rpass[c]) {
reset++; // Увеличение счётчика совпадений.
}
}
if (reset == 4) { // Если все символы совпали.
lcd.setCursor(0, 0); // Установка курсора в начало первой строки.
lcd.print("Enter new password"); // Инструкция ввести новый пароль.
lcd.setCursor(6, 1); // Установка курсора в позицию 6 на второй строке.
lcd.print("and press A"); // Инструкция нажать 'A' после ввода нового пароля.
pasacc = 1; // Установить флаг изменения пароля.
reset = 0; // Сброс счётчика совпадений.
for (int j = 0; j <= 3; j++) { // Очистка временного массива.
enterP[j] = 0;
}
}
for (int s = 0; s <= 3; s++) { // Проверка введённого пароля.
if (enterP[s] == pasw[s]) { // Если текущий символ совпадает с символом пароля.
if (opened <= 4) { // Если количество правильных символов меньше четырёх.
opened++; // Увеличение счётчика открытых символов.
}
} else {
opened = 0; // Сброс счётчика, если хотя бы один символ не совпадает.
}
}
status = 0; // Обнуление счётчика статуса.
}
if (opened == 4) { // Если введены правильные четыре символа.
door = true; // Открыть дверь.
lcd.setCursor(0, 0); // Установка курсора в начало первой строки.
lcd.print("Door open press C"); // Инструкция закрыть дверь.
servo.write(90); // Открытие двери.
}
}