#include <Servo.h> // библиотека для работы с сервоприводами
#include <Keypad.h> // библиотека для работы с клавиатурой
#include <LiquidCrystal_I2C.h> // библиотека для работы с LCD
Servo servo1;
Servo servo2;
// Пины клавиатуры
const int R1 = 8;
const int R2 = 9;
const int R3 = 10;
const int R4 = 11;
const int C1 = 4;
const int C2 = 5;
const int C3 = 6;
const int C4 = 7;
// Код для открытия двери
const char PASSWORD[4] = {'1', '2', '3', '4'};
char enteredCode[4] = {'0', '0', '0', '0'};
int codeIndex = 0;
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Клавиатура
char keys[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[4] = {R1, R2, R3, R4};
byte colPins[4] = {C1, C2, C3, C4};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, 4, 4);
void setup() {
servo1.attach(2, 500, 2400); // Подключение первого сервопривода к пину 2
servo2.attach(3, 500, 2400); // Подключение второго сервопривода к пину 3
lcd.begin(16, 2); // Инициализация LCD
lcd.print("Door closed"); // Вывод начального статуса двери на дисплей
}
void loop() {
char key = keypad.getKey(); // Получение нажатой клавиши
if (key) {
if (key == '#') { // Если нажата клавиша "#"
checkPassword(); // Проверка введенного кода
} else {
enteredCode[codeIndex] = key; // Добавление введенного символа в массив введенного кода
codeIndex++;
if (codeIndex >= 4) { // Если введено 4 символа кода, сбросить индекс и отобразить код на дисплее
codeIndex = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Entered code:");
lcd.setCursor(0, 1);
lcd.print(enteredCode[0]);
lcd.print(enteredCode[1]);
lcd.print(enteredCode[2]);
lcd.print(enteredCode[3]);
}
}
}
}
void checkPassword() {
for (int i = 0; i < 4; i++) {
if (enteredCode[i] != PASSWORD[i]) { // Проверка совпадения введенного кода с заданным кодом
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wrong code!");
delay(2000);
lcd.clear();
lcd.print("Door closed");
clearEnteredCode();
return;
}
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Door opened!");
openDoor(); // Открытие двери
delay(5000);
lcd.clear();
lcd.print("Door closed");
closeDoor(); // Закрытие двери
clearEnteredCode();
}
void openDoor() {
servo1.write(0); // Поворот первого сервопривода на 0 градусов
servo2.write(0); // Поворот второго сервопривода на 0 градусов
delay(1000);
}
void closeDoor() {
servo1.write(90); // Поворот первого сервопривода на 90 градусов
servo2.write(90); // Поворот второго сервопривода на 90 градусов
delay(1000);
}
void clearEnteredCode() {
for (int i = 0; i < 4; i++) {
enteredCode[i] = '0';
}
}