Intelligent access control based on ESP32 and RFID

Discussion in 'Arduino Playground' started by BANCROFTLI126COM, Aug 31, 2021.

Tags:
ad: L-HROutlet
ad: l-rl
ad: MessiPaoloni-1
ad: Left-2
ad: Left-3
ad: abrind-2
ad: L-Geochron
ad: HRDLLC-2
ad: L-MFJ
  1. BANCROFTLI126COM

    BANCROFTLI126COM QRZ Member

    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

    [​IMG]

    GUI design

    [​IMG]

    Code sharing

    Code:
    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

     
    VE2ZEB likes this.
  2. VE2ZEB

    VE2ZEB Premium Subscriber QRZ Page

    Great project ! Nice UI
     

Share This Page