RFID and Bluetooth Door Lock

8,313

51

29

Introduction: RFID and Bluetooth Door Lock

Hi

This is my first Instructable and my first arduino project, I hope you will find it useful as well.

After looking through the projects on Instructables I could only find either a bluetooth door lock or a rfid door lock, not both so I decided to create one myself. Though the build is not totally complete I have tested it out properly and it does work without any problems.

I would first like to make clear that the 'Bluetooth app and the arduino code for reading bluetooth, and also the arduino code for reading the rfid' WAS NOT created by me. They have been sourced from other projects in Instructables. I would like to thank 'Taifur' for the Bluetooth app and code to go with it and apologise to the person who created the code for reading the RFID, as I have forgotten who it was.

16 April 2016 - New Arduino code and Fritzing diagram uploaded due to changes I have made to the originals.

Step 1: The Parts Needed

Parts required.

1 - Door Lock with Thumb Turn on the inside of the door

1 - Arduino Uno r3 (or compatible)

1 - 360 degree Servo

1 - HC-06 Bluetooth Module

1 - RC522 RFID Reader (Possbly Sintron, can not remember)

1 - 16 x 2 - 4 wire LDC screen

1 - RGB LED

2 - 220Ω Resistors

1 - Momentary Push Switch (to operate from the inside to lock/unlock the door)

1 - 10kΩ Resistor

2 - Double Back Boxes (1 approx 45mm depth and the other approx 33mm depth)

Jumper Wires

Power Supply ( I was going to use 2 x 9v batteries, but have decided to use mains powered 9v supply instead as more reliable)

Screws or strong double sided tape

1 - Servo Holder (I designed and printed my own)

** ----------------Waiting for delivery ---------------------------------------**

2 - Double Blanking Plates

1 - Length of 12 core alarm cable (length dependant on placement)

2 - 5amp Block Connectors (12 wires each)

** ---------------------------------------------------------------------------------**

Andriod Bluetooth Lock App. BTControl.apk

Step 2: The Wiring

Power:

9v Regulated Power Supply (or batteries)

RFID Reader:

VCC - Pin 3.3v

GND - GND

Reset (RST) - Pin D9

SDA(SS) - Pin D10

MOSI - Pin D11

MISO - Pin D12

SCK - Pin D13

LCD Screen:

VCC - 5v

GND - GND

SDA - Pin A4

SCL - Pin A5

Momentary Switch:

VCC - 5v (as shown above)

GND to 10kΩ resistor (as shown above)

Pin 8 arduino (as shown above)

RGB LED:

Pin D7 to 220Ω resistor then to LED pin (Red)

Pin D6 to 220Ω resistor then to LED pin (Green)

Common (the long wire) - GND

Servo:

VCC - 5v

GND - GND

Signal - Pin D5

Bluetooth Module:

VCC - 5v

GND -GND

TX - D0 (RX)

RX - D1 (TX)

Fritzing Diagram:

Step 3: Putting It All Together

The Arduino, Bluetooth Module and Momentary Switch + RGB Led circuit fits into the 45mm Back Box. I have just used Blu-Tac to hold them in place as they will not be moved once fixed to the wall. I have soldered the switch, led and resistors to a circuit board along with creating a GND and VCC connections on either side of the circuit board, a Block Connector will also be placed in for the 12 Core Alarm Cable to connect the RFID and LCD Screen to the arduino. The lid will get 2 holes drilled in it to accommodate the switch and led.

The RFID and LCD Screen fits within the 33mm Back Box with a slot cut out for the LCD Screen to fit through. These will the be wired to the arduino with the 12 Core Alarm Cable and Block Connector.

For the Servo to connect to the door lock I 3D printed a holder to be screwed to the door and attached to the door lock.

Step 4: The Code - (Updated on 12 October 2020) - Also New File Uploaded.

/*
 * ----------------------------------------------------------------------------
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno           Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 *
 */
 
#include <SPI.h>
#include <Servo.h>
#include <MFRC522.h>
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10

#define Green_LED 6       //pin for green "door unlocked" indicator LED
#define Red_LED 7         //pin for red "door locked" indicator LED

String inputString = "";
String command = "";
String value = "";
String password = "password"; // this is the password for opening and closing your door by Bluetooth
                            // you can set any pasword you like using digit and symbols
boolean stringComplete = false; 

char array1[]="Swipe To Unlock";  // the string to print on the LCD
char array2[]="  Door Locked  ";
char array3[]=" Door Unlocked ";
char array4[]="   Locking     ";
char array5[]="  Unlocking    ";
char array6[]="   Accepted    "; 
char array7[]=" Swipe To Lock ";
int tim = 1;  //the value of delay time

// initialize the library with the numbers of the interface pins
LiquidCrystal_I2C lcd(0x3F,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line 

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
Servo myservo;

String read_rfid; // RFID tags ID
String ok_rfid_1="c6ecd82b";
String ok_rfid_2="f5642a50";
String ok_rfid_3="4314622993c81";
// String ok_rfid_4="43ef222993c81";


int addr = 1; // initalise eeprom address 
int eVal = 0; // initalise value to be stored in eeprom
int lockPosition; // initialise lockPosition, used to value to sore in eVal
int servo_position;    
int BUTTON1 = 8; // initialise the pin input of the lock/unlock button


void setup() {
  Serial.begin(9600);         // Initialize serial communications with the PC
  while (!Serial);
  SPI.begin();
  mfrc522.PCD_Init();

  inputString.reserve(50);  // reserve 50 bytes in memory to save for string manipulation 
  command.reserve(50);
  value.reserve(50);
  boolean stringOK = false;

  {
  lcd.init();  //initialize the lcd
  lcd.backlight();  //open the backlight 
  lcd.begin(16,2);
  }
    
  // sets pin modes input/output and lights led 
  pinMode(Green_LED, OUTPUT);
  pinMode(Red_LED, OUTPUT);
  digitalWrite(Green_LED, LOW);
  digitalWrite(Red_LED, HIGH);
  pinMode(BUTTON1,INPUT);

  myservo.attach(5); // servo pin number

  // sets initial locl position
  lockPosition = EEPROM.read(1);
//  Serial.print(EEPROM.read(1));
  if(lockPosition == 1){
    digitalWrite(Red_LED, LOW);
    digitalWrite(Green_LED, HIGH);
  }
  else {
    digitalWrite(Red_LED, HIGH);
    digitalWrite(Green_LED, LOW);       
    lockUnlock();
  }
    swipeText();

}

/*
 * Dump a byte array as hex values to Serial.
 */
void dump_byte_array(byte *buffer, byte bufferSize) {
    read_rfid="";
    for (byte i = 0; i < bufferSize; i++) {
        read_rfid=read_rfid + String(buffer[i], HEX);
    }
}

void lockUnlock() { // locks or unlocks door

    myservo.attach(5); 
    if(lockPosition == 1) {
      lock1();
      servo_position = 0;
      myservo.write(servo_position);
      digitalWrite(Red_LED, HIGH);
      digitalWrite(Green_LED, LOW);      
      delay(2500);
      lockPosition = 2;
      eVal = lockPosition;      
      EEPROM.write(1,eVal);
//      Serial.print(eVal);
      
      } 
      else if(lockPosition == 2) {
        lock2();
        servo_position = 180;
        myservo.write(servo_position);     
        digitalWrite(Red_LED, LOW);
        digitalWrite(Green_LED, HIGH);        
        delay(2500);
        lockPosition = 1;
        eVal = lockPosition;      
        EEPROM.write(1,eVal);
//        Serial.print(eVal);  
      }  
      myservo.detach();    
}

void swipeText() // sends text to the lcd screen
{
  if(lockPosition == 1){ 
    lcd.clear();  //Clears the LCD screen and positions the cursor in the upper-left corner.
    lcd.setCursor(0,0);  // set the cursor to column 15, line 0
    for (int positionCounter1 = 0; positionCounter1 < 15; positionCounter1++)
    {
      lcd.print(array3[positionCounter1]);  // Print a message to the LCD.
      delay(tim);  //wait for 250 microseconds
    }
    lcd.setCursor(0,1);  // set the cursor to column 15, line 1
    for (int positionCounter = 0; positionCounter < 15; positionCounter++)
    {
      lcd.print(array7[positionCounter]);  // Print a message to the LCD.
      delay(tim);  //wait for 250 microseconds
    } 
  }
  else if(lockPosition == 2){
    lcd.clear();  //Clears the LCD screen and positions the cursor in the upper-left corner.
    lcd.setCursor(0,0);  // set the cursor to column 15, line 0
    for (int positionCounter1 = 0; positionCounter1 < 15; positionCounter1++)
    {
      lcd.print(array2[positionCounter1]);  // Print a message to the LCD.
      delay(tim);  //wait for 250 microseconds  
    }
    lcd.setCursor(0,1);  // set the cursor to column 15, line 1
    for (int positionCounter = 0; positionCounter < 15; positionCounter++)
    {
      lcd.print(array1[positionCounter]);  // Print a message to the LCD.
      delay(tim);  //wait for 250 microseconds
    }  
  }
}

void lock1() // sends text to the lcd screen locking
{
  lcd.clear();
    lcd.setCursor(0,0);
  for (int positionCounter1 = 0; positionCounter1 < 15; positionCounter1++)
  {
    lcd.print(array6[positionCounter1]);
    delay(tim);
  }
  lcd.setCursor(0,1);
  for (int positionCounter1 = 0; positionCounter1 < 10; positionCounter1++)
  {
    lcd.print(array4[positionCounter1]);
    delay(tim);
  }  
}

void lock2() // sends text to the lcd screen for unlocking
{
  lcd.clear();
  lcd.setCursor(0,0);
  for (int positionCounter1 = 0; positionCounter1 < 15; positionCounter1++)
  {
    lcd.print(array6[positionCounter1]);
    delay(tim);
  }
  lcd.setCursor(0,1);
  for (int positionCounter1 = 0; positionCounter1 < 12; positionCounter1++)
  {
    lcd.print(array5[positionCounter1]);
    delay(tim);
  }  
}

void loop() {
    
    // checks for lock/unlock button press
    if(digitalRead(BUTTON1) == HIGH){
      lockUnlock();
      swipeText();
    }

  // checks if bluetooth has sent a command
  // if arduino receive a string termination character like \n stringComplete will set to true
  if (stringComplete) {
    //Serial.println(inputString);
    delay(100);
    // identified the posiion of '=' in string and set its index to pos variable
    int pos = inputString.indexOf('=');
    // value of pos variable > or = 0 means '=' present in received string.
    if (pos > -1) {
      // substring(start, stop) function cut a specific portion of string from start to stop
      // here command will be the portion of received string till '='
      // let received string is open=test123
      // then command is 'open' 
        command = inputString.substring(0, pos);
      // value will be from after = to newline command
      // for the above example value is test123
      // we just ignoreing the '=' taking first parameter of substring as 'pos+1'
      // we are using '=' as a separator between command and vale
      // without '=' any other character can be used
      // we are using = menas our command or password must not contains any '=', otherwise it will cause error 
        value = inputString.substring(pos+1, inputString.length()-1);  // extract command up to \n exluded
        //Serial.println(command);
        //Serial.println(value);

       // checks password from bluetooth and is correct locks or unlocks the door
       // password.compareTo(value) compare between password tring and value string, if match return 0 
    if(!password.compareTo(value) && (command == "OPEN")){
          // if password matched and command is 'OPEN' than door should open
           lockUnlock(); // call lockUnlock() function
           Serial.println(" OPEN"); // sent open feedback to phone
           delay(100);
           swipeText();
           }
    if(!password.compareTo(value) && (command == "CLOSE")){
          // if password matched and command is 'CLOSE' than door should close
           lockUnlock();
           Serial.println(" CLOSE"); // sent " CLOSE" string to the phone 
           delay(100);
           swipeText();
           }
    if(password.compareTo(value)){
          // if password not matched than sent wrong feedback to phone
           Serial.println(" WRONG");
           delay(100);
           swipeText();
           } 
        } 
       // clear the string for next iteration
       inputString = "";
       stringComplete = false;
    }

    // looks for rfid tag to be presented
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;

    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    
    // checks if an rfid tags ID matches the stored list, if so it will then lock or unlock the door
    Serial.println(read_rfid);
    if (read_rfid==ok_rfid_1) {
      //ok, open the door.
      lockUnlock();
      swipeText();      
    }
    //Add below as many "keys" as you want
    if (read_rfid==ok_rfid_2) {
      //also ok, open the door
      lockUnlock();
      swipeText();      
    }
        //Add below as many "keys" as you want
    if (read_rfid==ok_rfid_3) {
      //also ok, open the door
      lockUnlock();
      swipeText();
    }
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read(); 
    //Serial.write(inChar);
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline or a carriage return, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n' || inChar == '\r') {
      stringComplete = true;
    } 
  }
}

Step 5:

Be the First to Share

    Recommendations

    • Make it Glow Contest

      Make it Glow Contest
    • First Time Author Contest

      First Time Author Contest
    • PCB Challenge

      PCB Challenge

    29 Discussions

    1
    Tutul221
    Tutul221

    4 months ago

    Hello, I'm tying to make the project for my personal room. I have followed all the instructions as you guide. But when I insert the code Arduino IDE showing "MFRC522.h: No such file or directory" massage. Please see the attached picture and help me. Thanks

    IMG_20200926_004409.jpg
    0
    Tutul221
    Tutul221

    Reply 3 months ago

    Hi, I got the lcd and connected as you guided. But now I’m facing a new problem. When I insert the code,Arduino showing “Redefinition of void setup” please see the attached picture. Please help me to fix the problem. I’m really excited to complete the project. Waiting for your response. Thanks

    232D2D90-BFD8-42A8-A57E-A3827F0D4205.png
    0
    trekprint
    trekprint

    Reply 3 months ago

    Can you please send me a copy of the code you are trying to upload to the arduino. The exactly the same as you are trying to upload.

    Copy code from arduino software to a text file and send that.

    Thanks

    0
    Tutul221
    Tutul221

    Reply 3 months ago

    Hi,
    I download your updated code and used directly without any changes. Please see the attached text file and help me.

    0
    trekprint
    trekprint

    Reply 3 months ago

    Will look at it within the next couple of days. Having to wipe pc, once up and running will let you know

    thanks

    0
    Tutul221
    Tutul221

    Reply 3 months ago

    Sure. I’ll wait for your reply.
    Thanks.

    0
    trekprint
    trekprint

    Reply 3 months ago

    Hello Again

    Do you live in the UK. Are you using a Mac or Windows computer. What board are you trying to upload to.

    0
    Tutul221
    Tutul221

    Reply 3 months ago


    Hi. I’m from Bangladesh. I’m using Mac. And my board is Arduino uno.

    0
    trekprint
    trekprint

    Reply 3 months ago

    Hi again

    I have just tested on my Mac and everything is fine on that.

    I have an idea for you to try.

    Send me your email address and I will send a link for you to download a zip (compressed) file, this has the latest Arduino software, the sketch file and all my libraries, plus a text file called instructions - this outlines what I think will be the best way to sort this out (hopefully).

    Download the zip file and un-compress to your desktop, the follow instructions in the text file.



    0
    Tutul221
    Tutul221

    Reply 3 months ago

    Great..you are awesome. I’m really thankful. Here is my email.
    nasirul.pfi@gmail.com
    I’ll update you accordingly. Thanks

    0
    trekprint
    trekprint

    Reply 3 months ago

    Email with link has been sent. Good luck.

    Nick

    0
    Tutul221
    Tutul221

    Reply 3 months ago

    Hi Nick,
    Hope you’re fine and safe.

    Sketch has uploaded without any problem. But below issues are happening..
    1) lcd showing nothing (blank)(please see the attached picture)
    2) momentary switch not working.( I attached a momentary switch diagram.which I understand from your diagram. please advise it’s ok or not)
    3) RFID tag read perfectly but cannot activate the relay module.
    4) Bluetooth module connected with BTcontrol android app. but cannot activate the relay module.
    I’m using a 5volt relay module instead of a servo to use solenoid lock. Is there any chance to not working all the things to using the relay module instead of servo?

    Please help me.

    Thanks & regard
    Tutul
    WhatsApp Image 2020-10-08 at 11.49.52 AM (2).jpegWhatsApp Image 2020-10-08 at 1.44.40 PM.jpegWhatsApp Image 2020-10-08 at 11.49.52 AM.jpegWhatsApp Image 2020-10-08 at 11.49.52 AM (3).jpeg
    0
    trekprint
    trekprint

    Reply 3 months ago

    Time in the UK is 17:00 now. Will send link tonight UK time once finished sorting my PC.

    0
    trekprint
    trekprint

    Reply 3 months ago

    Hello again

    Do you live in the UK. Are you using a Mac or Windows computer. What board are you trying to upload to

    0
    Tutul221
    Tutul221

    Reply 3 months ago

    Hi. I’m from Bangladesh. I’m using Mac. And my board is Arduino uno.

    0
    trekprint
    trekprint

    Reply 3 months ago

    hi

    I have tested the code you sent me on my PC and it is fine and uploaded to arduino uno without problem. wiill test it on my mac to see if it works on that first. if not will figure out why.

    0
    trekprint
    trekprint

    Reply 3 months ago

    Hi

    It sounds as if you do not have the MFRC522 Libraries installed, you can get these from "git hub". Do a search for MFRC522. Also new code has been uploaded, which you can download.

    0
    Tutul221
    Tutul221

    Reply 3 months ago

    Hello...please help me

    0
    Tutul221
    Tutul221

    Reply 3 months ago

    Thank you so much. You’re awesome. Another thing, I didn’t Find the lcd screen in market. Can I run the project without lcd? If yes than what should be the code. Please help.

    Thanks once again