RSS

PENGUNCI PINTU (DOOR LOCK) BERPASSWORD MENGGUNAKAN KEYPAD DAN LCD DENGAN CODEVISION AVR

30 Apr

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. Tetapi ketika saya simulasikan tidak berjalan dengan baik, saya tidak tahu kenapa. Tapi itu tidak masalah yang penting sudah saya coba pada hardware yang sesungguhnya dan berhasil.

Motivasi pembuatan aplikasi ini adalah awalnya saya sedang browsing dengan mengunjungi salah satu forum mikrokontroler yang ada di Indonesia, disitu ada yang bertanya tentang penyimpanan input yang berasal dari keypad kedalam satu variabel, tetapi tidak ada yang menanggapinya bahkan memberikan saran pun tidak. Entah karena budaya tidak mau berbagi ilmu atau entah kenapa, saya kurang mengerti. Maka dari itu saya mencoba membuat aplikasi ini.

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  if (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=0x15 ;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=0x00;//PD0 belogika low atau dlm keadaan unlock awalnya
DDRD=0x01;//PD0 sebagai output

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// 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 bagi banyak orang, khususnya yang membutuhkan.

 
7 Comments

Posted by on April 30, 2011 in AVR Projects

 

Tags: , , ,

7 responses to “PENGUNCI PINTU (DOOR LOCK) BERPASSWORD MENGGUNAKAN KEYPAD DAN LCD DENGAN CODEVISION AVR

  1. sheila

    May 18, 2011 at 16:59

    mau tanya donk buat yang bagian lcd_putsf ko punya aku error semua ya ,thanks

     
    • ElectrO-cOntrOl

      May 20, 2011 at 15:16

      mungkin anda salah melakukan penulisan. Jika program anda copy paste dari program saya biasanya kesalahan terjadi pada penulisan “(petik dua).

       
  2. firdaus008

    June 22, 2011 at 03:54

    mas sya lg coba prgrm ini,, tp ko tulisan “ftoa” yg ad di void tampil_lcd dbca error mlu y mas?
    mang ftoa tu ap y? trz apakh temp tu adlh buffer??

    mohon pncerahanny donk mas,, lg btuh bgd neh bwt TA,,

     
    • ElectrO-cOntrOl Team

      June 22, 2011 at 13:53

      ftoa itu float to array yg digunakan untuk menampilkan sebuah variabel float ke bentuk array agar bisa ditampilkan ke LCD. dan penggunaan ftoa harus diikuti sebuah library stdlib.h
      betul sekali variabel temp adalah sebuah buffer atau RAm yang dipakai untuk menyimpan sementara sebuah variabel sebelum ditampilkan ke LCD
      sepertinya anda kurang menambahkan librari tersebut

       
  3. firdaus008

    June 25, 2011 at 17:01

    iy mas prgrmny udh jln,,
    tp ngmng2 array tu ap y mas?? mhon pnjelasanny,, maklum mas cz msh newbie bgd bkin prgrm,,hehee

     
  4. upied

    November 27, 2011 at 20:50

    makasih banget mas tulisannya…
    bermanfaat banget buat jadi referensi tugas akhir saiia…
    mohon bimbingannya yah mas..
    makasih….

     

Leave a comment