#include <Keypad.h>
#include <TM1637Display.h>
#include <Servo.h>
#define CLK 2
#define DIO 3
#define RELAY 4
#define SERVO_PIN 5
#define BUZZER 6
#define RESET_BTN 7
#define OPEN_BTN 8
TM1637Display display(CLK, DIO);
Servo servoMotor;
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,10,11,12};
byte colPins[COLS] = {A0,A1,A2,A3};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
String validCodes[] = {"1234", "5678", "2468"};
int totalUsers = 3;
int melody1[] = {262,330,392,523,0};
int melody2[] = {330,349,440,494,0};
int melody3[] = {392,440,494,587,0};
String inputCode = "";
bool codeEntered = false;
bool blocked = false;
unsigned long lastStarPress = 0;
void setup() {
pinMode(RELAY, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(RESET_BTN, INPUT_PULLUP);
pinMode(OPEN_BTN, INPUT_PULLUP);
digitalWrite(RELAY, LOW);
display.setBrightness(7);
display.clear();
servoMotor.attach(SERVO_PIN);
servoMotor.write(0);
}
void loop() {
if (digitalRead(OPEN_BTN) == LOW) {
openDoor();
delay(500);
}
if (digitalRead(RESET_BTN) == LOW) {
resetSystem();
delay(500);
}
char key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9' && inputCode.length() < 4 && !blocked) {
inputCode += key;
display.showNumberDec(inputCode.toInt(), true);
}
if (key == '#' && !blocked) {
codeEntered = true;
checkCode();
}
if (key == '*' && !codeEntered && !blocked) {
if (millis() - lastStarPress < 500) {
resetSystem();
}
lastStarPress = millis();
}
}
}
void checkCode() {
for (int i=0; i<totalUsers; i++) {
if (inputCode == validCodes[i]) {
if(i==0) playMelody(melody1);
if(i==1) playMelody(melody2);
if(i==2) playMelody(melody3);
openDoor();
resetSystem();
return;
}
}
alarmSound();
blocked = true;
}
void openDoor() {
digitalWrite(RELAY, HIGH);
servoMotor.write(180);
delay(800);
servoMotor.write(0);
delay(800);
digitalWrite(RELAY, LOW);
}
void playMelody(int melody[]) {
for(int i=0; melody[i] != 0; i++){
tone(BUZZER, melody[i], 200);
delay(250);
}
noTone(BUZZER);
}
void alarmSound() {
for(int i=0;i<3;i++){
tone(BUZZER, 1000);
delay(300);
noTone(BUZZER);
delay(200);
}
}
void resetSystem() {
inputCode = "";
codeEntered = false;
blocked = false;
display.clear();
}