hi
Dependencies: 4DGL-uLCD-SE Servo HC_SR04_Ultrasonic_Library mbed-rtos mbed
Created by David Sanchez, Jonathan Arthur, and Jong Pil Park
Smart Door Lock
Overview
The smart door lock system was designed with the purpose of adding a modular form of security and convenience to any door. A servo was connected to a door lock which locks and unlocks the door through three different methods: Using an app on a phone via Bluetooth , the use of pushbuttons, and a set of timers which lock the door after a certain time. Sonar was also implemented to determine whether the door is in an opened or closed state. An LCD was used to display the current state of the locking mechanism. Lastly, a speaker and an amplifier are included which are used as an alarm that goes off when the door is opened without authorization.
Bluetooth Thread
Adafruit BLE | Mbed |
---|---|
Vin | Vu |
gnd,CTS | Gnd |
TXO | p10 |
RXI | p9 |
To be able to wirelessly unlock the door knob we used the adafruit BLE which can communicate with the Bluefruit app. We created a function which prints a line to the phone asking for a password. It waits until something is typed in and if the password is correct it unlocks/locks the door. If the password is not correct it just prints the same line again. This function runs on a separate thread so that other things can be done simultaneously.
void bluetooth(){ while(1){ blue.printf("enter password\n"); if (blue.getc()=='!') { if (blue.getc()=='!') { if (blue.getc()=='!') { if (blue.getc()=='!') { i=!i; blue.printf("password is correct\n"); } } } } }//end while loop }
LCD Thread
uLCD cable | Mbed |
---|---|
Vcc | 5V |
Gnd | Gnd |
TX | p13 |
RX | p14 |
RESET | p15 |
Another thread was used for displaying the status of the door. If the door is closed a red message is displayed on the LCD and a green message is displayed if the door is opened. The LCD also tells if the door is locked or unlocked. The code for the LCD is provided below. This thread uses a mutex so that the program does not lock up.
void LCD() { while(1) { mut.lock(); if(i==0){ uLCD.locate(7,9); uLCD.printf("Locked "); } else { uLCD.locate(7,9); uLCD.printf("Unlocked"); } mut.unlock(); if (j==0) { mut.lock(); uLCD.line(0, 0, 127, 0, RED); uLCD.line(127, 0, 127, 127, RED); uLCD.line(127, 127, 0, 127, RED); uLCD.line(0, 127, 0, 0, RED); uLCD.color(RED); uLCD.locate(7,8); uLCD.text_width(1); uLCD.text_height(1); uLCD.printf("CLOSED "); mut.unlock(); }//end if if(j==1) { mut.lock(); uLCD.line(0, 0, 127, 0, GREEN); uLCD.line(127, 0, 127, 127, GREEN); uLCD.line(127, 127, 0, 127, GREEN); uLCD.line(0, 127, 0, 0, GREEN); uLCD.color(GREEN); uLCD.locate(7,8); uLCD.text_width(1); uLCD.text_height(1); uLCD.printf("OPEN "); mut.unlock(); } Thread::wait(2); }//end while }//end LCD
Light Sensor Thread
A light sensor is used to tell if it is night time. This thread checks if the amount of light is low and if it is it locks the door after 10 minutes.
void LEDT(){ while(1){ mut.lock(); if(photocell<0.010) { mut.unlock(); Thread::wait(100000); Thread::wait(100000); Thread::wait(100000); mut.lock(); if(photocell<0.010) i=0; } //end if mut.unlock(); //Thread::yield(); }//end while }
Speaker Thread
Mbed | TPA2005D1 | Speaker |
---|---|---|
gnd | pwr-,in- | |
Vout | pwr+ | |
p18 | in+ | |
out+ | + | |
out- | - |
This thread checks if the door is opened while it is locked and makes the alarm go off.
void Pwspeaker() { while(1) { while(i==0&&j==1) { speaker.PlayNote(969.0, 0.5, 1.0); speaker.PlayNote(800.0, 0.5, 1.0); } } }
Main Thread
Servo Motor | Mbed |
---|---|
Black | Gnd |
RED | 5V |
Yellow | p21 |
Sonar Senor | Mbed |
---|---|
Vcc | 5V |
Gnd | Gnd |
trig | p6 |
echo | p7 |
Pb1 | Pb2 | Pb3 | Mbed |
pin1 | p19 | ||
pin1 | p 23 | ||
pin1 | p24 | ||
pin2 | pin2 | pin2 | gnd |
RGBLED light | Mbed |
RED | p26 |
Gnd | Gnd |
GREEN | p29 |
BLUE | p30 |
The main thread initializes all the other threads, checks if the pushbuttons are pressed and checks if the door is closed or open. The pushbuttons simply unlock and lock the door. There is a third pushbutton that locks the door but 10 seconds after being pressed. This gives the person time to open and close the door before it locks. Sonar is used to check if the door is closed or open. The main thread initializes the sonar so that the distance from the sensor to an object is constantly measured. If this distance is greater than a certain value then it means that the door is open. This is used for the alarm which is turned on if the door is open while it is locked. An RGB LED used to indicate the status of the door. If the door is locked the green LED turns on and if the door is unlocked the red LED turns on. The blue LED turns on when the door is open.
int main() { uLCD.baudrate(3000000); pb1.mode(PullUp); pb2.mode(PullUp); pb3.mode(PullUp); mu.startUpdates();//start measuring the distance thread3.start(Pwspeaker); thread.start(bluetooth); thread2.start(LCD); thread4.start(LEDT); while(1){ LEDG =!i; LEDB = 0; LEDR= i; if(pb3==0){ mut.lock(); uLCD.cls(); uLCD.color(RED); uLCD.locate(3,3); uLCD.text_width(3); uLCD.text_height(3); uLCD.printf("10"); wait(1); uLCD.cls(); uLCD.color(RED); uLCD.locate(3,3); uLCD.text_width(3); uLCD.text_height(3); uLCD.printf("9"); wait(1); uLCD.cls(); uLCD.color(RED); uLCD.locate(3,3); uLCD.text_width(3); uLCD.text_height(3); uLCD.printf("8"); wait(1); uLCD.cls(); uLCD.color(RED); uLCD.locate(3,3); uLCD.text_width(3); uLCD.text_height(3); uLCD.printf("7"); wait(1); uLCD.cls(); uLCD.color(RED); uLCD.locate(3,3); uLCD.text_width(3); uLCD.text_height(3); uLCD.printf("6"); wait(1); uLCD.cls(); uLCD.color(RED); uLCD.locate(3,3); uLCD.text_width(3); uLCD.text_height(3); uLCD.printf("5"); wait(1); uLCD.cls(); uLCD.color(RED); uLCD.locate(3,3); uLCD.text_width(3); uLCD.text_height(3); uLCD.printf("4"); wait(1); uLCD.cls(); uLCD.color(RED); uLCD.locate(3,3); uLCD.text_width(3); uLCD.text_height(3); uLCD.printf("3"); wait(1); uLCD.cls(); uLCD.color(RED); uLCD.locate(3,3); uLCD.text_width(3); uLCD.text_height(3); uLCD.printf("2"); wait(1); uLCD.cls(); uLCD.color(RED); uLCD.locate(3,3); uLCD.text_width(3); uLCD.text_height(3); uLCD.printf("1"); wait(1); uLCD.cls(); i=0; mut.unlock(); } if (pb1==0){//Locked i = 0; } if (pb2==0){//Unlocked i = 1; } if (j==1){//close LEDR =0; LEDG = 0; LEDB =1; } myservo=i; mut.lock(); mu.checkDistance(); mut.unlock(); printf("%f \n",dist2); if (dist2>0.5f) { led=1; j=1; } else { led=0; j=0; } }//end while }//end main
History
final edit;
2018-05-01, by davidscque [Tue, 01 May 2018 04:54:34 +0000] rev 1
final edit;
4180 project;
2018-04-23, by davidscque [Mon, 23 Apr 2018 17:55:06 +0000] rev 0
4180 project;