#include <IRremote.hpp>
#include <LiquidCrystal.h>
#include <Servo.h>
#define IR_RECEIVE_PIN 2
#define SERVO_PIN 10
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);
Servo myServo;
const int passwordLength = 4;
int enteredPassword[passwordLength];
int correctPassword[passwordLength] = {1, 2, 3, 4};
int currentPosition = 0;
enum {NORMAL_MODE, VERIFY_OLD_PASS, ENTER_NEW_PASS} currentMode = NORMAL_MODE;
void initializeReceiver() {
IrReceiver.begin(IR_RECEIVE_PIN);
}
void initializeLCD() {
lcd.begin(16, 2);
lcd.print("Enter password:");
}
void setup() {
initializeReceiver();
initializeLCD();
myServo.attach(SERVO_PIN);
myServo.write(0);
}
void loop() {
if (IrReceiver.decode()) {
translateIR();
IrReceiver.resume();
}
}
void resetSystem() {
currentPosition = 0;
lcd.clear();
switch(currentMode) {
case NORMAL_MODE:
lcd.print("Enter password:");
break;
case VERIFY_OLD_PASS:
lcd.print("Verify old pass:");
break;
case ENTER_NEW_PASS:
lcd.print("Enter new pass:");
break;
}
}
void openSafe() {
myServo.write(90);
lcd.clear();
lcd.print("Safe opened!");
delay(1500);
myServo.write(0);
currentMode = NORMAL_MODE;
resetSystem();
}
void changePassword() {
for(int i = 0; i < passwordLength; i++) {
correctPassword[i] = enteredPassword[i];
}
lcd.clear();
lcd.print("Password changed!");
delay(1500);
currentMode = NORMAL_MODE;
resetSystem();
}
void verifyOldPassword() {
bool correct = true;
for (int i = 0; i < passwordLength; i++) {
if (enteredPassword[i] != correctPassword[i]) {
correct = false;
break;
}
}
if (correct) {
currentMode = ENTER_NEW_PASS;
lcd.clear();
lcd.print("Enter new pass:");
} else {
lcd.clear();
lcd.print("Wrong password!");
delay(1000);
currentMode = NORMAL_MODE;
}
currentPosition = 0;
resetSystem();
}
void translateIR() {
int command = IrReceiver.decodedIRData.command;
switch (command) {
case 48: // 1
case 24: // 2
case 122: // 3
case 16: // 4
case 56: // 5
case 90: // 6
case 66: // 7
case 74: // 8
case 82: // 9
case 104: // 0
if(currentPosition < passwordLength) {
int digit;
switch(command) {
case 48: digit = 1; break;
case 24: digit = 2; break;
case 122: digit = 3; break;
case 16: digit = 4; break;
case 56: digit = 5; break;
case 90: digit = 6; break;
case 66: digit = 7; break;
case 74: digit = 8; break;
case 82: digit = 9; break;
case 104: digit = 0; break;
}
enteredPassword[currentPosition] = digit;
currentPosition++;
// Отображаем звездочки
int cursorPos = (currentMode == NORMAL_MODE) ? 10 : 2;
lcd.setCursor(currentPosition - 1 + cursorPos, 1);
lcd.print("*");
}
break;
case 194: // BACK - сброс ввода
currentMode = NORMAL_MODE;
resetSystem();
break;
case 168: // PLAY - подтверждение
if (currentPosition == passwordLength) {
switch(currentMode) {
case NORMAL_MODE:
{
bool correct = true;
for (int i = 0; i < passwordLength; i++) {
if (enteredPassword[i] != correctPassword[i]) {
correct = false;
break;
}
}
if (correct) {
openSafe();
} else {
lcd.clear();
lcd.print("Wrong password!");
delay(1000);
resetSystem();
}
}
break;
case VERIFY_OLD_PASS:
verifyOldPassword();
break;
case ENTER_NEW_PASS:
changePassword();
break;
}
}
break;
case 226: // MENU - вход в режим смены пароля
if(currentMode == NORMAL_MODE) {
currentMode = VERIFY_OLD_PASS;
lcd.clear();
lcd.print("Verify old pass:");
currentPosition = 0;
}
break;
default:
lcd.clear();
lcd.print("Unknown button");
delay(500);
resetSystem();
}
}