Selasa, 28 Juni 2011

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...

19 komentar:

  1. menarik... kode sumber di atas dapat langsung digunakan tdk tuk attiny2313?
    terimakasih..

    BalasHapus
  2. klo untuk attiny2313 saya tidak tahu, karena saya sama sekali blm pernah pakai attiny.. mohon maaf

    BalasHapus
  3. untuk pengaplikasiannya sendiri ..kita d sni kan membuat door lock..kita mnggunakan apa untuk mengunci pintunya sndiri? ap mnggunakan srvo

    BalasHapus
  4. sebenarnya ada sebuah komponen seperti pengunci magnetis... tapi saya lupa namanya apa...??? tapi saya pernah liat di situs digi-ware.com

    BalasHapus
  5. trimakasih..
    saya sudh brhsl mncoba door lock ini...dan sya ingn mncobnya mnggunkn mtor dc dn h-bridge untuk mnggrkkn mtr dc tsb.saya mhon bntuannya untuk memprogrm mtr dc trsbt

    BalasHapus
  6. maksudnya apa nih? apakah hanya mengontrol on/off saja motor DC ketika password yg dimasukan benar?
    saya sarankan anda menggunakan ic l293d sebagai driver motor DC...
    silakan liat di postingan saya tentang driver motor DC menggunakan L293D

    BalasHapus
  7. iya saya ingin mnggunakn mtr dc yng saya aplikasikan ke slot kunci pintu..sya hnya membthkn mtr dc bergerak searah jarum jam dan berlawana..dan tdak memerlukan pwm..jadi sebaiknya sya mmbuat h-bridge dri apa ya ? ap relay bisa?

    BalasHapus
  8. bisa saja anda ganti dengan relay... dan caranya mengontrolnya ama dengan menggunakan h brigde, tapi tidak bisa mengatur kecepatan motornya, hanya arah putarnya saja

    BalasHapus
  9. saya memiliki 6 buah mesin. yang akan digerakkan dengan bantuan keypad dan LCD. semisal jika saya tekan keypad angka 50-100 maka motor 1 yang bekerja. kemudian jika saya tekan angka 200-300 motor 2 bekerja dst,.. apa bisa menggunakan Rangkaian anda ini dan bagian mana saja yang perlu saya rubah,.. Mohon maaf saya awam dalam hal ini.

    Alwi
    Dosen Pertanian

    BalasHapus
  10. kk saya mau minta tolong, bisa bantu saya buat program dari keypad ke mikro atmega8535 keluarannya pakai 4 seven segment yang menggunakan BCD 74ls48… dan juga tolong tampilan proteusnya…

    konsepnya seperti kalkulator yang pakai seven segment jaman dulu…jadi 3 seven segment dipakai untuk menampilkan angka sampai ratusan yang diinput menggunakan keypad…sedangkan seven segment yang satu lagi bisa dirubah angkanya dari 1-9 tanpa mengubah tampilan 3 seven segmen yang sebelumnya…

    saya sudah bisa menampilkan angka pada 3 seven segment tapi angkanya selalu sama dan berubah saat saya menekan angka yang lain pada keypad…sedangkan saat berpindah pada seven segment yang sendirian tadi, ketiga angka pada 3 segment tadi menjadi hilang / 0… sedangkan seharusnya angka yang sudah diinput pada 3 seven segment tadi tetap tersimpan dan ditampilkan…

    contohnya untuk menampilkan angka 423 maka saat menekan keypad 4 maka angka tampil di seven segment ke 3, saat menekan keypad 2 maka hasil keluar pada seven segment ke 3, sedangkan angka 4 tadi berpindah pada seven segment ke 2. dan saat menekan keypad 3 maka angka tampil di seven segment ke 3, sedangkan angka 2 tadi berpindah pada seven segment ke 2 dan angka 4 berpindah pada seven segment pertama…

    kemudian setelah selesai menginput ketiga angka tersebut, saya menekan satu tombol dan berpindah pada sevent segment yang sendirian… jadi saat saya menekan tombol 1-9 maka hasilnya hanya keluar pada seven segment yang sendirian tersebut…

    setelah itu saya menekan satu tombol lagi dan semuanya mereset kembali…

    mohon bantuannya, karena saya sudah mencobanya dan sampai sekarang belum menemukan caranya…terimakasih…

    BalasHapus
  11. bang, sy mau bikin Kunci pintu berpassword dg keypad buat pengontrolnya dan motor stepper buat penggerak slotnya.. kira" rangkaiannya ditambah apa lagi ya? apakah motor stepper butuh driver motor? atau gak usah ? terimakasih sbmlnya..

    BalasHapus
  12. saya masukkan passwordnya apa ya...

    BalasHapus
  13. maaf mas, saya masih belajar disini
    tp kok saya ga bisa download ya file nya dari ziddu?
    padahal uda login ziddu,, cuma tertulis general key
    boleh d kasih pencerahan nyaa
    trimakasih

    BalasHapus
  14. sangat bermanfaat sekali untuk judul TA saya tahun ini
    tapi kalau untuk atmega8535 list programnya sama apa tidak?

    NB : FB saya (andrian Child Pratama)
    Twitter (@AndrieRoyal)

    mohon saran2nya

    BalasHapus
  15. terima kasih mas,.
    saya sudah mencoba & berhasil,
    tetapi jika saya ingin mengganti tampilan passwordnya dengan tanda bintang "*", program mana yg harus saya rubah ya mas,. makasih sebelumnya,.

    BalasHapus
  16. terima kasih mas sangat bermanfaat,.
    untuk menambah hardware seperti motor DC, motor Stepper, atau buzzer jika password salah tidak terlalu sulit karena banyak tutorial dan contoh pemrogramannya.
    tetapi saya ingin mengubah karakter password yang ditampilkan menjadi tanda bintang "*", program mana yang harus saya rubah ya mas kira2,.
    makasih atas bantuannya mas,..

    BalasHapus
  17. mas mau nanya dong
    program yg mas buat ini passwordnya berapa sihh?
    ketika saya masukkan password 6204, malahan wrog password katanya
    berarti passwoordnya tidak cocok kan?

    BalasHapus
  18. mas mau nanya dong
    program yg mas buat ini passwordnya berapa sihh?
    ketika saya masukkan password 6204, malahan wrog password katanya
    berarti passwoordnya tidak cocok kan?

    BalasHapus