#include <LiquidCrystal.h>
#include <Keyboard.h>
#include <KeyboardLayout.h>
#include <Keyboard_da_DK.h>
#include <Keyboard_de_DE.h>
#include <Keyboard_es_ES.h>
#include <Keyboard_fr_FR.h>
#include <Keyboard_it_IT.h>
#include <Keyboard_sv_SE.h>
#include <Keypad.h> // 4x4 klaviatura uchun kutubxona
#include <LiquidCrystal_I2C.h> // i2c 1602 lcd uchun kutubxona
#include <Servo.h> // servo motorini boshqarish uchun kutubxona
// I2C LCD obyekti
LiquidCrystal_I2C lcd(0x27,20,4);
// Servo motor obyekti
Servo servo;
// Parol uzunligi
#define Password_Length 8
// Servo pozitsiyasi
int Position = 0;
// Kiritilgan parol
char EnteredPassword[Password_Length];
// So'ngi parol
char MasterPassword[Password_Length] = "1A2B3C4";
// Kiritilgan belgilar soni
byte Entered_Count = 0, Master_Count = 0;
// Klaviaturaning qator va ustunlarini aniqlash
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'}
};
// Servo hali
bool IsDoorOpen = true;
// Klaviaturani UART pinlarini aniqlash
byte rowPins[ROWS] = {8, 7, 6, 5};
byte colPins[COLS] = {4, 3, 2, 1};
Keypad myKeypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Qolgha qismi uchun lukni ko'rsatish
byte Locked[8] = {
B01110,
B10001,
B10001,
B11111,
B11011,
B11011,
B11011,
B11111
};
// Ochilgan holat uchun lukni ko'rsatish
byte Opened[8] = {
B01110,
B00001,
B00001,
B11111,
B11011,
B11011,
B11011,
B11111
};
// Setup funksiyasi
void setup() {
servo.attach(0); // Servo pinini tanlash
CloseDoor(); // Servoni yopish
lcd.init(); // LCDni boshlash
lcd.backlight(); // Orqa yorliqni yoqish
lcd.setCursor(0,0); // Kursorning pozitsiyasini o'rnating
lcd.print("Xush kelibsiz!"); // Matnni chiqaring
lcd.setCursor(6,1); // Kursorning pozitsiyasini o'rnating
lcd.print("Darvoza!"); // Matnni chiqaring
delay(4000); // 4 sekund kutamiz
lcd.clear(); // LCDni tozalash
}
// asosiy loop funktsiyasi
void loop() {
// Agar darvoza yopiq bo'lsa
if (!IsDoorOpen) {
char key = myKeypad.getKey(); // Klaviatura tugmachalarini o'qish
if (key == '#') {
lcd.clear(); // LCDni tozalash
CloseDoor(); // Servoni yopish
lcd.setCursor(2,0); // Kursorning pozitsiyasini o'rnating
lcd.print("Darvoza yopildi"); // Matnni chiqaring
lcd.createChar(0, Locked); // Yopilgan holat uchun belgini chiqaring
lcd.setCursor(14,0); // Kursorning pozitsiyasini o'rnating
lcd.write(0); // Birinchi belgini chiqaring
delay(3000); // 3 sekund kutamiz
IsDoorOpen = true; // Darvozani yopish
}
} else {
OpenDoor(); // Darvozani ochish
}
}
// Ma'lumotlarni tozalash
void ClearData() {
while (Entered_Count != 0) {
EnteredPassword[Entered_Count--] = 0;
}
return;
}
// Servoni ochish
void OpenDoor() {
lcd.setCursor(1,0); // Kursorning pozitsiyasini o'rnating
lcd.print("Parolni kiriting"); // Matnni chiqaring
char key = myKeypad.getKey(); // Klaviatura tugmachalarini o'qish
if (key) {
EnteredPassword[Entered_Count] = key;
lcd.setCursor(Entered_Count, 1); // Kursorning pozitsiyasini o'rnating
lcd.print("*"); // Belgilarni chiqaring
Entered_Count++; // Belgilarni sanash
}
if (Entered_Count == Password_Length - 1) {
if (!strcmp(EnteredPassword, MasterPassword)) {
lcd.clear();
OpenServo(); // Servoni ochish
lcd.setCursor(2,0); // Kursorning pozitsiyasini o'rnating
lcd.print("Darvoza ochildi"); // Matnni chiqaring
lcd.createChar(1, Opened); // Ochilgan holat uchun belgini chiqaring
lcd.setCursor(14,0); // Kursorning pozitsiyasini o'rnating
lcd.write(1); // Birinchi belgini chiqaring
lcd.setCursor(0,1); // Kursorning pozitsiyasini o'rnating
lcd.print("# tugmasini bos"); // Matnni chiqaring
IsDoorOpen = false;
} else {
lcd.clear();
lcd.setCursor(0,0); // Kursorning pozitsiyasini o'rnating
lcd.print("Noto'g'ri parol"); // Matnni chiqaring
ClearData(); // Ma'lumotlarni tozalash
delay(2000); // 2 sekund kutamiz
lcd.clear(); // LCDni tozalash
}
ClearData(); // Ma'lumotlarni tozalash
}
}
// Servoni yopish
void CloseDoor() {
for (Position = 180; Position >= 90; Position -= 5) {
servo.write(Position); // Servoni pozitsiyasini o'rnating
delay(15); // 15 millisekund kutamiz
}
}
// Servoni ochish
void OpenServo() {
for (Position = 90; Position <= 180; Position += 5) {
servo.write(Position); // Servoni pozitsiyasini o'rnating
delay(15); // 15 millisekund kutamiz
}
}