// AGUNG FATONI
// 52204113033
// PROYEK TEKNOLOGI INFORMASI
// TOPIK 5
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Keypad.h>
#include <ESP32Servo.h>
#include <DHT.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
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] = {14, 12, 19, 18};
byte colPins[COLS] = {5, 4, 2, 15};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
const char *password = "1234";
char enteredPassword[5];
int passwordIndex = 0;
Servo myservo;
const int servoPin = 26;
#define DHT_PIN 27
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
bool accessGranted = false;
int wrongAttempts = 0;
const int buzzerPin = 16; // Pin buzzer
void setup() {
Serial.begin(115200);
pinMode(buzzerPin, OUTPUT); // Set pin buzzer sebagai output
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(25, 0);
display.println("Smart Security");
display.display();
display.setCursor(30, 15);
display.println("Perpustakaan");
display.display();
display.setCursor(10, 28);
display.println("Masukkan");
display.display();
display.setCursor(5, 38);
display.println("Barang dan Password:");
display.display();
myservo.attach(servoPin);
dht.begin();
}
void loop() {
char key = keypad.getKey();
if (!accessGranted && key && key != '#' && key != '*') {
if (passwordIndex < 4) {
enteredPassword[passwordIndex] = key;
passwordIndex++;
//display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(25, 0);
display.println("Smart Security");
display.display();
display.setCursor(30, 15);
display.println("Perpustakaan");
display.display();
display.setCursor(10, 28);
display.println("Masukkan");
display.display();
display.setCursor(5, 38);
display.println("Barang dan Password:");
display.display();
for (int i = 0; i < passwordIndex; i++) {
display.print("*");
}
display.display();
}
} else if (key == '#' && !accessGranted) {
if (strcmp(enteredPassword, password) == 0) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(15, 20);
display.println("Access Accepted");
display.display();
unlockLocker();
succesBuzzer();
delay(100);
deactivateBuzzer();
accessGranted = true;
} else {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(15, 20);
display.println("Invalid Password");
display.display();
succesBuzzer();
delay(250);
deactivateBuzzer();
wrongAttempts++;
if (wrongAttempts >= 3) { // Jika 3 kali salah, aktifkan buzzer
activateBuzzer();
delay(3000); // Diamkan buzzer selama 5 detik
deactivateBuzzer();
wrongAttempts = 0; // Setel kembali jumlah percobaan yang salah ke 0
}
delay(2000);
//display.clearDisplay();
passwordIndex = 0;
display.setCursor(25, 0);
display.println("Smart Security");
display.display();
display.setCursor(30, 15);
display.println("Perpustakaan");
display.display();
display.setCursor(10, 28);
display.println("Masukkan");
display.display();
display.setCursor(5, 38);
display.println("Barang dan Password:");
display.display();
display.display();
}
} else if (key == '*' && !accessGranted) { // Handle "*" key to clear entered password
passwordIndex = 0;
memset(enteredPassword, 0, sizeof(enteredPassword));
//display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(25, 0);
display.println("Smart Security");
display.display();
display.setCursor(30, 15);
display.println("Perpustakaan");
display.display();
display.setCursor(10, 28);
display.println("Masukkan");
display.display();
display.setCursor(5, 38);
display.println("Barang dan Password:");
display.display();
}
if (accessGranted) {
float temperature = readTemperatureFromDHT22();
float humidity = readHumidityFromDHT22();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print("Suhu : ");
display.print(temperature);
display.println(" C");
display.print("Kelembapan : ");
display.print(humidity);
display.println(" %");
display.display();
}
}
void unlockLocker() {
myservo.write(90);
delay(2000);
myservo.write(0);
// Tampilkan "Loker Terbuka" setelah membuka loker
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(20,40);
display.println("Loker Terbuka");
display.display();
delay(2000);
display.clearDisplay();
}
float readTemperatureFromDHT22() {
return dht.readTemperature();
}
float readHumidityFromDHT22() {
return dht.readHumidity();
}
void activateBuzzer() {
tone(buzzerPin, 200); // Aktifkan buzzer pada frekuensi 200 Hz
}
void deactivateBuzzer() {
noTone(buzzerPin); // Matikan buzzer
}
void succesBuzzer(){
tone(buzzerPin, 200);// Setelah memasukkan password
}
//@Rymutich '_' Ojo Lupa Ngopi