DIY smart door lock | on ElectriciansForums

Discuss DIY smart door lock in the UK Electrical Forum area at ElectriciansForums.net

Announcement or do you have a problem?
I have one such idea and am in the process of implementing it. I am using Stone's touch screen and ESP32 for this project, but I have a basic question now, I purchased a small solenoid lock from KOB, but someone recommended me to use Z-5R, which one should I use for better results?
 
As an Amazon Associate Electricians Forums may earn a small commission from qualifying purchases.
The HMI has been done and has been designed to look as good as possible.
[ElectriciansForums.net] DIY smart door lock
 
By the time you’ve bought all the hardware needed…. Wouldn’t it be cheaper to use an off-the-counter solution?

don’t know if it’s been superseded yet, but a few years ago I fitted an ESP Fortessa system for caravan park toilet block access.
2 locks. One for main door, and other for disabled access. Dis cards did both doors, the rest only did main. Assigned each card to pitch number, turned access on and off when pitch was used/vacant.
Could time stamp each access to investigate when the door was opened in case of an incident. (Vandalism, or people taking dogs in for a shower… yeh, really)
Eventually changed the cards to key fob type as the cards got damaged easy. (Found them with holes punched through them for hanging on a lanyard!)
 
By the time you’ve bought all the hardware needed…. Wouldn’t it be cheaper to use an off-the-counter solution?

don’t know if it’s been superseded yet, but a few years ago I fitted an ESP Fortessa system for caravan park toilet block access.
2 locks. One for main door, and other for disabled access. Dis cards did both doors, the rest only did main. Assigned each card to pitch number, turned access on and off when pitch was used/vacant.
Could time stamp each access to investigate when the door was opened in case of an incident. (Vandalism, or people taking dogs in for a shower… yeh, really)
Eventually changed the cards to key fob type as the cards got damaged easy. (Found them with holes punched through them for hanging on a lanyard!)
I would like to know what card reading module you are using?
 
About this smart access control system, I have now completed it and I will make an update here.

brief introduction

The smart home is becoming more and more common with the development of technology, this article will focus on the security aspects of the intelligent access control project.

The principle of card reading: by driving the RFID-RC522 module, identify the ID card ID close to the ID card and then determine whether the ID exists in the database of the word typical, ID is the typical value of the word, if the existence of the verification through, and then print out the corresponding name, and then drive the electromagnetic lock in the same way.

Realized function

1. card registration.
2. username and password registration.
3. card swipe to unlock the electronic lock.
4. User name and password to unlock the electronic lock.

Connection diagram

[ElectriciansForums.net] DIY smart door lock


GUI design

[ElectriciansForums.net] DIY smart door lock


part of code

Python:
import mfrc522
import time
import _thread
from os import uname
from machine import Pin, UART
#from pyb import UART
#import machine

suos = Pin(32,Pin.OUT)
uart2 = UART(2, baudrate=115200, rx=16,tx=17,timeout=10)

ESP32_HSPI_CLOCK = 14
ESP32_HSPI_SLAVE_SELECT = 15
ESP32_HSPI_MISO = 12
ESP32_HSPI_MOSI = 13
ESP32_MFRC522_RST = 5

rx3 = []
rx_name = []
user_id_flag = False
password_flag = False
temp_id = ''
temp_mima = ''
personnel_id = {'zbw':[236,230,169,47],'lbw':[19,165,93,4]}
personnel_ps = {'zbw':'zbw3366','lbw':'lbwnb'}
admin_password = ('yyds')
button_cmd = [16,1]
edit1_cmd = [16,112]
edit2_cmd = [16,113]
edit3_cmd = [16,114]

if uname()[0] == 'esp32':
    rdr = mfrc522.MFRC522(ESP32_HSPI_CLOCK, ESP32_HSPI_MOSI, ESP32_HSPI_MISO, ESP32_MFRC522_RST, ESP32_HSPI_SLAVE_SELECT)

def do_write():
    try:
        (stat, tag_type) = rdr.request(rdr.REQIDL)
        if stat == rdr.OK:
            (stat, raw_uid) = rdr.anticoll()
            if stat == rdr.OK:
                print("New card detected")
                print("  - tag type: 0x%02x" % tag_type)
                print("  - uid : 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
                print("")
                if rdr.select_tag(raw_uid) == rdr.OK:
                    key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
                    if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
                        stat = rdr.write(8, b"\x00\x53\x00\x54\x00\x4F\x00\x4E\x00\x45\x0a\x0b\x0c\x0d\x0e\x0f")
                        rdr.stop_crypto1()
                        if stat == rdr.OK:
                            print("Data written to card")
                        else:
                            print("Failed to write data to card")
                    else:
                        print("Authentication error")
                else:
                    print("Failed to select tag")

    except KeyboardInterrupt:
        print("write error")


def do_read():
    while True:
        try:
            (stat, tag_type) = rdr.request(rdr.REQIDL)

            if stat == rdr.OK:
                (stat, raw_uid) = rdr.anticoll()
                if stat == rdr.OK:
                    print("New card detected")
                    print("  - tag type: 0x%02x" % tag_type)
                    print("  - uid   : 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
                    print (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
                    print("")
                    if rdr.select_tag(raw_uid) == rdr.OK:
                        key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
                        if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
                            print("Address 8 data: %s" % rdr.read(8))
                            for ps in personnel_id:
                                if raw_uid[0:4:1] == personnel_id.get(ps):
                                    suos.value(1)
                                    print(ps)
                                    uart_write(ps, *raw_uid[0:4:1])
                                    time.sleep(3)
                                    uart2.sendbreak()
                                    break
                            rdr.stop_crypto1()
                            time.sleep(3)
                            suos.value(0)
                        else:
                            print("Authentication error")
                    else:
                        print("Failed to select tag")
            if uart2.any()>1:
                rx2 = []
                data_name2 = ''
                bin_data = uart2.read(40)
                uart2.sendbreak()
                rx1 = list(bin_data)
                for item in rx1:
                    rx2.append(chr(item))
                print(rx2)
                if rx1[3:5:1] == button_cmd:
                    data_name_len = rx1[6] - 1
                    data_name = rx2[7:data_name_len+7:1]
                    data_name2 = ''.join(data_name)
                    print(data_name2)
                    if data_name2 == 'back3':
                        return
        except KeyboardInterrupt:
            print("read error")

def do_read2 (idd):
    print(idd)
    while True:
        try:
            (stat, tag_type) = rdr.request(rdr.REQIDL)

            if stat == rdr.OK:
                (stat, raw_uid) = rdr.anticoll()
                if stat == rdr.OK:
                    print("New card detected")
                    print("  - tag type: 0x%02x" % tag_type)
                    print("  - uid   : 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
                    print (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
                    print("")
                    if rdr.select_tag(raw_uid) == rdr.OK:
                        key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
                        if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
                            print("Address 8 data: %s" % rdr.read(8))
                            personnel_id[idd] = raw_uid[0:4:1]
                            uart_write3(*raw_uid[0:4:1])
                            rdr.stop_crypto1()
                        else:
                            print("Authentication error")
                    else:
                        print("Failed to select tag")
            if uart2.any()>1:
                rx2 = []
                data_name2 = ''
                bin_data = uart2.read(40)
                uart2.sendbreak()
                rx1 = list(bin_data)
                for item in rx1:
                    rx2.append(chr(item))
                if rx1[3:5:1] == button_cmd:
                    data_name_len = rx1[6] - 1
                    data_name = rx2[7:data_name_len+7:1]
                    data_name2 = ''.join(data_name)
                    print(data_name2)
                if data_name2 == 'back1':
                    return

        except KeyboardInterrupt:
            print("read error")

def uart_write(text, *ids):
#    print(text, *ids)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardname1","text":"'+str(text)+'"}>ET')
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid1","text":"'+str(ids)+'"}>ET')
    uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock1","visible":true}>ET')
    time.sleep(3)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardname1","text":"''"}>ET')
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid1","text":"''"}>ET')
    uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock1","visible":false}>ET')

def uart_write2(text,text2):
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'+text+'"}>ET')
    time.sleep(3)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'+text2+'"}>ET')
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit2","text":"''"}>ET')

def uart_write3(*id2):
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'+str(id2)+'"}>ET')
    time.sleep(3)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"''"}>ET')

def uart_write4(text,text2):
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"login","text":"'+text+'"}>ET')
    time.sleep(1)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"login","text":"'+text2+'"}>ET')
    time.sleep(1)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit3","text":"''"}>ET')
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit4","text":"''"}>ET')
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit7","text":"''"}>ET')

def uart_write5():
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'+str(id2)+'"}>ET')
    time.sleep(3)
    uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"''"}>ET')

def card_zhuce():
    while True:
        if uart2.any():
            user_id = ''
            password = ''
            rx2 = []
            rx_num = 0
            bin_data = uart2.read(40)
            uart2.sendbreak()
            rx1 = list(bin_data)
            for item in rx1:
                rx2.append(chr(item))
                rx_num += 1
            data_end = rx_num-5
            data_id_st = rx2[8:13:1]
            data_id_st2 = ''.join(data_id_st)
            print(data_id_st2)
            if data_id_st2 == 'edit1':
                data_id_st3 = rx2[15:data_end:1]
                data_id_st4 = ''.join(data_id_st3)
                print(data_id_st4)
                if data_id_st4 != '':
                    name = True
            elif data_id_st2 == 'edit2':
                data_id_st5 = rx2[15:data_end:1]
                data_id_st6 = ''.join(data_id_st5)
                if data_id_st6 == admin_password:
                    admin = True
                    uart_write2('Verification passed!','Please place the card!')
                    do_read2(data_id_st4)
                    return

def mima_zuce():
    temp_id3 = ''
    temp_mima3 = ''
    while True:
        if uart2.any():
            user_id = ''
            password = ''
            rx2 = []
            rx_num = 0
#            data_end = 0
            bin_data = uart2.read(40)
            uart2.sendbreak()
            rx1 = list(bin_data)
            for item in rx1:
                rx2.append(chr(item))
                rx_num += 1
#                if (rx2[rx_num] == 'T') and (rx2[rx_num-1] == 'E') and (rx2[rx_num-2] == '>'):
#                    break
            data_end = rx_num-5
            data_id_st = rx2[8:13:1]
            data_id_st2 = ''.join(data_id_st)
            print(data_id_st2)
            if rx1[3:5:1] == button_cmd:
                data_name_len = rx1[6] - 1
                data_name = rx2[7:data_name_len+7:1]
                data_name2 = ''.join(data_name)
                print(data_name2)
                if data_name2 == 'back2':
                    return
            if data_id_st2 == 'edit3':
                data_id_st3 = rx2[15:data_end:1]
                data_id_st4 = ''.join(data_id_st3)
                print(data_id_st4)
                user_id_flag = True
                temp_id3 = data_id_st4
#                personnel_ps[temp_id] = raw_uid[0:4:1]
            elif data_id_st2 == 'edit4':
                data_id_st5 = rx2[15:data_end:1]
                data_id_st6 = ''.join(data_id_st5)
                print(data_id_st6)
#                if personnel_ps.get(temp_id) == data_id_st6:
                password_flag = True
                temp_mima3 = data_id_st6
#                    personnel_ps[temp_id] = password_flag

#            print(rx2,user_id_flag,password_flag)

            elif data_id_st2 == 'edit7':
                data_id_st5 = rx2[15:data_end:1]
                data_id_st6 = ''.join(data_id_st5)
                if (data_id_st6 == admin_password) and (password_flag == True) and (user_id_flag == True):
                    admin = True
                    personnel_ps[temp_id3] = temp_mima3
                    password_flag = False
                    user_id_flag = False
                    uart_write4('Verification passed!','login was successful!')


def password_loin():
    temp_id2 = ''
    temp_mima = ''
    while True:
        if uart2.any():
            user_id = ''
            password = ''
            rx2 = []
            rx_num = 0
#            data_end = 0
            bin_data = uart2.read(40)
            uart2.sendbreak()
            rx1 = list(bin_data)
            for item in rx1:
                rx2.append(chr(item))
                rx_num += 1
#                if (rx2[rx_num] == 'T') and (rx2[rx_num-1] == 'E') and (rx2[rx_num-2] == '>'):
#                    break
            data_end = rx_num-5
            data_id_st = rx2[8:13:1]
            data_id_st2 = ''.join(data_id_st)
            print(data_id_st2)
            if rx1[3:5:1] == button_cmd:
                data_name_len = rx1[6] - 1
                data_name = rx2[7:data_name_len+7:1]
                data_name2 = ''.join(data_name)
                print(data_name2)
                if data_name2 == 'back4':
                    return
            if data_id_st2 == 'edit5':
                data_id_st3 = rx2[15:data_end:1]
                data_id_st4 = ''.join(data_id_st3)
                print(data_id_st4)
                if data_id_st4 in personnel_ps:
                    user_id_flag = True
                    temp_id2 = data_id_st4
            elif data_id_st2 == 'edit6':
                data_id_st5 = rx2[15:data_end:1]
                data_id_st6 = ''.join(data_id_st5)
                print(data_id_st6)
                print(temp_id2)
                print(personnel_ps)
                if personnel_ps.get(temp_id2) == data_id_st6:
                    password_flag = True

#            print(rx2,user_id_flag,password_flag)
                    print(user_id_flag,password_flag)
                    if (password_flag == True) and (user_id_flag == True):
                        uart_write(temp_id2,temp_id2)
                        password_flag = False
                        user_id_flag = False
                        suos.value(1)
                        uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock2","visible":true}>ET')
                        uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit5","text":"''"}>ET')
                        uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"edit6","text":"''"}>ET')
                        time.sleep(3)
#                        uart_write('student','')
                        suos.value(0)
                        uart2.write('ST<{"cmd_code":"set_visible","type":"widget","widget":"lock2","visible":false}>ET')
                        uart2.sendbreak()

while True:
    if uart2.any()>1:
        rx2 = []
        data_name2 = ''
        bin_data = uart2.read(40)
#        time.sleep(1)
        uart2.sendbreak()
#        time.sleep(1)
        rx1 = list(bin_data)
        for item in rx1:
            rx2.append(chr(item))
        print(rx2)
        if rx1[3:5:1] == button_cmd:
            data_name_len = rx1[6] - 1
            data_name = rx2[7:data_name_len+7:1]
            data_name2 = ''.join(data_name)
            print(data_name2)
            if data_name2 == 'card1':
                card_zhuce()
            elif data_name2 == 'password1':
                mima_zuce()
            elif data_name2 == 'card2':
                do_read()
            elif data_name2 == 'password2':
                password_loin()

Video demo

 
I'm thinking about putting myself on a door with such a smart lock because I want my family to be even safer. This way, my children will see who is knocking on the door and not answer people who look suspicious, and I think that's great.
Many "smart" locks are insecure, don't go that route.

Yes, by all means put in a video / audio link so they can see who is at the door without opening it. Ideally one that you can also view remotely if needed.
 

Reply to DIY smart door lock in the UK Electrical Forum area at ElectriciansForums.net

News and Offers from Sponsors

  • Article
Join us at electronica 2024 in Munich! Since 1964, electronica has been the premier event for technology enthusiasts and industry professionals...
    • Like
Replies
0
Views
228
  • Sticky
  • Article
Good to know thanks, one can never have enough places to source parts from!
Replies
4
Views
687
  • Article
OFFICIAL SPONSORS These Official Forum Sponsors May Provide Discounts to Regular Forum Members - If you would like to sponsor us then...
Replies
0
Views
641

Similar threads

I wouldn't rely on the ghost immobiliser on its own. My hire vans had them fitted, we lost a key and had a guy come out to cut and programme a new...
Replies
4
Views
2K

OFFICIAL SPONSORS

Electrical Goods - Electrical Tools - Brand Names Electrician Courses Green Electrical Goods PCB Way Electrical Goods - Electrical Tools - Brand Names Pushfit Wire Connectors Electric Underfloor Heating Electrician Courses
These Official Forum Sponsors May Provide Discounts to Regular Forum Members - If you would like to sponsor us then CLICK HERE and post a thread with who you are, and we'll send you some stats etc

YOUR Unread Posts

This website was designed, optimised and is hosted by untold.media Operating under the name Untold Media since 2001.
Back
Top