Assalamualaikum Sahabat blogger,,
Masih semangat kan yah menginjak puasa hari ke tiga di bulan Ramadhan 1436H ini,,semoga puasa kita lancar dan afdol..
Ok baik,pada kesempatan kali ini saya akan share tentang bagaimana membuat pintu berpasword dengan Atmega32 dan dengan pemograman bahasa C pada software Code Vision AVR.
Ini dia Sob penampakan hardware nya :
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;
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:
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]
nilai=(nilai*10)+array[i]
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 konfigurasi nya pada software :
1.Konfigurasi IC mikrocontroller dan crystal
2.Konfigurasi PORTB sebagai Scanning Keypad 4x4
3.Konfigurasi PORT C.0 sebagai Output Solenoid Pengunci Pintu
4.Konfigurasi PORTD sebagai output ke LCD 16x2
/*****************************************************
Project : Pengunci pintu dengan pasword
Version : 1.0
Date : 6/21/2015
Author : REY
Company : http://elektronikasystem.blogspot.com/
Comments:
Chip type : ATmega32
Program type : Application
AVR Core Clock frequency: 12.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*****************************************************/
#include <mega32.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>
#include <alcd.h>
float nilai=0, password=2015;
char temp[12], array[10], i=0, indeks=0;
//variabel indeks digunakan untuk mendeteksi jika indeks=0 unlock, indeks=1 lock
void lock()
{
while (indeks==0)
{
lcd_gotoxy(0,0);
lcd_putsf("Tekan Tombol #");
lcd_gotoxy(0,1);
lcd_putsf("untuk mengunci");
PORTB = 0b11111011;
delay_ms(30);
if (PINB.7 == 0)
{
indeks=1;
PORTC.0=1;//terkunci
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Terkunci");
delay_ms(1000);
lcd_clear();
}
}
}
void enter()
{
if (nilai==password)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Terbuka");
delay_ms(1000);
i=0; nilai=0;
PORTC.0=0;//kunci terbuka
indeks=0;
}
else
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Password Salah !");
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("Masukan Pasword");
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)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=P State6=P State5=P State4=P State3=1 State2=1 State1=1 State0=1
PORTB=0xFF;
DDRB=0x0F;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0
PORTC=0x00;
DDRC=0x01;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 0
// RD - PORTD Bit 1
// EN - PORTD Bit 2
// D4 - PORTD Bit 4
// D5 - PORTD Bit 5
// D6 - PORTD Bit 6
// D7 - PORTD Bit 7
// Characters/line: 16
lcd_init(16);
lcd_putsf(" Pengunci Pintu Dgn Keypad 4x4");
delay_ms(1500);
lcd_clear();
while (1)
{
lock();
scanning_keypad();
tampil_lcd();
}
}
Konfigurasi hardware nya sebagai berikut :
Ok bro sekian terima kasih
Referensi tulisan : http://elektro-kontrol.blogspot.com/2011/06/pengunci-pintu-door-lock-berpassword.html
1 comments:
mas bagaimana caranya agar password yg kita inputkan di LCD nampil karakter bintang ???
Post a Comment