#include <Keypad.h>
#include <BlynkSimpleEsp32.h>
#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6uOo4uNKM"
#define BLYNK_TEMPLATE_NAME "sistem sekuritas rumah keypad"
#define BLYNK_AUTH_TOKEN "-gcWZU4BJudyFcCQMmH7J4lWUfHCEfLe"
// Pin konfigurasi
#define RELAY_PIN 13
#define BUZZER_PIN 12
#define LED_LOCKED_PIN 14 // LED Merah: Solenoid terkunci
#define LED_UNLOCKED_PIN 27 // LED Hijau: Solenoid terbuka
// Konfigurasi keypad
const int BARIS = 4;
const int KOLOM = 4;
char keys[BARIS][KOLOM] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[BARIS] = {22, 21, 19, 18};
byte colPins[KOLOM] = {5, 4, 2, 15};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, BARIS, KOLOM);
// Variabel password
char password[] = "1234"; // Kata sandi yang benar
char inputBuffer[5];
int inputIndex = 0;
// Status sistem
int failedAttempts = 0;
bool isLocked = true; // Awalnya solenoid terkunci
// Blynk Virtual Pins
#define BLYNK_AUTH_TOKEN "-gcWZU4BJudyFcCQMmH7J4lWUfHCEfLe"
#define WIFI_SSID "BengkelMesin"
#define WIFI_PASSWORD "55555555"
void setup() {
Serial.begin(9600);
// Koneksi ke Wi-Fi dan Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, WIFI_SSID, WIFI_PASSWORD);
// Konfigurasi pin
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_LOCKED_PIN, OUTPUT);
pinMode(LED_UNLOCKED_PIN, OUTPUT);
// Status awal
digitalWrite(RELAY_PIN, LOW); // Solenoid terkunci
digitalWrite(BUZZER_PIN, LOW);
updateLED();
}
void loop() {
Blynk.run(); // Menjalankan loop Blynk
char key = keypad.getKey();
if (key != NO_KEY) {
if (isLocked && failedAttempts >= 3) {
Serial.println("Keypad terkunci! Harap reset.");
return;
}
if (key == '#') {
validatePassword();
} else if (key == '*') {
clearInput();
} else {
if (inputIndex < 4) {
inputBuffer[inputIndex] = key;
inputIndex++;
}
}
Serial.print("Input: ");
Serial.println(inputBuffer);
}
}
void validatePassword() {
inputBuffer[inputIndex] = '\0'; // Akhiri string
if (strcmp(inputBuffer, password) == 0) {
Serial.println("Password Benar!");
openSolenoid();
failedAttempts = 0; // Reset jumlah kesalahan
} else {
Serial.println("Password Salah!");
failedAttempts++;
if (failedAttempts >= 3) {
lockKeypad();
}
}
clearInput();
}
void openSolenoid() {
isLocked = false;
digitalWrite(RELAY_PIN, HIGH);
updateLED();
Blynk.virtualWrite(V1, 1); // Kirim status "Solenoid Terbuka" ke V1
Blynk.notify("Solenoid Terbuka: Ada orang masuk"); // Kirim notifikasi ke Blynk
Serial.println("Solenoid Terbuka!");
delay(10000); // Simulasi waktu membuka solenoid
closeSolenoid();
}
void closeSolenoid() {
isLocked = true;
digitalWrite(RELAY_PIN, LOW);
updateLED();
Blynk.virtualWrite(V1, 0); // Kirim status "Solenoid Tertutup" ke V1
Serial.println("Solenoid Tertutup!");
}
void clearInput() {
memset(inputBuffer, 0, sizeof(inputBuffer));
inputIndex = 0;
}
void lockKeypad() {
Serial.println("Keypad terkunci!");
isLocked = true;
digitalWrite(BUZZER_PIN, HIGH);
updateLED();
Blynk.notify("Password Salah 3 Kali: Keypad Terkunci!"); // Kirim notifikasi ke Blynk
delay(5000);
digitalWrite(BUZZER_PIN, LOW);
}
void updateLED() {
if (isLocked) {
digitalWrite(LED_LOCKED_PIN, HIGH); // LED Merah menyala
digitalWrite(LED_UNLOCKED_PIN, LOW); // LED Hijau mati
} else {
digitalWrite(LED_LOCKED_PIN, LOW); // LED Merah mati
digitalWrite(LED_UNLOCKED_PIN, HIGH); // LED Hijau menyala
}
}
// Fungsi reset password menggunakan Blynk
BLYNK_WRITE(V0) {
failedAttempts = 0; // Reset jumlah kesalahan
Serial.println("Password reset!");
Blynk.notify("Password telah direset");
}