#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Keypad.h>
#define TINGGI_LAYAR 64
#define LEBAR_LAYAR 128
const byte BARIS = 4;
const byte KOLOM = 4;
Adafruit_SSD1306 oled(LEBAR_LAYAR, TINGGI_LAYAR, &Wire, -1);
char tombol[BARIS][KOLOM] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pinBaris[BARIS] = {14, 12, 19, 18};
byte pinKolom[KOLOM] = {5, 4, 2, 15};
Keypad keypadCustom = Keypad(makeKeymap(tombol), pinBaris, pinKolom, BARIS, KOLOM);
char tombolCustom;
int angka = 0;
int kataSandi = 9999;
int ledMerah = 26;
int ledHijau = 33;
int buzzer = 25;
int batasSandi = 4;
int hitungAngka = 0;
int kursorSandi = 38;
void setup() {
Serial.begin(115200);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Gagal memulai SSD1306 OLED"));
while (1);
}
pinMode(ledMerah, OUTPUT);
pinMode(ledHijau, OUTPUT);
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(WHITE);
oled.setCursor(25, 20);
oled.print("SELAMAT DATANG");
oled.display();
delay(500);
tone(buzzer, 3000);
digitalWrite(ledMerah, HIGH);
digitalWrite(ledHijau, HIGH);
delay(200);
noTone(buzzer);
digitalWrite(ledMerah, LOW);
digitalWrite(ledHijau, LOW);
delay(300);
tone(buzzer, 3000);
digitalWrite(ledMerah, HIGH);
digitalWrite(ledHijau, HIGH);
delay(200);
noTone(buzzer);
digitalWrite(ledMerah, LOW);
digitalWrite(ledHijau, LOW);
delay(500);
oled.setTextSize(2);
oled.setCursor(25, 30);
oled.print(".");
oled.display();
delay(200);
oled.setCursor(45, 30);
oled.print(".");
oled.display();
delay(200);
oled.setCursor(65, 30);
oled.print(".");
oled.display();
delay(200);
oled.setCursor(85, 30);
oled.print(".");
oled.display();
delay(200);
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(2, 25);
oled.print("Masukkan Sandi");
oled.display();
delay(1000);
oled.clearDisplay();
}
void loop() {
oled.setTextSize(1);
oled.setTextColor(WHITE);
oled.setCursor(23, 25);
oled.print("Input Sandi");
tombolCustom = keypadCustom.getKey();
switch (tombolCustom) {
case '0' ... '9':
hitungAngka++;
if (hitungAngka <= batasSandi) {
angka = angka * 10 + (tombolCustom - '0');
oled.setTextSize(2);
oled.setTextColor(WHITE);
oled.setCursor(kursorSandi, 35);
oled.println("*");
oled.display();
kursorSandi += 14;
tone(buzzer, 500);
delay(10);
noTone(buzzer);
}
break;
case '#':
oled.clearDisplay();
if (angka == kataSandi) {
oled.setTextSize(1);
oled.setTextColor(WHITE);
oled.setCursor(18, 25);
oled.print("Akses Diterima ");
oled.display();
tone(buzzer, 3000);
digitalWrite(ledHijau, HIGH);
delay(200);
noTone(buzzer);
digitalWrite(ledHijau, LOW);
delay(300);
tone(buzzer, 3000);
digitalWrite(ledHijau, HIGH);
delay(200);
noTone(buzzer);
digitalWrite(ledHijau, LOW);
delay(500);
delay(1000);
angka = 0;
hitungAngka = 0;
kursorSandi = 38;
delay(1000);
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(27, 25);
oled.print("Pintu Terbuka");
oled.display();
delay(3000);
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(27, 25);
oled.print("Pintu Ditutup");
oled.display();
delay(2000);
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(2, 25);
oled.print("Masukkan Sandi");
oled.display();
delay(100);
oled.clearDisplay();
} else {
oled.setTextSize(1);
oled.setTextColor(WHITE);
oled.setCursor(18, 25);
oled.print("Sandi Salah");
oled.display();
tone(buzzer, 1000);
digitalWrite(ledMerah, HIGH);
delay(700);
noTone(buzzer);
digitalWrite(ledMerah, LOW);
delay(500);
tone(buzzer, 1000);
digitalWrite(ledMerah, HIGH);
delay(500);
noTone(buzzer);
digitalWrite(ledMerah, LOW);
delay(500);
angka = 0;
hitungAngka = 0;
kursorSandi = 38;
delay(2000);
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(2, 25);
oled.print("Masukkan Sandi");
oled.display();
delay(100);
oled.clearDisplay();
}
break;
case '*':
hitungAngka = 0;
kursorSandi = 38;
angka = 0;
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(2, 25);
oled.print("Masukkan Sandi");
oled.display();
delay(100);
oled.clearDisplay();
break;
}
}