Sistem keamanan merupakan bagian sistem yang bertugas memberikan akses terhadap bagian-bagian yang dilindunginya. Jika unit yang dilindungi memiliki fungsi sangat vital yang hanya di boleh diakses oleh orang tertentu maka sistem keamanannya dibuat berlapis.
Infrastruktur sistem keamanan sudah sangat berkembang, beberapa yang sering digunakan pada aplikasi mikrokontroller diantaranya :
- Kata sandi dengan tombol/keypad/remot tv
- Kartu akses dengan RFID reader
- Sidik jari
- suara dengan voice recognition
Dalam perancangan dini menggunakan 2 lapis sistem keamanan yaitu kata sandi menggunakan keypad serta sidik jari.
Komponen yang digunakan:
- ATMega8535
- Keypad membrane 4×4
- Fingerprint dy50
- LCD I2c 16×2
- Solenoid doorlock
- Buzzer
Skema perancangan sistem keamanan berlapis (password dan fingerprint):
program code vision (cvavr) sistem keamanan menggunakan finger print dan keypad:
#include <mega8535.h> #include <stdbool.h> #include "fingerprint.h" #include "lcdi2c.h" // Declare your global variables here #define password "1234" #define pinBuzzer PORTD.3 #define pinKunci PORTD.2 char buf[10]; uint8_t respon; uint16_t timingFingerprintAktif; uint16_t i; char keypad; char keypadBuffer[10]; bool statusPassword; uint8_t keypadCnt; #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<DOR) // USART Receiver buffer #define RX_BUFFER_SIZE 20 char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE <= 256 unsigned char rx_wr_index=0,rx_rd_index=0; #else unsigned int rx_wr_index=0,rx_rd_index=0; #endif #if RX_BUFFER_SIZE < 256 unsigned char rx_counter=0; #else unsigned int rx_counter=0; #endif // This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow; // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index++]=data; #if RX_BUFFER_SIZE == 256 // special case for receiver buffer size=256 if (++rx_counter == 0) rx_buffer_overflow=1; #else if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; } #endif } } #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index++]; #if RX_BUFFER_SIZE != 256 if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #endif #asm("cli") --rx_counter; #asm("sei") return data; } #pragma used- #endif char scanning_keypad() { PORTB = 0b01111111; delay_ms(20); if(PINB.0 == 0){while(PINB.0 == 0);return 'A';} if(PINB.1 == 0){while(PINB.1 == 0);return 'B';} if(PINB.2 == 0){while(PINB.2 == 0);return 'C';} if(PINB.3 == 0){while(PINB.3 == 0);return 'D';} PORTB = 0b10111111; delay_ms(20); if(PINB.0 == 0){while(PINB.0 == 0);return '3';} if(PINB.1 == 0){while(PINB.1 == 0);return '6';} if(PINB.2 == 0){while(PINB.2 == 0);return '9';} if(PINB.3 == 0){while(PINB.3 == 0);return '#';} PORTB = 0b11011111; delay_ms(20); if(PINB.0 == 0){while(PINB.0 == 0);return '2';} if(PINB.1 == 0){while(PINB.1 == 0);return '5';} if(PINB.2 == 0){while(PINB.2 == 0);return '8';} if(PINB.3 == 0){while(PINB.3 == 0);return '0';} PORTB = 0b11101111; delay_ms(20); if(PINB.0 == 0){while(PINB.0 == 0);return '1';} if(PINB.1 == 0){while(PINB.1 == 0);return '4';} if(PINB.2 == 0){while(PINB.2 == 0);return '7';} if(PINB.3 == 0){while(PINB.3 == 0);return '*';} return 0; } // Standard Input/Output functions #include <stdio.h> void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (1<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (1<<PORTB3) | (1<<PORTB2) | (1<<PORTB1) | (1<<PORTB0); // Port C initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (1<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0); // State: Bit7=T Bit6=T Bit5=T Bit4=0 Bit3=T Bit2=T Bit1=T Bit0=T PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); // Port D initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (1<<DDD3) | (1<<DDD2) | (0<<DDD1) | (0<<DDD0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0 output: Disconnected TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (0<<CS01) | (0<<CS00); TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Disconnected // OC1B output: Disconnected // 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=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10); 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=0<<AS2; TCCR2=(0<<WGM20) | (0<<COM21) | (0<<COM20) | (0<<WGM21) | (0<<CS22) | (0<<CS21) | (0<<CS20); TCNT2=0x00; OCR2=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0); // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00); MCUCSR=(0<<ISC2); // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 57600 UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM); UCSRB=(1<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8); UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL); UBRRH=0x00; UBRRL=0x08; // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); SFIOR=(0<<ACME); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // SPI initialization // SPI disabled SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0); // TWI initialization // TWI disabled TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE); // Global enable interrupts #asm("sei") i2c_begin(); lcd_begin(0x27,16,2); // alamat lcd i2c lcd_clear(); lcd_puts("Sistem Keamanan"); lcd_gotoxy(0,1); lcd_puts("www.semesin.com"); delay_ms(3000); lcd_clear(); //rx_wr_index = 15; fingerPrintBegin((uint8_t*)&rx_buffer, &rx_wr_index); respon = checkPassword(); //sprintf(buf, "%2X", respon); lcd_gotoxy(0,0); lcd_puts("Akses terbatas "); delay_ms(2000); keypadCnt = 0; while (1) { // Place your code here while(1) { if(!statusPassword) { keypad = scanning_keypad(); if(keypad) { if(keypad == '#') { keypadBuffer[keypadCnt] = 0; lcd_clear(); lcd_gotoxy(0,0); if(strcmp(keypadBuffer, password) == 0) { statusPassword = 1; timingFingerprintAktif = 30000; lcd_puts("Tempel sidikjari"); } else { statusPassword = 0; lcd_puts("Password salah "); for(i=0;i<3;i++) { pinBuzzer = 1; delay_ms(1000); pinBuzzer = 0; delay_ms(1000); } lcd_clear(); lcd_puts("Akses terbatas "); } keypadCnt = 0; } if((keypad >= '0') &&(keypad <= '9')) { if(keypadCnt == 0) { lcd_gotoxy(0,0); lcd_puts("Password : "); } if(keypadCnt < 4) { lcd_gotoxy(keypadCnt,1); lcd_send_data(keypad); keypadBuffer[keypadCnt] = keypad; keypadCnt++; } } } } else { delay_ms(1); timingFingerprintAktif--; if(!timingFingerprintAktif) { statusPassword = 0; pinBuzzer = 1; delay_ms(1000); pinBuzzer = 0; lcd_clear(); lcd_puts("Panel "); } lcd_gotoxy(0,1); lcd_puts("Tempelkan jari "); respon = getImage(); if(respon != FINGERPRINT_OK) { break; } lcd_gotoxy(0,1); lcd_puts("Konversi gambar "); respon = image2Tz(1); if(respon != FINGERPRINT_OK) { break; } lcd_gotoxy(0,1); lcd_puts("Mencari id "); respon = fingerFastSearch(); if(respon != FINGERPRINT_OK) { break; } lcd_clear(); sprintf(buf, "id = %2d", fingerID); lcd_gotoxy(0,1); lcd_puts(buf); lcd_gotoxy(0,0); lcd_puts("Panel"); pinKunci = 1; delay_ms(5000); pinKunci = 0; } } } }
library: