Pemodelan Secure Door Access Control System dengan Arduino
Akhirnya tugas mata kuliah Interkasi Manusia Komputer untuk minggu ini selesai juga, jadinya saya membuat pemodelan secure door access control system dengan Arduino. Saya menggabungkan fungsi dari Arduino, keypad, 7-segment, dan speaker dan RGB LED.
Langsung saja, postingan saya kali ini akan membahas tentang bagaimana cara membuat pemodelan secure door access control system, sebelum saya melanjutkan, saya anggap pembaca sudah mengerti bagaimana cara mengoperasikan Arduino dengan keypad, 7-segment, dan speaker. Tutorial untuk RGB LED dapat dilihat di adafruit.com.
Agar lebih mudah membayangkan hasil akhirnya seperti apa, silahkan lihat video yang sudah saya buat dibawah ini.
Jadi skema rangkaian yang akan saya buat dapat dilihat pada gambar 1.
Gambar 1 - skema rangkaian pemodelan secure door access control system dengan Arduino
Gambar 2 - rangkaian yang sudah saya buat
Pada dasarnya, saya hanya menggabungkan kode-kode program yang ada pada tutorial Arduino dengan keypad, 7-segment, dan speaker dan RGB LED. Ditambah sedikit algoritma untuk menentukan state yang saya inginkan. State diagramnya dapat dilihat pada gambar 3.
Gambar 3 - state diagram secure door access control system yang akan saya buat
Saya membuat dengan ketentuan sebagai berikut:
state "no pin entered", yang terjadi:
LED berwarna biru
7-segment menunjukkan angka 0
state "pin entered", yang terjadi:
LED kedap kedip berwarna merah
7-segment menunjukkan angka yang dimasukkan dan angka 0 untuk angka yang belum dimasukkan
state "unlocked, yang terjadi:
LED berwarna hijau selama 3 detik
terdengar "beep" ketika pindah ke state "no pin entered"
state "alarm", yang terjadi:
LED kedap kedip berwarna putih, kuning, dan biru
bunyi alarm
tidak dapat melakukan apa-apa
state "incorrect pin", yang terjadi:
LED berwarna merah selama 2 detik
terdengar suara "beep" selama 2 detik
ketika keypad ditekan akan terdengar bunyi "beep"
'*' sebagai backspace
'#' sebagai enter
PIN yang saya simpan adalah "7601", kenapa 7601? karena setiap hari saya kuliah di ruangan 7601 :)
nah hasil jatuh bangun ngoding dan ngetes selama beberapa jam di hari sabtu dan minggu kemarin bisa dilihat dibawah ini.
/*----------Speaker---------*/
#include "pitches.h" //library untuk menentukan frekuensi dan nama note
const int speaker = 2; //deklarasi pin untuk speaker
/*----------RGB LED---------*/
//pin dihubungkan ke pin PWM karena fungsi yang akan digunakan menggunakan fungsi analogWrite()
const int redPin = 11; //deklarasi pin yang akan disambungkan dengan LED warna merah
const int greenPin = 10; //deklarasi pin yang akan disambungkan dengan LED warna hijau
const int bluePin = 9; //deklarasi pin yang akan disambungkan dengan LED warna biru
/*----------Keypad----------*/
const int numRows = 4; //jumlah baris pada keypad
const int numCols = 4; //jumlah kolom pada keypad
const int debounceTime = 50; //waktu dalam mili detik untuk menunggu tombol ke kondisi stabil
//keymap menentukan char apa yang muncul apabila suatu tombol ditekan
const char keymap[numRows][numCols] = {
{ '1', '2', '3', 'A' } ,
{ '4', '5', '6', 'B' } ,
{ '7', '8', '9', 'C' } ,
{ '*', '0', '#', 'D' }
};
//array ini menentukan pin yang akan digunakan untuk baris dan kolom pada keypad
const int rowPins[numRows] = { 13, 12, A5, A4 }; //baris 0 sampai 3
const int colPins[numCols] = { A3, A2, A1, A0 }; //kolom 0 sampai 3
/*----------7-segment-------*/
const int clockPin = 3;//deklarasi pin yang akan disambungkan dengan clock pada 74HC595
const int latchPin = 4;//deklarasi pin yang akan disambungkan dengan latch pada 74HC595
const int dataPin = 5;//deklarasi pin yang akan disambungkan dengan data pada 74HC595
/*-----------Main----------*/
const int maxTrial = 3; //kumlah maksimum untuk mencoba memasukkan pin
const char pinStored[4] = {'7', '6', '0', '1'}; //pin yang disimpan
int trial = 0; //counter untuk jumlah percobaan memasukkan pin
char pinTrial[4] = {0, 0, 0, 0}; //default value dari pin (diisi integer 0)
boolean pinEntered = false; //variabel untuk mengecek apakah user sedang memasukkan pin atau tidak
long previousMillis; //variabel untuk perhitungan waktu
unsigned long currentMillis; //variabel untuk perhitungan waktu
void setup(){
/*----------Speaker---------*/
//tidak ada yang perlu di setup dari speaker
/*----------RGB LED---------*/
pinMode(redPin, OUTPUT); //membuat nomor pin yang ada pada variabel redPin menjadi output
pinMode(greenPin, OUTPUT); //membuat nomor pin yang ada pada variabel greenPin menjadi output
pinMode(bluePin, OUTPUT); //membuat nomor pin yang ada pada variabel bluePin menjadi output
/*----------Keypad----------*/
for (int row = 0; row < numRows; row++){
pinMode(rowPins[row], INPUT); //set baris sebagai input
digitalWrite(rowPins[row], HIGH); //buat semua baris tidak aktif
}
for (int column = 0; column < numCols; column++){
pinMode(colPins[column],OUTPUT); //set kolom sebagai input
digitalWrite(colPins[column], HIGH); //buat semua kolom menjadi tidak aktif
}
/*----------7-segment-------*/
pinMode(clockPin, OUTPUT); //membuat nomor pin yang ada pada variabel clockPin menjadi output
pinMode(latchPin, OUTPUT); //membuat nomor pin yang ada pada variabel latchPin menjadi output
pinMode(dataPin, OUTPUT); //membuat nomor pin yang ada pada variabel dataPin menjadi output
}
void loop(){
currentMillis = millis(); //mengassign nilai pada variabel currentMillis dengan waktu ketika loop() dijalankan
readKey(); //menjalankan prosedur readKey();
if((!pinEntered) && (trial != maxTrial)){ //melakukan pengecekan apakah user sedang memasukkan pin atau tidak
idle();
}
else if((pinEntered) && (trial != maxTrial)){ //melakukan pengecekan apakah user sedang memasukkan pin
enterPin();
}
else if(trial == maxTrial){ //melakukan pengecekan apakah user sudah melewatai batas percobaan untuk memasukkan pin
activateAlarm();
}
write7Seg(); //menjalankan prosedur write7seg()
}
/*
prosedur ini menunjukkan state "idle" dimana tidak ada pin yang dimasukkan atau user sedang tidak memasukkan pin
*/
void idle(){
pinEntered = false;
setColor(0, 0, 255);//menyalakan LED dengan warna biru
}
/*
prosedur ini menunjukkan state "pin entered" dimana user sedang memasukkan pin
*/
void enterPin(){
//penggunaan currentMillis - previousMillis untuk menggantikan fungsi delay(), karena cara kerja tampilan di 7-segment tidak dapat mentolerir adanya delay pada program
if(currentMillis - previousMillis > 1000){
setColor(0, 0, 0);//mematikan LED
previousMillis = currentMillis;
}
else if(currentMillis - previousMillis > 500){
setColor(255, 0, 0);//menyalakan LED dengan warna merah
}
}
/*
prosedur ini menunjukkan state "unlocked" dimana user sudah berhasil memasukkan pin dengan benar
*/
void unlocked(){
pinEntered = false;
for(int i=0; i<4; i++){ //mengembalikan data yang tersimpan pada variabel pnyimpan input pin dari user ke keadaan semula
pinTrial[i] = 0;
}
trial = 0; //mengembalikan nilai variabel trial ke nilai semula
previousMillis = currentMillis;
while(currentMillis - previousMillis < 3000){
currentMillis = millis();
setColor(0, 255, 0);//menyalakan LED dengan warna hijau
write7Seg();
}
keypadTone(); //menjalankan prosedur keypadTone()
}
/*
prosedur ini menunjukkan state "incorrect pin" dimana user salah memasukkan pin
*/
void incorrectPin(){
tone(speaker, NOTE_G7, 2000); //men-generate suara dengan frekuensi NOTE_G7 selama 2 detik
pinEntered = false;
for(int i=0; i<4; i++){//mengembalikan data yang tersimpan pada variabel pnyimpan input pin dari user ke keadaan semula
pinTrial[i] = 0;
}
previousMillis = currentMillis;
while(currentMillis - previousMillis < 2000){
currentMillis = millis();
setColor(255, 0, 0); //menyalakan LED dengan warna merah
write7Seg();
}
}
/*
prosedur ini menunjukkan state "alarm" dimana user sudah salah memasukkan pin sebanyak 3x
*/
void activateAlarm(){
previousMillis = millis();
while(true){
currentMillis = millis();
if(currentMillis - previousMillis > 300){
setColor(255, 255, 255); //menyalakan LED dengan warna putih
previousMillis = currentMillis;
tone(speaker, NOTE_A7, 200); //meng-generate suara dengan frekuensi NOTE_A7 selama 200ms
}
else if(currentMillis - previousMillis > 200){
setColor(255 ,255 ,0); //menyalakan LED dengan warna kuning
}
else if(currentMillis - previousMillis > 100){
setColor(0 ,0 ,255); //menyalakan LED dengan warna biru
tone(speaker, NOTE_D7, 200); //meng-generate suara dengan frekuensi NOTE_D7 selama 200ms
}
write7Seg();
}
}
/*
prosedur ini berfungsi untuk memproses inputan dari user
*/
void readKey(){
char key = getKey(); //variabel sementara untuk input yang terbaca dari user
int pinTrialLength = 0;
for(int i=0; i<4; i++){ //mengecek apakah user sudah memasukkan pin sebanyak 4-digit atau belum
if(pinTrial[i] != 0){ //mengecek apakah user sudah memasukkan pin atau belum
pinTrialLength++;
}
}
if(key == '*'){ //proses yang akan dilakukan apabila user menekan tombol '*' pada keypad
for(int i=3; i>=0; i--){ //melakukan iterasi dari belakang untuk "menghapus" pin yang terkahir dimasukkan oleh user
if(pinTrial[i] != 0){ //mengecek apakah user sudah memasukkan pin atau belum
pinTrial[i] = 0;
if(i == 0){ //mengembalikkan ke state idle apabila user menghapus digit pin pertama yang ia masukkan
pinEntered = false;
}
break;
}
}
keypadTone();
}
else if((key == '#') && (pinTrialLength == 4)){ //proses yang akan dilakukan apabila user sudah memasukkan 4-digit pin kemudian menekan tombol '#' pada keypad
int pinMatched = 0;
trial++; //menambahkan jumlah trial yang dilakukan user
for(int i=0; i<4; i++){ //melakukan pengecekan apakah pin yang dimasukkan user benar/ salah
if(pinTrial[i] == pinStored[i]){
pinMatched++;
}
}
keypadTone();
if(pinMatched == 4){ //jika pin yang dimasukkan benar maka akan masuk ke kondisi unlocked
unlocked();
}
else if(pinMatched != 4){ //jika pin yang dimasukkan salah maka akan masuk ke kondisi incorrect pin
incorrectPin();
}
}
else if((key != 0) && (key != 'A') && (key != 'B') && (key != 'C') && (key != 'D') && (key != '#')){ //menentukan key input yang tidak akan diproses apabila dimasukkan/ user menekan tombol pada keypad
for(int i=0; i<4; i++){ //menyimpan input dari user pada variabel sementara (pinEntered[])
if(pinTrial[i] == 0){
pinTrial[i] = key;
pinEntered = true;
break;
}
}
keypadTone();
}
else if(key == '#'){ //apabila user menekan tombol '#' sebelum memasukkan pin sebanyak 4-digit
keypadTone();
}
}
/*
fungsi ini untuk membaca semua input dari user dengan cara menekan salah satu tombol pada keypad
*/
char getKey()
{
char key = 0; //0 menunjukkan tidak ada tombol yang ditekan
for(int column = 0; column < numCols; column++){
digitalWrite(colPins[column],LOW); //aktifkan kolom sekarang
for(int row = 0; row < numRows; row++){ //scan semua baris apakah
// ada tombol yang ditekan
if(digitalRead(rowPins[row]) == LOW) //jika tombol ditekan
{
delay(debounceTime); //debounce
while(digitalRead(rowPins[row]) == LOW)
; //menunggu hingga tombol tidak dalam kondisi ditekan
key = keymap[row][column]; //mengingat tombol apa yang ditekan
}
}
digitalWrite(colPins[column],HIGH); //membuat kolom sekarang menjadi tidak aktif
}
return key; //mengembalikan tombol yang ditekan, 0 jika tidak ada yang ditekan
}
/*
prosedur ini untuk menghasikan suara setiap kali keypad ditekan
*/
void keypadTone(){
tone(speaker, NOTE_G7, 100); //meng-generate suara dengan frekuensi NOTE_G7 selama 100ms
}
/*
prosedur ini berfungsi untuk menampilkan pin pada 7 segment
*/
void write7Seg(){
int8_t digit;
for(int i=0; i<4; i++){ //looping untuk menampilkan setiap digit pada 7-segment
int8_t digit = pinTrial[i];
switch(i){
case 0://digit ke-1
digit = (digit<<4) + 1;
break;
case 1://digit ke-2
digit = (digit<<4) + 2;
break;
case 2://digit ke-3
digit = (digit<<4) + 4;
break;
case 3://digit ke-4
digit = (digit<<4) + 8;
break;
}
digitalWrite(4, LOW);
shiftOut(5, 3, MSBFIRST, digit);//(datapin, clockpin, data)
digitalWrite(4, HIGH);
}
}
/*
fungsi untuk menentukan warna yang akan ditampilkan pada RGB LED
*/
void setColor(int red, int green, int blue){
red = 255 - red;
green = 255 - green;
blue = 255 - blue;
analogWrite(redPin, red); //menulis nilai analog(PWM) sebesar variabel red pada redPin
analogWrite(greenPin, green); //menulis nilai analog(PWM) sebesar variabel green pada greenPin
analogWrite(bluePin, blue); //menulis nilai analog(PWM) sebesar variabel blue pada bluePin
}
Tidak terlalu banyak permasalahan yang dihadapi, palingan ada algoritma yang kurang mangkus atau perlu disempurnakan, saya tidak membuat dokumentasinya, karena memang secara fisik sulit dibedakan dan membutuhkan waktu yang sangat banyak untuk merekam video.
Pada dasarnya, permasalahan yang banyak muncul adalah dari programnya, karena program untuk mengatur rangkaiannya sudah dikerjakan dan dicoba terlebih dahulu sebelum muncul ide untuk membuat secure door access control system.
Gambar 4 - state "no pin entered" (kiri atas), state "pin entered" (kanan atas), state "unlocked" (kiri bawah), state "incorrect pin"(kanan bawah)
Gambar 5 - state "alarm"
Pada percobaan saya ini, saya hanya menggunakan 15 pin pada board Arduino termasuk 6 pin analog yang saya fungsikan sebagai pin digital. Perinciannya adalah sebagai berikut:
keypad menggunakan 8 pin
7-segment menggunakan 3 pin
RGB LED menggunakan 3 pin
speaker menggunakan 1 pin
Sebenarnya penggunaan pin ini masih bisa di minimalisir dengan membuat rangkaian yang dapat menghubungkan keypad dengan hanya 1 buah pin analog saja, namun saya tidak sempat untuk melakukan percobaan karena keterbatasan waktu.
Oke sekian saja postingan saya kali ini, selamat mencoba dan semoga bermanfaat!
Wow, you are genius....... but please dont be hacker... lolz, Just kidding
BalasHapus