#include <ESP32Servo.h>
const int keypadRows = 4;
const int keypadCols = 4;
char keys[keypadRows][keypadCols] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
int rowPins[keypadRows] = {2, 3, 4, 5};
int colPins[keypadCols] = {6, 7, 8, 9};
Servo myServo;
String currentPassword = "2233";
String enteredPassword = "";
int maxAttempts = 1; // Jumlah maksimum percobaan sebelum reset enteredPassword
bool doorLocked = true;
int attemptsRemaining = maxAttempts; // Jumlah percobaan yang tersisa
void setup() {
Serial.begin(9600);
for (int row = 0; row < keypadRows; ++row) {
pinMode(rowPins[row], INPUT_PULLUP);
}
for (int col = 0; col < keypadCols; ++col) {
pinMode(colPins[col], OUTPUT);
digitalWrite(colPins[col], HIGH);
}
myServo.attach(15);
lockDoor();
}
void loop() {
char key = getKey();
if (key != 0) {
Serial.println("Key Pressed: " + String(key));
if (key == '#') {
if (checkPassword() && doorLocked) {
unlockDoor();
} else {
Serial.println("Invalid Operation!");
// Mengurangi jumlah percobaan yang tersisa
attemptsRemaining--;
if (attemptsRemaining == 0) {
resetPassword();
}
}
} else if (key == 'C') {
if (!doorLocked) {
lockDoor();
} else {
Serial.println("Invalid Operation!");
}
} else {
// Mengupdate password saat tombol lainnya ditekan
updateEnteredPassword(key);
}
}
}
char getKey() {
for (int col = 0; col < keypadCols; ++col) {
digitalWrite(colPins[col], LOW);
for (int row = 0; row < keypadRows; ++row) {
if (digitalRead(rowPins[row]) == LOW) {
delay(50);
while (digitalRead(rowPins[row]) == LOW);
digitalWrite(colPins[col], HIGH);
return keys[row][col];
}
}
digitalWrite(colPins[col], HIGH);
}
return 0;
}
void unlockDoor() {
Serial.println("Door Unlocked!");
myServo.write(90);
delay(2000);
myServo.write(0);
doorLocked = false;
// Reset jumlah percobaan setelah membuka pintu
attemptsRemaining = maxAttempts;
}
void lockDoor() {
Serial.println("Door Locked!");
myServo.write(0);
delay(2000);
doorLocked = true;
// Reset enteredPassword dan jumlah percobaan setelah menutup pintu
enteredPassword = "";
attemptsRemaining = maxAttempts;
}
bool checkPassword() {
return enteredPassword == currentPassword;
}
void updateEnteredPassword(char key) {
// Menambahkan karakter ke enteredPassword
enteredPassword += key;
Serial.println("Entered Password: " + enteredPassword);
}
void resetPassword() {
Serial.println("Resetting Password!");
enteredPassword = "";
attemptsRemaining = maxAttempts;
}