Monday, June 8, 2015

Password based door locking system

Password based door locking system, uses Matrix keypad to enter the password, This project is extended to operate on IR Remote RC-604, In this project all required data is given Circuit diagram, C code, PCB design and All related data, This project is based on AVR Atmega8 Microcontroller.

Features:
1. You can enter password through Keypad or IR Remote
2. Low Cost
3. Simple to design
4. Operates Two relays One for Buzzer and Another for Operating Motor

Passward based security system circuit diagram

IR Remote Used For This Project (It is optional to use remote)
IR Remote for passward based access system
Step 1: Major Components Required
1. Atmega 8 Microcontroller
2. Relays, Switches
3. 4x3 Keypad Matrix
4. LM7805
5. BC548
6. 16x2 LCD Display

Step 2: Circuit Design and PCB Manufacturing
Download Requires Files
1. Download Proteus Simulation Circuit Diagram (you can try proteus simulation of this project)
2. Download pdf PCB Layout
PCB Layout for passward based access system


3. Assemble components using above files.

Step 3: Programming the controller
Download Complete Project Zip File

AVR Studio C Code

#include <avr/io.h>
#include <string.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include "remote.h"

unsigned char u8_data;

//LCD connections 

#define E   PD7
#define RS   PB0

#define Relay PB3  //Relay1
#define Relay1 PB4  //Relay1

//Decleration
void display(char string[16]);
void displaybyte(char D);
void dispinit(void);
void cleardisplay(void);
void line1(void);
void line2(void);
void epulse(void);
void delay_ms(unsigned int de);
void PasswordNotOK();
void PasswordNotOK1();
char KeyCheck();

char mystr[6];
char Password[3];

int main(void)
{ 
 DDRB = 0b00011011; //LCD port direction
 DDRD = 0b11011001; //LCD port direction
 DDRC = 0b00011010;  //Key Pad

 PORTC= 0b11111111;  //Activate internal pullups for keypad
 PORTD |=(1<<PD1); 

// PORTB |=(1<<Relay); 
 
  delay_ms(500);  //Initiaize LCD
  dispinit();
  delay_ms(200);


 line1();
 uint8_t cmd=0;
 RemoteInit();

 display("    Password    ");
 line2(); 
 display("     Access     ");
 cleardisplay();
 line1();
 char Key,cnt;
 cnt=0;
 Key=KeyCheck();
 if(Key==11)
 {
//Get Old Password
line1();
display("Enter Old Pass: ");
line2();
cnt=0;
   while(1)
   {

    Key = KeyCheck();
    //cmd=GetRemoteCmd(0);
    //displaybyte(cmd+48);
        

     delay_ms(100);

     if((Key != 15) && (cnt<4) && (Key !=11) && (Key !=12))
     {
    //line1();
    //displaybyte(Key+48); //Display Passsword
     displaybyte(0x2A); //"*" Display '*' Instead of password

    Password[cnt]=Key;
    cnt++;
     }
     
     if(Key==11) //Cancel Key
     {
      cnt=0;
    PasswordNotOK1();
     }
     if(((Key !=15)) && (cnt==4))
     {
       if(Key==12) //OK Key
     {
      //Verify password
     if(eeprom_read_byte((uint8_t*)4)==Password[0])
       {
          if(eeprom_read_byte((uint8_t*)5)==Password[1])
       {
       if(eeprom_read_byte((uint8_t*)6)==Password[2])
       {
        if(eeprom_read_byte((uint8_t*)7)==Password[3])
        {
         //PasswordOK
           cleardisplay();
           line1();
           display("  Enter New   ");
           line2();
           display("Password:");

            while(1)
            {
             Key = KeyCheck();
             delay_ms(100);
              if((Key != 15) && (cnt<4))
              {
             //line1();
             displaybyte(Key+48);
             Password[cnt]=Key;
             cnt++;
              }
              if((Key !=15) && (cnt==4))
              {
                if(Key==12) //OK Key
              {
               cleardisplay();
              line1();
              display("Password Changed");
              eeprom_write_byte((uint8_t*)4,Password[0]);
              eeprom_write_byte((uint8_t*)5,Password[1]);
              eeprom_write_byte((uint8_t*)6,Password[2]);
              eeprom_write_byte((uint8_t*)7,Password[3]);
              delay_ms(2000);
              cleardisplay();
              break;
              }
                 if(Key==11) //Cancel Key
              {
               cleardisplay();
              break;
              }

              }
            }

          //}
         //=========
          cleardisplay();
          line1();
          display("Enter Password:");
          line2();
          cnt=0;
        }
        else
        {
         cnt=0;
         //PORTB |= (1<<Relay1);
         PasswordNotOK1();
        }
       }
       else
       {
        cnt=0;
        //PORTB |= (1<<Relay1);
        PasswordNotOK1();
       }
       }
       else
       {
        cnt=0;
       //PORTB |= (1<<Relay1);
        PasswordNotOK1();
       }
       }
       else
       {
        cnt=0;
      //PORTB |= (1<<Relay1);
         PasswordNotOK1();
       }

     }
        if(Key==11) //Cancel Key
     {
      cleardisplay();
     line1();
     display("Enter Old Pass: ");
     line2();
     cnt=0;
     }

     }
   }
   }

//----------------


line1();
display("Enter Password:");
line2();
cnt=0;
   while(1)
   {

    Key = KeyCheck();
    cmd=GetRemoteCmd(0);
    //displaybyte(cmd+48);
        

    delay_ms(100);
     if((cnt<4) && (cmd !=10) && (cmd !=25) && (cmd !=255))
     {
    //line1();
    //displaybyte(cmd+48);
    displaybyte(0x2A); //"*"
    Password[cnt]=cmd;
    cnt++;
     }

     if((Key != 15) && (cnt<4) && (Key !=11) && (Key !=12))
     {
    //line1();
    //displaybyte(Key+48);
     displaybyte(0x2A); //"*"

    Password[cnt]=Key;
    cnt++;
     }
     if(Key==11 || cmd==10) //Cancel Key
     {
      cnt=0;
    PasswordNotOK();
     }
     if(((Key !=15) || (cmd==25)) && (cnt==4))
     {
       if(Key==12 || cmd==25) //OK Key
     {
      //Verify password
     if(eeprom_read_byte((uint8_t*)4)==Password[0])
       {
          if(eeprom_read_byte((uint8_t*)5)==Password[1])
       {
       if(eeprom_read_byte((uint8_t*)6)==Password[2])
       {
        if(eeprom_read_byte((uint8_t*)7)==Password[3])
        {
         //PasswordOK
          cleardisplay();
          PORTB |=(1<<Relay);
          line1();
          display("Open The Door");
          delay_ms(4000);
          cleardisplay();
          //Operate Relay
          PORTB &=~(1<<Relay);
          line1();
          display("Enter Password:");
          line2();
          cnt=0;
        }
        else
        {
         cnt=0;
         PORTB |= (1<<Relay1);
         PasswordNotOK();
        }
       }
       else
       {
        cnt=0;
        PORTB |= (1<<Relay1);
        PasswordNotOK();
       }
       }
       else
       {
        cnt=0;
       PORTB |= (1<<Relay1);
        PasswordNotOK();
       }
       }
       else
       {
        cnt=0;
      PORTB |= (1<<Relay1);
         PasswordNotOK();
       }

     }
        if(Key==11) //Cancel Key
     {
      cleardisplay();
     line1();
     display("Enter Password:");
     line2();
     cnt=0;
     }

     }
   }
}

void PasswordNotOK()
{
 cleardisplay();
 line1();
 display("   Incorrect  ");
 line2();
 display("   Password   ");
 delay_ms(2000);
 cleardisplay();
 line1();
 display("Enter Password:");
 line2();
 PORTB &=~ (1<<Relay1);
}

void PasswordNotOK1()
{
 cleardisplay();
 line1();
 display("   Incorrect  ");
 line2();
 display("   Password   ");
 delay_ms(2000);
 cleardisplay();
 line1();
 display("Enter Old Pass: ");
 line2();
}

char KeyCheck()
{
char KeyCode;
 KeyCode=15;

//Scan 1
 PORTC &=~(1<<PC1);
 PORTC |=(1<<PC3);
 PORTC |=(1<<PC4);
 PORTD |=(1<<PD0);
   
    if((PIND & 0x02)==0x00)
  {
   KeyCode=3;
      while((PIND & 0x02)==0x00);
  } 
    if((PINC & 0x04)==0x00)
  {
   KeyCode=2;
   while((PINC & 0x04)==0x00);
  } 
    if((PINC & 0x20)==0x00)
  {
   KeyCode=1;
   while((PINC & 0x20)==0x00);
  } 
//Scan 2
 PORTC |=(1<<PC1);
 PORTC &=~(1<<PC3);
 PORTC |=(1<<PC4);
 PORTD |=(1<<PD0);
   
    if((PIND & 0x02)==0x00)
  {
   KeyCode=6;
   while((PIND & 0x02)==0x00);
  } 
    if((PINC & 0x04)==0x00)
  {
   KeyCode=5;
   while((PINC & 0x04)==0x00);
  } 
    if((PINC & 0x20)==0x00)
  {
   KeyCode=4;
   while((PINC & 0x20)==0x00);
  } 
//Scan 3
 PORTC |=(1<<PC1);
 PORTC |=(1<<PC3);
 PORTC &=~(1<<PC4);
 PORTD |=(1<<PD0);
   
    if((PIND & 0x02)==0x00)
  {
   KeyCode=9;
   while((PIND & 0x02)==0x00);
  } 
    if((PINC & 0x04)==0x00)
  {
   KeyCode=8;
   while((PINC & 0x04)==0x00);
  } 
    if((PINC & 0x20)==0x00)
  {
   KeyCode=7;
   while((PINC & 0x20)==0x00);
  } 
//Scan 4
 PORTC |=(1<<PC1);
 PORTC |=(1<<PC3);
 PORTC |=(1<<PC4);
 PORTD &=~(1<<PD0);
   
    if((PIND & 0x02)==0x00)
  {
   KeyCode=12;
   while((PIND & 0x02)==0x00);
  } 
    if((PINC & 0x04)==0x00)
  {
   KeyCode=0;
   while((PINC & 0x04)==0x00);
  } 
    if((PINC & 0x20)==0x00)
  {
   KeyCode=11;
   while((PINC & 0x20)==0x00);
  } 

 return KeyCode;
}

void display(char string[16])
{
 int len,count;
  len = strlen(string);

   for (count=0;count<len;count++)
  {
    displaybyte(string[count]);
 }
}


void displaybyte(char D)
{
  char D1;
  D1=D;
  D1=D1 & 0xF0;
  D1=D1 >> 4;  //Send MSB
  
  PORTD = PORTD & (0b10100011);
  PORTB = PORTB & (0b11111101);

  PORTD |= ((D1 & 0x01) << 6);
  //PORTD |= ((D1 & 0x02) << 1);
  PORTB |= ((D1 & 0x02)); 
  PORTD |= ((D1 & 0x04) << 2);
  PORTD |= (D1 & 0x08);
  
 epulse();

  D1=D;
  D1=D1 & 0x0F;  //Send LSB

  PORTD = PORTD & (0b10100011);
  PORTB = PORTB & (0b11111101);

  PORTD |= ((D1 & 0x01) << 6);
  //PORTD |= ((D1 & 0x02) << 1);
  PORTB |= ((D1 & 0x02));
  PORTD |= ((D1 & 0x04) << 2);
  PORTD |= (D1 & 0x08);
 
 epulse();
}


void dispinit(void)
{
 int count;
 char init[]={0x43,0x03,0x03,0x02,0x28,0x01,0x0C,0x06,0x02,0x02};
  
 PORTB &= ~(1<<RS);           // RS=0
 for (count = 0; count <= 9; count++)
  {
 displaybyte(init[count]);
  }
 PORTB |= 1<<RS;    //RS=1
}


void cleardisplay(void)
{
 PORTB &= ~(1<<RS);           // RS=0
    displaybyte(0x01);
 PORTB |= 1<<RS;    //RS=1
}

void line1(void)
{
 PORTB &= ~(1<<RS);           // RS=0
    displaybyte(0x80);
 PORTB |= 1<<RS;    //RS=1
}

void line2(void)
{
 PORTB &= ~(1<<RS);           // RS=0
    displaybyte(0xC0);
 PORTB |= 1<<RS;    //RS=1
}

void epulse(void)
{
 PORTD |= 1<<E;
  delay_ms(1);
 PORTD &= ~(1<<E);
 delay_ms(1);
}

void delay_ms(unsigned int de)
{
unsigned int rr,rr1;
   for (rr=0;rr<de;rr++)
   {
  
  for(rr1=0;rr1<700;rr1++)   //395
  {
   asm("nop");
  }
   
   }
}

Step 5: Test the code and Hardware
1. Follow us on Google+
2. You Did it Yourself
3. Refer Tutorials from this site for more understanding of code and Circuits
4. Please comment if you have any trouble, Its Tested code

4 comments:

  1. hello
    what is a password ???to open,,

    ReplyDelete
  2. can i get the old password? it will be very helpful for me.

    ReplyDelete
  3. You need to enter Password in EEPROM at location 4,5,6,7
    eeprom_write_byte((uint8_t*)4,Password[0]);
    eeprom_write_byte((uint8_t*)5,Password[1]);
    eeprom_write_byte((uint8_t*)6,Password[2]);
    eeprom_write_byte((uint8_t*)7,Password[3]);

    ReplyDelete