#include <Keypad.h>
#include <Servo.h>
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] = {2,3,4,5};
byte colPins[COLS] = {6,7,8,9};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
Servo myServo;
const int servoPin = 10;
const int relayPin = 11; // IN pada modul relay
const int buzzerPin = 12;
const int ledGreen = 13;
const int ledRed = A0;
String inputCode = "";
const String PASSWORD = "1234"; // ubah sesuai kebutuhan
unsigned long unlockDuration = 5000; // ms lama pintu terbuka
// ===== fungsi servo pelan =====
void servoSmoothMove(int startPos, int endPos, int stepDelay){
if (endPos > startPos){
for (int pos = startPos; pos <= endPos; pos++){
myServo.write(pos);
delay(stepDelay); // semakin besar semakin lambat
}
} else {
for (int pos = startPos; pos >= endPos; pos--){
myServo.write(pos);
delay(stepDelay);
}
}
}
void setup(){
pinMode(relayPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(ledRed, OUTPUT);
// pastikan relay OFF saat start -> solenoid mati -> terkunci
digitalWrite(relayPin, HIGH);
myServo.attach(servoPin);
myServo.write(0); // posisi awal servo
Serial.begin(9600);
}
void loop(){
char key = keypad.getKey();
if(key){
if(key == '#'){ // enter
checkCode();
} else if(key == '*'){// clear
inputCode = "";
buzzShort();
} else {
inputCode += key;
buzzShort();
}
Serial.println(inputCode);
}
}
void checkCode(){
if(inputCode == PASSWORD){
accessGranted();
} else {
accessDenied();
}
inputCode = "";
}
void accessGranted(){
digitalWrite(ledGreen, HIGH);
digitalWrite(ledRed, LOW);
buzzShort();
// relay ON -> solenoid dialiri listrik -> pintu terbuka
digitalWrite(relayPin, LOW);
// gerakkan servo pelan dari 0 ke 180
servoSmoothMove(0, 180, 10); // 10 ms per step → pelan
delay(unlockDuration);
// kembali kunci: pelan juga
servoSmoothMove(180, 0, 10);
digitalWrite(relayPin, HIGH);
digitalWrite(ledGreen, LOW);
}
void accessDenied(){
digitalWrite(ledRed, HIGH);
digitalWrite(ledGreen, LOW);
for(int i=0;i<3;i++){
digitalWrite(buzzerPin, HIGH);
delay(300);
digitalWrite(buzzerPin, LOW);
delay(150);
}
digitalWrite(ledRed, LOW);
}
void buzzShort(){
digitalWrite(buzzerPin, HIGH);
delay(50);
digitalWrite(buzzerPin, LOW);
}