/*--- Challenge 5: Sistem keamaan Loker Perpustakaan
I Nengah Arnawa
IoT4-8
- Motor servo digunakan sebagai pengunci atau dihubungkan ke sistem
pengunci yang lebih kuat
- Pushbutton dipasang sedemikian sehingga saat pintu loker ditutup
pushbutton tertekan, kemudian mengaktifkan kunci pada servo.
- Asumsi setiap loker memiliki password tetap yang berbeda antarloker
---*/
#include <Wire.h>
#include <ESP32Servo.h> //mengambil library servo motor
#include <Keypad.h> //mengambil library keypad
#include <LiquidCrystal_I2C.h> //mengambil library LCD
#define BARIS 4 //definisikan jumlah baris keypad
#define KOLOM 4 //definisikan jumlah kolom keypad
#define ledhijau 23
#define ledmerah 32
Servo motorServo; //memanggil dan menamai motornya
int servoPin = 13; //pin untuk motornya
const int pushbuttonPin = 27;
int kondisiButton = LOW;
char tuts[BARIS][KOLOM] = { //tuts maksudnya tombol keypad, ini mirip matriks
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[BARIS] = {14, 12, 19, 18}; //di pin mana input baris terhubung
byte colPins[KOLOM] = {5, 4, 2, 15}; //di pin mana input kolom terhubung di esp32
//menggunakan isian dari library keypad
Keypad keypadnya = Keypad(makeKeymap(tuts), rowPins, colPins, BARIS, KOLOM);
//menggunakan isian dari librari LCD
LiquidCrystal_I2C layar(0x27, 16, 2);
//inputan user
int nomor = 0;
int sandi = 4567; //passwordnya
int kolomCursor = 0; //kolom kursor tempat mengetik ada 16
int barisCursor = 0; //baris kursor tempat mengetik hanya 0 dan 1 karena 16x2
void setup() {
layar.init(); //mungkin untuk menyiapkan Layar LCD
layar.backlight(); // untuk menghidupkan lampu latar belakang layar
pinMode(ledmerah, OUTPUT);
pinMode(ledhijau, OUTPUT);
motorServo.attach(servoPin);//pasang motor servonya
motorServo.write(0);
pinMode(pushbuttonPin, INPUT);
//Serial.begin(115200);
}
void loop() {
char ketikan = keypadnya.getKey(); //menyuruh untuk mengambil data tuts yng ditekan
layar.setCursor(kolomCursor, barisCursor); //letakkan kursor di awal
layar.print("Selamat Datang!"); //muncul ini di lcd
layar.setCursor(kolomCursor, barisCursor + '1'); //letakkan kursor di awal
layar.print("Password:"); //muncul ini di lcd
switch (ketikan) { //bila ada ketikan, bilamana:
case '0'...'9':
layar.setCursor(10, barisCursor + '1'); //mulai menulis di baris berikutnya
nomor = nomor * 10 + (ketikan - '0'); //membuat nomor yang diketik muncul sebagai satuan terakhir
layar.print(nomor); //menyuruh layar mencetak ketikan tuts
break;
case '#':
if (nomor == sandi) {
layar.clear();
digitalWrite(ledhijau, HIGH);
layar.setCursor(kolomCursor, barisCursor);
layar.print("Akses diterima!");
delay(1000);
motorServo.write(90);
layar.setCursor(kolomCursor, barisCursor + '1');
layar.print("Masukkan barang");
//Serial.println("Password BENAR");
delay(6000);
layar.clear();
nomor = 0;
}
else {
layar.clear();
layar.setCursor(kolomCursor, barisCursor);
layar.print("Password Salah");
digitalWrite(ledmerah, HIGH);
//Serial.println("Password SALAH");
delay(2000);
nomor = 0;
layar.clear();
break;
}
case'*':
nomor = 0;
layar.clear();
delay(1000);
break;
}
kondisiButton = digitalRead(pushbuttonPin); //membaca kondisi pushbutton
if (kondisiButton == HIGH) { //bila tertekan
digitalWrite(ledmerah, LOW); //led mati
digitalWrite(ledhijau, LOW);
motorServo.write(0);
}else{ //bila belum ditekan,led nyala
digitalWrite(ledmerah, HIGH); //mengecek loker yang belum ditutup baik
digitalWrite(ledhijau, HIGH);
}
digitalWrite(ledmerah, LOW);
digitalWrite(ledhijau, LOW);
}