Интеллектуальный контроль доступа на основе ESP32 и ЖК-дисплея

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
aisen
Сообщения: 15

Сообщение aisen » 30 сен 2021, 11:16

Необходимые материалы

ESP32
Электронный замок KOB
Реле
Дисплей STONE STWI070WT-01
Модуль MFRC522

Реализованная функция

1. регистрация карты.
2. регистрация имени пользователя и пароля.
3. проведение картой для разблокировки электронного замка.
4. Имя пользователя и пароль для разблокировки электронного замка.

Схема подключения

Изображение

Разработка графического интерфейса пользователя

Изображение

совместное использование кода

Код: Выделить всё

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()



видеодемонстрация


Вернуться в «Микроконтроллеры и ПЛИС»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей