Introduction: Arduino & Android Based Bluetooth Control Password Protected Door Lock (Version 2)

I published an instructable on Arduino & Android based DIY smart lock which can be open and closed using password sent from Android smartphone over Bluetooth two years back. The instructable become very popular and I got lots of email from the community. Now, I am going to publish an updated version of my door lock and the lock is fully 3D printed.

This smart Lock is the secure, simple, and easy to manage your home’s lock. This lock needs no keys and the lock is attached inside the door and you can control it from outside the door using Bluetooth. As the lock is inside the door there is no way to break the door by a thief. An android application is required to open and close the lock and I will explain the details how you can develop an android app in the later part of the tutorial. A password is sent to the lock using Android app and if the password is matched to your preset-lock password then the lock will be open and sent a feedback to your phone like the lock is open.

Step 1: Shopping List

1.Arduino Uno ( gearbest.com)1pc
2.Bluetooth module (HC-05) ( gearbest.com)1pc
3.Door Lock (3D Printed)1pc
4.Servo Motor (9g Micro Servo) ( gearbest.com)1pc
5.Android Smartphone 1pc
6.Screw
6pcs
7.Jumper Wires

Tools Required

1. 3D Printer ( Anet A8 from gearbest.com) : You can get this DIY Kit from gearbest.com at only $150. This is really an excellent printer at very low cost. Currently, they are giving 47% discount on this 3D printer kit. I am using the printer for four months and I am very happy with the performance of the printer. All the printing parts used here are printed by Anet A8.

2. Screw Driver

Arduino Uno: Arduino Uno is the most popular development board in Arduino family. It is not mandatory to use arduino uno, you can use another member from the arduino family such as arduino nano or arduino micro. You can also use standalone atmega328p without using arduino baord. A well explain tutorial "From Arduino to a Microcontroller on a Breadboard" for standalone atmega microcontroller is here.

Bluetooth Module (HC-05): Bluetooth is a type of wireless communication used to transmit voice and data at high speeds using radio waves. It’s widely used in mobile phones for making calls, headset and share data. This type of communication is a cheap and easy way to control something remotely using arduino. For communication with arduino using blutooth a bluetooth module need to be connected with arduino. Several model of bluetooth module are available. I am using here HC-05 a very common and cheap one. HC-05 module has 6 pins. We have to connect 4 pins to arduino, they are:

RXD

TXD

VCC

GND

RXD will receive data from arduino; TXD will send data to arduino; VCC is the power supply (3.3V to 6.6V) and GND is the ground. For details click here .

Micro Servo SG90: Tiny and lightweight with high output power. Servo can rotate approximately 180 degrees (90 in each direction), and works just like the standard kinds but smaller. You can use any servo code, hardware or library to control these servos.

Step 2: Door Lock 3D Design

All the parts of the lock are 3D printed. I would like to thanks, Thingiverse user ridercz for his nice design. He designed and published this servo based door lock in thingiverse.com. All the files except Rack_Holder.stl are taken from his design. You can download the files from below or from Thingiverse.com.

Some files have LT version. Light version required less PLA compare to normal version and has less strength. I printed LT version and working good. I used Anet A8 for printing all the parts. Photos of the printed parts are attached.

Step 3: Assembling 3D Printed Parts

Assemble all the printed parts one by one as shown in the photos. You may also follow the video instruction attached in the first step. After assembling use four screws to tightly fix all the parts.

Step 4: Arduino Program for Bluetooth Control Password Protected Door Lock

The code for bluetooth control smart door lock is very simple. I have designed android application in such that it sent a command with the password. Actually I set two command, one is "OPEN=" and another is "CLOSE=" and password may contain any digit, later or symbol or combination of them as you like. In the app I used two buttons one for open the door and another for closing the door. When password is given to password box and open button is clicked than app joint the "OPEN=" command with the password and sent it to arduino. I add '=' sign with command for that I will separate command and password by using this '=' . After receiving the string from phone arduino program separates command and password from the receive string and save them into two separate variables. Then check the password first, if password matched with saved password then open the door for "OPEN" command, and close the door for "CLOSE" command. "=" helps to separate command and password. Complete arduino sketch is given below.

Complete Arduino Code

<code style="display:block;white-space:pre-wrap;color:green">
/* Athor: Md. Khairul Alam
   Date: 1 September, 2015
   This program is for password protected smart door lock */
#include 

Servo myservo;  // create servo object to control a servo

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

void setup(){
  //start serial connection
  Serial.begin(9600);  // baud rate is 9600 must match with bluetooth 
  //The String reserve() function allows you to allocate a buffer in memory for manipulating strings.
  inputString.reserve(50);  // reserve 50 bytes in memory to save for string manipulation 
  command.reserve(50);
  value.reserve(50);
  
  boolean stringOK = false;
  
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  
}

void loop(){
  // 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);
       
       // 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
           openDoor(); // call openDoor() function
           Serial.println(" OPEN"); // sent open feedback to phone
           delay(100);
           }
    else if(!password.compareTo(value) && (command == "CLOSE")){
          // if password matched and command is 'CLOSE' than door should close
           closeDoor();
           Serial.println(" CLOSE"); // sent " CLOSE" string to the phone 
           delay(100);
           }
    else if(password.compareTo(value)){
          // if password not matched than sent wrong feedback to phone
           Serial.println(" WRONG");
           delay(100);
           } 
        } 
       // clear the string for next iteration
       inputString = "";
       stringComplete = false;
    }
   
}


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;
    } 
  }
}

void openDoor(){
  myservo.write(0); //place servo knob at 0 degree
  delay(100);   
}

void closeDoor(){
  myservo.write(65); //place servo knob at 65 degree to fully closed the lock
  delay(100); 
}

If arduino received wrong password then it sent a message to the android phone that the password is wrong. Actually arduino sent " WRONG" string. Android program then shows wrong password message.

Step 5: Schematic

The connection between the components is very simple. First, connect Bluetooth module HC-05 to the Arduino. Note the schematic. TX pin of the Arduino board is connected to the RX pin of Bluetooth module and RX pin of the Arduino is connected to the TX pin of the Bluetooth module.

Connection between Arduino and HC-05 Bluetooth module:

ArduinoHC-05 Module
TXRX
RXTX
5VVCC
GNDGND

Servo Motor Connection:

Arduino Servo Motor
D9 Signal (Yellow)
5VVCC (Red)
GNDGND (Brown)

Step 6: Setting the Lock to the Door

I hope you programmed your Arduino board with the sketch attached in the previous step and you already tested all the connection according to the schematic. If you completed all the steps then it is the high time to place the lock in the appropriate place of the door. First, place the lock with four screws. Then, fix the Bluetooth module at the right place of the lock and add some hot glue to tightly adjust the module with the lock. After that, place the Arduino board to the bottom side of the lock and connect all the wires according to the schematic. After placing the lock and making the connections you should power up the lock. I used a 5V, 1A wall adapter to provide the power to the circuit.

Step 7: Android App Development for Password Protected Door Lock

I will show you how to develop an Bluetooth android application using MIT App Inventor. I am using App Inventor because it does't required any coding and no software installation. You only need a google account. Go to http://ai2.appinventor.mit.edu/, you will ask to log in using google account.

Log in to App Inventor using gmail and follow the steps below.

iAccept terms & conditionsimage 1
iiClick 'take survey later' and then 'continue' to dismiss the splash screenimage 2, 3
iiiStart a new project (no spaces!)image 4
ivName the project "BluetoothControlDoorLock" (no spaces!)image 5

You are now in the Designer, where you lay out the "user interface" of your app (image 6). The Designer Window is where you lay out look and feel of your app, and specify what functionalities it should have. You choose things for the user interface things like Buttons, Image, Label, Text boxes, and functionalities like Text-to-Speech, Bluetooth, Sensors, and GPS.

Now, follow the figure 7 and add a List Picker to the viewer. Rename it to "Connect to Bluetooth Device" (image 8). Add one Label, one Password Text Box, and two buttons shown in figure 10. Change the text properties of the components as "Enter Password", "Open Door", and "Close Door" respectively. Final User Interface should look like as figure 11. Now add a Bluetooth Client to the viewer. It is an invisible component and it has no UI. See Image 12.

Switch over to the Blocks Editor

It's time to tell your app what to do! Click "Blocks" to move over to the Blocks Editor (image 13). Think of the Designer and Blocks buttons like tabs- you use them to move back and forth between the two areas of App Inventor. The Blocks Editor is where you program the behavior of your app. There are Built-in block that handle things like math, logic, and text. Below that are the blocks that go with each of the components in your app. In order to get the blocks for a certain component to show up in the Blocks Editor, you first have to add that component to your app through the Designer.

Let us, design blocks for List Picker. List Picker is a UI element when clicked it shows a list of corresponding elements here is the paired Bluetooth device. We have to add two blocks ListPicker.BeforePicking and ListPicker.AfterPicking (image 14). Complete Blocks are shown in figure 18 & 19.

Make apk file

Our design is complete, now we need to build the apk file for our android phone. Click to build menu and select "App(save .apk to my computer)". Wait for a minute. An apk file will download to your default download folder. Install and use it.

Step 8: A More Feature Rich Android App

In previous step I have showed you how to develop a basic bluetooth app in App Inventor. But that app is not so user friendly. It will not show you any message either your door is open or closed or bluetooth can not connected for any error. I have attached here a more advanced app for our project.

When you run you app this app check either your bluetooth radio is enable or not, if not enable a bluetooth enabling dialog will appear. Click yes to turn on your bluetooth radio. Then pair the device using pair device button. Then click to connect button, if successfully connected to any device the application shows the connected device's MAC address and name. Enter password to the password box then click the open door button, if you entered correct password door will be open and application will show you a message that your door is now open. Then enter password again if you want to close the door. If you give the wrong password, then app will show wrong password message.

Complete App Inventor source file (BTcontrol.aia) is attached herewith. If you did not like to make your own app or modify it, just download the BTcontrol.apk and install it to your android pone.

You can also download it from Google Play Store using the link:

https://play.google.com/store/apps/details?id=appinventor.ai_khairul_uapstu.BTcontrol&hl=en

For modifying the source click the "Projects" menu and select "Import project (.aia) from my computer" shown in figure 24 and browse the BTcontrol.aia file from your computer. After importing you can modify it easily.

If you want to know more about android app developing using App Inventor browse: http://appinventor.mit.edu/explore/ai2/tutorials.html. You can also try http://meta-guide.com/videography/100-best-appinventor-videos/

Comments

author
PeterH329 (author)2017-09-14

Nice! Thanks for the instructions! Just wondering if those bluetooth chips will work with iphones?

author
Ardutronico (author)PeterH3292017-09-15

They don't, unless your iPhone hasn't got Bluetooth 4 or it's jailbroken. Plus, you would need to make your own app.

author
J.C7 (author)2017-09-14

Good work! On the security side, you can improve a few things though:

1. As already mentioned, the password can easily be sniffed over the BT 2.0 link. Every time you send your password, you expose it to everyone in range. They could then easily replay the "open" command (even without your app).

2. There is no counter to prevent someone from brute-forcing your password. Agreed, this might take a while but...

3. The compareTo function seems to be using a vanilla strcmp which is prone to timing attacks. Strcmp will compare your input with the hardcoded password character per character, meaning that this comparison will take a different amount of time depending on if the first characters match or if they don't. This time difference is likely to be measurable over BT. This makes the brute-force attack much faster.

author
MikeD11 (author)J.C72017-09-14

Could you make the bluetooth/Arduino ask for your phones MAC address and open the door?

author
taifur (author)MikeD112017-09-14

For a bluetooth device you can easily change the MAC address.

author
J.C7 (author)MikeD112017-09-14

Yes, that's doable. I've done it to log who's home and who's not by constantly scanning for the BT MAC addresses of the phones of the family members.

Now, for a security application, that's a pretty bad idea as this is extremely easy to spoof.

author
taifur (author)J.C72017-09-14

Thank you. I will keep in mind all the fact for next update.

author
der_fisherman (author)2017-09-14

Great work, but the plastic and the tiny screws might not stop a heavyweight rushing the door....

Thanks for sharing.

Andy

author
Ancifero (author)2017-09-14

nice idea,

but it is better to use a real metal door lock.
Adding to it intelligent control and servo.

author
ironarmadillo (author)2017-09-14

Concerning the "no power to the lock" question: Maybe a USB jack running through the wall for connecting your phone to the lock mechanism and drawing power off your phone would be a viable solution for opening the lock.

author
Ardutronico (author)2017-09-14

Just one problem. Bluetooth 2.0 (the one HC-05 uses) is insecure and can be easily hacked. Plus, most iOS (and some Android) devices aren't compatible. You should use Bluetooth 4 (which has the advantage of reduced power consumption, too). It isn't too expensive (around $5). But, even better, you could substitute the Arduino and HC-05 by an ESP8266 ($3, even cheaper) and make it Wi-Fi and IoT, or an ESP32 ($7), which also has Bluetooth 4.2 and it's dual core. Andreas Spiess on YouTube has good tutorials about them.

author
rpotts2 (author)2017-09-14

Nice. Make that in metal and sell as a DIY kit.

author
taifur (author)rpotts22017-09-14

Nice suggestion. Thanks a lot.

author
SivakumarM1 (author)2017-09-14

amazing, only issue is the material and its strength, if we are going to use it as main door lock.

author
taifur (author)SivakumarM12017-09-14

You are correct. I have a plan to make it stronger. Thank you.

author
eGadgetGuy (author)2017-09-14

I like this but I also don't.

1. It needs to look nicer. most people don't want orange plastic and wires exposed.

2. It does need to be stronger. Plastic is too breakable.

3. It needs a fail safe/bypass. "use another phone" or "charge your phone" is not good enough.

Thank you for this though. it gives me some good ideas.

author
taifur (author)eGadgetGuy2017-09-14

Thank you.

author
ridercz (author)2017-09-14

Good work, nice too see that my design got another evolution!

author
taifur (author)ridercz2017-09-14

Let me take the opportunity to thank you again for your nice design.

author
ajayt7 (author)2017-09-14

Wonderful

author
taifur (author)ajayt72017-09-14

Thanks

author
pgs070947 (author)2017-09-14

A lot of effort gone into this.

I've long thought that if cars can have central locking, why not houses?

I like the rack bolt and I wonder if for a beefier version you could use a commercial mortice rack bolt.

I haven't read all of it, but do you get feedback to confirm that the bolt has gone over?. Some special facility rooms like sterile rooms with UV lamps used to have a microswitch in the frame side to confirm that the bolt had actually gone over.

author
taifur (author)pgs0709472017-09-14

Thank you for your comments.

author
enstain (author)2017-09-14

Very nice project, but what happens if the electricity is out or one of the electrical parts stop working? It would be great to have some sort of emergency manual unlock mechanism (like the possibility to use your standart key or something). Also adding a backup battery would be an option (for the power loss scenario at least?).

author
taifur (author)enstain2017-09-14

You are absolutely correct. I have the plan to update the project and make it more useful and reliable.

author
llucop (author)enstain2017-09-14

You always have the "boot the door" method :)

author
NergoP (author)2017-09-14

Could you make a version that just turns a key like on a double deadbolt design? That way it's stronger and you can use the outdoor key just in case something stops working.

author
taifur (author)NergoP2017-09-14

Thank you for your nice suggestion.

author
arduino-raspi (author)2017-09-10

Nice project. Can I use HC-06 instead of HC-05?

author
taifur (author)arduino-raspi2017-09-12

Sure, you can use HC-06.

author
agis68 (author)2017-09-11

pretty nice project....You should try the improvement of making metal pieces.....for more strenth

author
taifur (author)agis682017-09-11

Thank you for your nice suggestion.

author
khairul-eee (author)2017-09-10

Very nice and useful made.

author
taifur (author)khairul-eee2017-09-11

Thanks

author
taifur (author)khairul-eee2017-09-10

Thank you.

author
emielvsb (author)2017-09-10

what happens if your phones battery is dead

author
taifur (author)emielvsb2017-09-11

Then you should charge your phone (ha, ha, ha).

Just install the app in another phone and unlock the door. It very easy.