#include <ESP32Servo.h>
#include <Keypad.h>
#define ROW_NUM 4 // jumlah baris keypad
#define COLUMN_NUM 4 // jumlah kolom keypad
#define SERVO_PIN 26 // pin GPIO26 ESP32 yang terhubung ke motor servo
#define PIN_RED 14 // pin GPIO14 untuk LED merah
#define PIN_GREEN 15 // pin GPIO15 untuk LED hijau
#define PIN_BLUE 13 // pin GPIO13 untuk LED biru
Servo servoMotor;
char keys[ROW_NUM][COLUMN_NUM] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pin_rows[ROW_NUM] = {19, 18, 5, 17}; // pin GPIO keypad baris
byte pin_columns[COLUMN_NUM] = {16, 4, 0, 2}; // pin GPIO keypad kolom
Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_columns, ROW_NUM, COLUMN_NUM );
const String password = "7890";
String input_password;
void setup() {
servoMotor.attach(SERVO_PIN); // menghubungkan servo ke pin ESP32
Serial.begin(9600);
pinMode(PIN_RED, OUTPUT);
pinMode(PIN_GREEN, OUTPUT);
pinMode(PIN_BLUE, OUTPUT);
}
void loop() {
char key = keypad.getKey();
if (key) {
Serial.println(key);
if (key == '*') {
input_password = ""; // menghapus password yang diinputkan
} else if (key == '#') {
if (password == input_password) {
buka_pintu();
Serial.println("PASSWORD BENAR, ACCESS GRANTED!");
} else {
tampilkan_error();
Serial.println("PASSWORD SALAH, ACCESS DENIED!");
}
input_password = ""; // menghapus password yang diinputkan
} else if (key == 'A') {
Serial.println("PINTU TERTUTUP");
tutup_pintu();
} else {
input_password += key;
}
}
}
// Fungsi untuk membuka pintu dan menampilkan lampu hijau
void buka_pintu() {
analogWrite(PIN_RED, 0); // matikan LED merah
analogWrite(PIN_GREEN, 168); // nyalakan LED hijau
analogWrite(PIN_BLUE, 0); // matikan LED biru
for (int pos = 0; pos <= 90; pos += 1) {
servoMotor.write(pos);
delay(15); // tunggu 15ms untuk mencapai posisi
}
matikan_LED(); // matikan LED setelah membuka pintu
}
// Fungsi untuk menampilkan LED merah saat kesalahan password
void tampilkan_error() {
analogWrite(PIN_RED, 247); // nyalakan LED merah
analogWrite(PIN_GREEN, 0); // matikan LED hijau
analogWrite(PIN_BLUE, 0); // matikan LED biru
delay(60); // tunggu sebentar sebelum mematikan LED
matikan_LED(); // matikan LED setelah menampilkan error
}
// Fungsi untuk menutup pintu dan menampilkan lampu merah
void tutup_pintu() {
analogWrite(PIN_RED, 247); // nyalakan LED merah
analogWrite(PIN_GREEN, 0); // matikan LED hijau
analogWrite(PIN_BLUE, 0); // matikan LED biru
for (int pos = 90; pos >= 0; pos -= 1) {
servoMotor.write(pos);
delay(15);
}
matikan_LED(); // matikan LED setelah menutup pintu
}
// Fungsi untuk mematikan semua LED
void matikan_LED() {
analogWrite(PIN_RED, 0); // matikan LED merah
analogWrite(PIN_GREEN, 0); // matikan LED hijau
analogWrite(PIN_BLUE, 0); // matikan LED biru
}