#include <Keypad.h>
#include <TM1637TinyDisplay.h>
#include <Servo.h>
#define CLK 2
#define DIO 3
TM1637TinyDisplay display(CLK, DIO);
#define BUZZER 12
#define RELAY A2
#define SERVO_PIN A3
#define RESET_BTN A0
#define OPEN_BTN A1
Servo lockServo;
// --- Tastatura ---
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] = {4,5,6,7};
byte colPins[COLS] = {8,9,10,11};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// --- Baza korisnika ---
struct User {
String code;
int melody;
};
User users[] = {
{"1234",1},
{"5678",2},
{"1111",3}
};
String inputCode = "";
bool hashPressed = false;
int starCount = 0;
void setup() {
display.begin();
display.setBrightness(7);
display.showString("----");
pinMode(BUZZER, OUTPUT);
pinMode(RELAY, OUTPUT);
pinMode(RESET_BTN, INPUT_PULLUP);
pinMode(OPEN_BTN, INPUT_PULLUP);
lockServo.attach(SERVO_PIN);
digitalWrite(RELAY, LOW);
}
void loop() {
if(digitalRead(OPEN_BTN) == LOW){
openDoor(1);
}
if(digitalRead(RESET_BTN) == LOW){
resetSystem();
}
char key = keypad.getKey();
if(key){
if(key == '#'){
hashPressed = true;
checkCode();
}
else if(key == '*'){
starCount++;
if(starCount >= 2 && !hashPressed){
resetSystem();
}
}
else if(isDigit(key)){
if(inputCode.length() < 4){
inputCode += key;
display.showString(inputCode.c_str());
}
}
}
}
void checkCode(){
bool found = false;
for(int i=0; i<sizeof(users)/sizeof(users[0]); i++){
if(users[i].code == inputCode){
openDoor(users[i].melody);
found = true;
break;
}
}
if(!found){
alarmSound();
}
inputCode = "";
hashPressed = false;
starCount = 0;
display.showString("----");
}
void openDoor(int melodyType){
digitalWrite(RELAY, HIGH);
for(int i=0;i<360;i+=10){
lockServo.write(i % 180);
delay(15);
}
digitalWrite(RELAY, LOW);
playMelody(melodyType);
}
void playMelody(int type){
if(type == 1){
tone(BUZZER, 1000,200);
delay(250);
tone(BUZZER, 1500,200);
}
else if(type == 2){
tone(BUZZER, 800,200);
delay(250);
tone(BUZZER, 1200,200);
}
else{
tone(BUZZER, 2000,150);
}
}
void alarmSound(){
for(int i=0;i<3;i++){
tone(BUZZER, 300,300);
delay(400);
}
}
void resetSystem(){
inputCode = "";
starCount = 0;
hashPressed = false;
display.showString("----");
}