PENGUNCI PINTU (DOOR LOCK) BERPASSWORD MENGGUNAKAN KEYPAD DAN LCD DENGAN
CODEVISION AVR
Mungkin teman-teman semua sudah tahu
tentang aplikasi yang bernama pengunci pintu (door lock)
berpassword, pada aplikasi ini sudah saya realisasikan pada hardware
yang sesungguhnya dan berhasil.
Kesulitan utama dari aplikasi
ini adalah ketika seorang user memasukkan password dengan menggunakan
keypad, kita harus dapat menyimpan input yang berasal dari keypad
kedalam satu variabel. Misalnya user menekan 6, lalu 2, lalu 0 dan 4
berarti passwornya adalah 6204 (misalkan). Nilai tersebut harus
dijadikan dalam 1 variabel yang kemudian akan dibandingkan dengan
password yang sebenarnya. Jika user memasukkan password dengan benar
maka akan membuka kunci, jika salah maka kunci tidak akan terbuka.
Untuk
mengatasi masalah tersebut saya menggunakan array untuk mendeteksi
berapa kali penekanan keypad dan angka berapa yang akan ditekan.
Baiklah disini saya akan menjelaskan algoritma yang saya buat. Jika
user menekan 6, lalu 2 lalu 0 dan 4 maka seperti ini logikanya:
Awalnya saya deklarasikan array
sebagai berikut:
array[10],
i=0;
saat terjadi penekanan angka 6 maka;
i++ (saya increamentkan) jadi i=1
kemudian angka 6 saya simpan pada variabel array[i] jadi array[1]=6
kemudian saat terjadi penekanan angka 2, maka:
i++ (saya increamentkan lagi) jadi i=2
kemudian angka 2 saya simpan pada variabel array[i] jadi array[2]=2
kemudian saat terjadi penekanan angka 0, maka:
i++ (saya increamentkan lagi) jadi i=3
kemudian angka 0 saya simpan pada variabel array[i] jadi array[3]=0
kemudian saat terjadi penekanan angka 4, maka:
i++ (saya increamentkan lagi) jadi i=4
kemudian angka 4 saya simpan pada variabel array[i] jadi array[4]=4
maka didapat array[1]=6, array[2]=2,
array[3]=0, array[4]=4
kalo sudah didapat seperti diatas maka kita tinggal kumpulkan dalam satu
variabel (nama variabelnya misalkan nilai) caranya:
saat i bernilai 1, i=1 kita hitung dengan rumus:
nilai=array[1] //jadi nilai=6
saat i bernilai 2, i=2 kita hitung dengan rumus:
nilai=(array[1]*10)+array[2] //jadi nilai=62
saat i bernilai 3, i=3 kita hitung dengan rumus:
nilai=(array[1]*100)+(array[2]*10)+array[3] //jadi nilai=620
saat i bernilai 4, i=4 kita hitung dengan rumus:
nilai=(array[1]*1000)+(array[2]*100)+(array[3]*10)+array[4] //jadi
nilai=6204
Sudah mengerti bukan, dari rumus-rumus
diatas masih dapat disederhanakan, menjadi:
jika i=1
nilai=array[i]
jika i bernilai (i>=2 dan i<=8)
nilai=(nilai*10)+array[i]
Banyaknya penekanan tombol saya batasi
sampai 8 kali. Sebenarnya saya ingin membuatnya sampai 10 kali tetapi
saat saya coba tidak berjalan dengan lancar saat penekanan ke 9 kali.
Saya tidak tahu kenapa? Jika teman-teman bisa memecahkannya tolong beri
tahu saya!
Baiklah kembali lagi ke aplikasi
yang akan kita buat. Langsung saja ke cara kerjanya, gambar
rangkaiannya bisa anda lihat dibawah ini. Saat pertama kali alat ini
saya nyalakan maka dalam keadaan tidak terkunci (unlock), untuk
menguncinya (lock) anda harus menekan tombol = (lihat gambar keypad
dibawah). Setelah terkunci, jika anda ingin membukanya kembali anda
harus memasukkan passwordnya (jika sudah mengetikan password tekan
tombol + untuk memasukkannya). Jika benar maka akan membuka kunci,
tetapi jika salah kunci tidak akan terbuka. Ketika sudah terbuka maka
cara kerjanya kembali lagi ke awal. Sedangkan tombol ON/C saya gunakan
untuk menghapus password jika salah dalam pengetikannya. Untuk
indikator kuncinya saya menggunakan sebuah LED, jika LED menyala maka
dalam keadaan tidak terkunci dan jika mati dalam keadaan terkunci.
Berikut adalah listing program lengkapnya:
#include <mega16.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>
float nilai=0, password=12345678;
char temp[12], array[10], i=0, indeks=0;
//variabel indeks digunakan untuk mendeteksi
jika indeks=0 unlock, indeks=1 lock
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0×15 ;PORTC
#endasm
#include <lcd.h>
void lock()
{
while (indeks==0)
{
lcd_gotoxy(0,0);
lcd_putsf(“Please press =”);
lcd_gotoxy(0,1);
lcd_putsf(“to lock”);
PORTB = 0b11111011;
delay_ms(30);
if (PINB.7 == 0)
{
indeks=1;
PORTD.0=1;//terkunci
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“locked”);
delay_ms(1000);
lcd_clear();
}
}
}
void enter()
{
if (nilai==password)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“unlocked”);
delay_ms(1000);
i=0; nilai=0;
PORTD.0=0;//kunci terbuka
indeks=0;
}
else
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“wrong password”);
delay_ms(2500);
i=0; nilai=0;
indeks=1;//karena password salah jadi
masih terkunci
}
}
void simpan_dlm_1variabel()
{
if (i==1){nilai=array[i];}
if (i>=2 && i<=8)
{
nilai=(nilai*10)+array[i];
}
}
void scanning_keypad()//scanning pendeteksian
penekanan keypad
{
lcd_gotoxy(0,0);
lcd_putsf(“enter u’r pass”);
PORTB = 0b11111110;
delay_ms(30);
if (PINB.4 == 0) {i++; array[i]=1;
simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.5 == 0) {i++; array[i]=4;
simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.6 == 0) {i++; array[i]=7;
simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.7 == 0)
{lcd_clear();i=0;nilai=0;delay_ms(300);}
PORTB = 0b11111101;
delay_ms(30);
if (PINB.4 == 0) {i++; array[i]=2;
simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.5 == 0) {i++; array[i]=5;
simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.6 == 0) {i++; array[i]=8;
simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.7 == 0) {i++; array[i]=0;
simpan_dlm_1variabel(); delay_ms(300);}
PORTB = 0b11111011;
delay_ms(30);
if (PINB.4 == 0) {i++; array[i]=3;
simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.5 == 0) {i++; array[i]=6;
simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.6 == 0) {i++; array[i]=9;
simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.7 == 0) {delay_ms(300);}
PORTB = 0b11110111;
delay_ms(30);
if (PINB.4 == 0) {delay_ms(300);}
if (PINB.5 == 0) {delay_ms(300);}
if (PINB.6 == 0) {delay_ms(300);}
if (PINB.7 == 0) {enter();delay_ms(300);}
}
void tampil_lcd()
{
if (nilai>0)
{
ftoa(nilai,0,temp);
lcd_gotoxy(0,1);
lcd_puts(temp);
}
}
void main(void)
{
PORTB=0xff;
DDRB=0x0f;
PORTD=0×00;//PD0 belogika low atau dlm
keadaan unlock awalnya
DDRD=0×01;//PD0 sebagai output
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by
Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;
// LCD module initialization
lcd_init(16);
lcd_putsf(“ElectrO-cOntrOl”);
delay_ms(1500);
lcd_clear();
while (1)
{
lock();
scanning_keypad();
tampil_lcd();
};
}
Jika ingin mendapatkan program dalam
bentuk file CodeVision AVR dan file simulasi menggunakan proteus untuk
aplikasi ini, silakan download pada link dibawah ini.
file codevision dan file simulasi proteus aplikasi door lock.
CATATAN: saat memasukkan
password disarankan tidak diawali dengan angka 0, untuk lebih jelasnya
lihat perhitungan untuk menjadikannya dalam satu variabel.
Semoga bermanfaat...
Sumber dari : http://elektro-kontrol.blogspot.com