IOT

Kontrol akses cerdas berdasarkan LCD TFT BATU dan ESP32

Pengantar singkat

Rumah pintar menjadi semakin umum dengan perkembangan teknologi, artikel ini akan fokus pada aspek keamanan dari proyek kontrol akses cerdas.

Artikel ini menggunakan Layar sentuh BATU untuk mengirim perintah ke MCU untuk mengontrol relai dan modul MFRC522.

Prinsip membaca kartu: dengan menggerakkan modul RFID-RC522, mengidentifikasi ID kartu ID dekat dengan kartu ID, dan kemudian menentukan apakah ID ada di database kata khas, ID adalah nilai khas kata, jika keberadaan verifikasi melalui , lalu cetak nama yang sesuai, lalu dorong kunci elektromagnetik dengan cara yang sama.

Bahan yang dibutuhkan

Fungsi yang direalisasikan

  1. pendaftaran kartu.
  2. pendaftaran nama pengguna dan kata sandi.
  3. gesek kartu untuk membuka kunci elektronik.
  4. Nama pengguna dan kata sandi untuk membuka kunci elektronik.

Deskripsi perangkat keras utama

Modul RFID

Modul ini dapat langsung dimuat ke berbagai modul pembaca. Ini menggunakan tegangan 3.3V, melalui antarmuka SPI hanya dengan beberapa kabel. Terhubung langsung dengan motherboard CPU, modul ini dapat bekerja dengan stabil dan andal sebagai pembaca kartu jarak jauh.

Kontrol akses cerdas berdasarkan STONE TFT LCD dan ESP32 IOT PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.
Kontrol akses cerdas berdasarkan LCD TFT BATU dan ESP32

STWI070WT-01 telah disusun sebagai monitor TFT & pengontrol Sentuh. Ini termasuk prosesor, program kontrol, driver, memori flash, port RS232/RS422/RS485/TTL/LAN, Wi-Fi/Bluetooth, layar sentuh, catu daya, dll., Jadi ini adalah sistem tampilan keseluruhan berdasarkan yang kuat & mudah sistem operasi, yang dapat dikendalikan oleh Setiap MCU.

Kontrol akses cerdas berdasarkan STONE TFT LCD dan ESP32 IOT PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.
Kontrol akses cerdas berdasarkan LCD TFT BATU dan ESP32

desain GUI

Kontrol akses cerdas berdasarkan STONE TFT LCD dan ESP32 IOT PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.
Kontrol akses cerdas berdasarkan LCD TFT BATU dan ESP32

Berbagi kode

Kontrol akses cerdas berdasarkan STONE TFT LCD dan ESP32 IOT PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.
Kontrol akses cerdas berdasarkan LCD TFT BATU dan ESP32

impor mfrc522

waktu impor

impor _utas

dari os impor uname

dari pin impor mesin, UART

#dari pyb impor UART

#mesin impor

suos = Pin(32,Pin.OUT)

uart2 = UART(2, baudrate=115200, rx=16,tx=17,waktu habis=10)

ESP32_HSPI_JAM = 14

ESP32_HSPI_SLAVE_SELECT = 15

ESP32_HSPI_MISO = 12

ESP32_HSPI_MOSI = 13

ESP32_MFRC522_RST = 5

rx3 = []

rx_nama = []

user_id_flag = Salah

password_flag = Salah

suhu_id = ”

suhu_mima = ”

personil_id = {'zbw':[236,230,169,47],'lbw':[19,165,93,4]}

personel_ps = {'zbw':'zbw3366′,'lbw':'lbwnb'}

admin_password = ('yyds')

tombol_cmd = [16,1]

edit1_cmd = [16,112]

edit2_cmd = [16,113]

edit3_cmd = [16,114]

jika uname()[0] == 'esp32':

rdr = mfrc522.MFRC522(ESP32_HSPI_JAM, ESP32_HSPI_MOSI, ESP32_HSPI_MISO, ESP32_MFRC522_RST, ESP32_HSPI_SLAVE_SELECT)

def do_write():

coba:

(stat, jenis_tag) = rdr.permintaan(rdr.REQIDL)

jika stat == rdr.OK:

(status, raw_uid) = rdr.anticoll()

jika stat == rdr.OK:

print("Kartu baru terdeteksi")

print(" – jenis tag: 0x%02x" % tag_type)

print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))

mencetak("")

jika rdr.select_tag(raw_uid) == rdr.OK:

kunci = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

jika rdr.auth(rdr.AUTHENT1A, 8, kunci, 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()

jika stat == rdr.OK:

print("Data ditulis ke kartu")

lain:

print("Gagal menulis data ke kartu")

lain:

print("Kesalahan otentikasi")

lain:

print("Gagal memilih tag")

kecuali KeyboardInterrupt:

print("kesalahan penulisan")

def do_read():

sementara Benar:

coba:

(stat, jenis_tag) = rdr.permintaan(rdr.REQIDL)

jika stat == rdr.OK:

(status, raw_uid) = rdr.anticoll()

jika stat == rdr.OK:

print("Kartu baru terdeteksi")

print(" – jenis tag: 0x%02x" % tag_type)

print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))

cetak (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])

mencetak("")

jika rdr.select_tag(raw_uid) == rdr.OK:

kunci = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

jika rdr.auth(rdr.AUTHENT1A, 8, kunci, raw_uid) == rdr.OK:

print(“Data alamat 8: %s” % rdr.read(8))

untuk ps di personel_id:

if raw_uid[0:4:1] == personel_id.get(ps):

suos.nilai(1)

cetak

uart_write(ps, *raw_uid[0:4:1])

time.sleep (3)

uart2.sendbreak()

istirahat

rdr.stop_crypto1()

time.sleep (3)

suos.nilai(0)

lain:

print("Kesalahan otentikasi")

lain:

print("Gagal memilih tag")

jika uart2.any()>1:

rx2 = []

data_nama2 = ”

bin_data = uart2.baca(40)

uart2.sendbreak()

rx1 = daftar(bin_data)

untuk item di rx1:

rx2.tambahkan(chr(item))

cetak(rx2)

jika rx1[3:5:1] == button_cmd:

nama_data_len = rx1[6] – 1

nama_data = rx2[7:nama_data_len+7:1]

data_name2 = ”.join(nama_data)

cetak(nama_data2)

jika data_name2 == 'back3':

kembali

kecuali KeyboardInterrupt:

print("kesalahan membaca")

def do_read2 (id):

cetak (id)

sementara Benar:

coba:

(stat, jenis_tag) = rdr.permintaan(rdr.REQIDL)

jika stat == rdr.OK:

(status, raw_uid) = rdr.anticoll()

jika stat == rdr.OK:

print("Kartu baru terdeteksi")

print(" – jenis tag: 0x%02x" % tag_type)

print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))

cetak (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])

mencetak("")

jika rdr.select_tag(raw_uid) == rdr.OK:

kunci = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

jika rdr.auth(rdr.AUTHENT1A, 8, kunci, raw_uid) == rdr.OK:

print(“Data alamat 8: %s” % rdr.read(8))

personal_id[idd] = raw_uid[0:4:1]

uart_write3(*raw_uid[0:4:1])

rdr.stop_crypto1()

lain:

print("Kesalahan otentikasi")

lain:

print("Gagal memilih tag")

jika uart2.any()>1:

rx2 = []

data_nama2 = ”

bin_data = uart2.baca(40)

uart2.sendbreak()

rx1 = daftar(bin_data)

untuk item di rx1:

rx2.tambahkan(chr(item))

jika rx1[3:5:1] == button_cmd:

nama_data_len = rx1[6] – 1

nama_data = rx2[7:nama_data_len+7:1]

data_name2 = ”.join(nama_data)

cetak(nama_data2)

jika data_name2 == 'back1':

kembali

kecuali KeyboardInterrupt:

print("kesalahan membaca")

def uart_write(teks, *id):

# cetak(teks, *id)

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(id)+'”}>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(teks,teks2):

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(teks,teks2):

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

sementara Benar:

jika uart2.any():

ID_pengguna = ”

kata sandi = ”

rx2 = []

rx_num = 0

bin_data = uart2.baca(40)

uart2.sendbreak()

rx1 = daftar(bin_data)

untuk item di rx1:

rx2.tambahkan(chr(item))

rx_num += 1

data_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = ”.join(data_id_st)

cetak(data_id_st2)

jika data_id_st2 == 'edit1':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = ”.join(data_id_st3)

cetak(data_id_st4)

jika data_id_st4 != ”:

nama = benar

elif data_id_st2 == 'edit2':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = ”.join(data_id_st5)

jika data_id_st6 == admin_password:

admin = benar

uart_write2('Verifikasi lulus!','Silakan letakkan kartunya!')

lakukan_baca2(data_id_st4)

kembali

def mima_zuce():

temp_id3 = ”

suhu_mima3 = ”

sementara Benar:

jika uart2.any():

ID_pengguna = ”

kata sandi = ”

rx2 = []

rx_num = 0

# data_end = 0

bin_data = uart2.baca(40)

uart2.sendbreak()

rx1 = daftar(bin_data)

untuk item di rx1:

rx2.tambahkan(chr(item))

rx_num += 1

# if (rx2[rx_num] == 'T') dan (rx2[rx_num-1] == 'E') dan (rx2[rx_num-2] == '>'):

# merusak

data_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = ”.join(data_id_st)

cetak(data_id_st2)

jika rx1[3:5:1] == button_cmd:

nama_data_len = rx1[6] – 1

nama_data = rx2[7:nama_data_len+7:1]

data_name2 = ”.join(nama_data)

cetak(nama_data2)

jika data_name2 == 'back2':

kembali

jika data_id_st2 == 'edit3':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = ”.join(data_id_st3)

cetak(data_id_st4)

user_id_flag = Benar

temp_id3 = data_id_st4

# personel_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)

cetak(data_id_st6)

# jika personel_ps.get(temp_id) == data_id_st6:

password_flag = Benar

temp_mima3 = data_id_st6

# personel_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) dan (password_flag == True) dan (user_id_flag == True):

admin = benar

personel_ps[temp_id3] = temp_mima3

password_flag = Salah

user_id_flag = Salah

uart_write4('Verifikasi lulus!','login berhasil!')

def kata sandi_loin():

temp_id2 = ”

suhu_mima = ”

sementara Benar:

jika uart2.any():

ID_pengguna = ”

kata sandi = ”

rx2 = []

rx_num = 0

# data_end = 0

bin_data = uart2.baca(40)

uart2.sendbreak()

rx1 = daftar(bin_data)

untuk item di rx1:

rx2.tambahkan(chr(item))

rx_num += 1

# if (rx2[rx_num] == 'T') dan (rx2[rx_num-1] == 'E') dan (rx2[rx_num-2] == '>'):

# merusak

data_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = ”.join(data_id_st)

cetak(data_id_st2)

jika rx1[3:5:1] == button_cmd:

nama_data_len = rx1[6] – 1

nama_data = rx2[7:nama_data_len+7:1]

data_name2 = ”.join(nama_data)

cetak(nama_data2)

jika data_name2 == 'back4':

kembali

jika data_id_st2 == 'edit5':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = ”.join(data_id_st3)

cetak(data_id_st4)

jika data_id_st4 di personel_ps:

user_id_flag = Benar

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)

cetak(data_id_st6)

cetak(temp_id2)

cetak(personel_ps)

jika personel_ps.get(temp_id2) == data_id_st6:

password_flag = Benar

# print(rx2,user_id_flag,password_flag)

cetak(user_id_flag,password_flag)

if (password_flag == True) dan (user_id_flag == True):

uart_write(temp_id2,temp_id2)

password_flag = Salah

user_id_flag = Salah

suos.nilai(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('siswa',”)

suos.nilai(0)

uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock2″,”visible”:false}>ET')

uart2.sendbreak()

sementara Benar:

jika uart2.any()>1:

rx2 = []

data_nama2 = ”

bin_data = uart2.baca(40)

# waktu.tidur(1)

uart2.sendbreak()

# waktu.tidur(1)

rx1 = daftar(bin_data)

untuk item di rx1:

rx2.tambahkan(chr(item))

cetak(rx2)

jika rx1[3:5:1] == button_cmd:

nama_data_len = rx1[6] – 1

nama_data = rx2[7:nama_data_len+7:1]

data_name2 = ”.join(nama_data)

cetak(nama_data2)

jika data_name2 == 'card1':

kartu_zhuce()

elif data_name2 == 'password1':

mima_zuce()

elif data_name2 == 'card2':

lakukan_baca()

elif data_name2 == 'password2':

kata sandi_ pinggang()

MFRC522.py

dari pin impor mesin, SPI

dari os impor uname

kelas MFRC522:

Oke = 0

PEMBERITAHUAN = 1

KESALAHAN = 2

PERSYARATAN = 0x26

PERTANYAAN = 0x52

ASLI1A = 0x60

ASLI1B = 0x61

def __init__(sendiri, sck, mosi, miso, pertama, cs):

self.sck = Pin(sck, Pin.OUT)

self.mosi = Pin(mosi, Pin.OUT)

self.miso = Pin(miso)

self.rst = Pin(pertama, Pin.OUT)

self.cs = Pin(cs, Pin.OUT)

diri.pertama.nilai(0)

diri.cs.nilai(1)

papan = unama()[0]

jika papan == 'WiPy' atau papan == 'LoPy' atau papan == 'FiPy':

diri.spi = SPI(0)

self.spi.init(SPI.MASTER, baudrate=1000000, pin=(self.sck, self.mosi, self.miso))

papan elif == 'esp32':

self.spi = SPI(baudrate=100000, polaritas=0, fase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)

diri.spi.init()

lain:

meningkatkan RuntimeError("Platform tidak didukung")

diri.pertama.nilai(1)

diri.init()

def _wreg(sendiri, reg, val):

diri.cs.nilai(0)

self.spi.write(b'%c' % int(0xff & ((reg << 1) & 0x7e)))

self.spi.write(b'%c' % int(0xff & val))

diri.cs.nilai(1)

def _rreg(sendiri, reg):

diri.cs.nilai(0)

self.spi.write(b'%c' % int(0xff & (((reg << 1) & 0x7e) | 0x80)))

val = self.spi.baca(1)

diri.cs.nilai(1)

nilai kembali[0]

def _sflags(mandiri, reg, topeng):

self._wreg(reg, self._rreg(reg) | topeng)

def _cflags(mandiri, reg, topeng):

self._wreg(reg, self._rreg(reg) & (~mask))

def _tocard(sendiri, cmd, kirim):

terima = []

bit = irq_en = wait_irq = n = 0

stat = diri.ERR

jika cmd == 0x0E:

irq_en = 0x12

tunggu_irq = 0x10

elif cmd == 0x0C:

irq_en = 0x77

tunggu_irq = 0x30

diri._wreg(0x02, irq_en | 0x80)

diri._cflags(0x04, 0x80)

self._sflags (0x0A, 0x80)

diri._wreg(0x01, 0x00)

untuk c di kirim:

diri._wreg(0x09, c)

diri._wreg(0x01, cmd)

jika cmd == 0x0C:

diri._sflags(0x0D, 0x80)

i = 2000

sementara Benar:

n = diri._rreg(0x04)

saya -= 1

jika ~((i != 0) dan ~(n & 0x01) dan ~(n & wait_irq)):

istirahat

diri._cflags(0x0D, 0x80)

jika saya:

if (self._rreg(0x06) & 0x1B) == 0x00:

stat = diri sendiri.OK

jika n & irq_en & 0x01:

stat = diri.NOTAGERR

elif cmd == 0x0C:

n = diri._rreg(0x0A)

lbs = self._rreg(0x0C) & 0x07

jika lbit != 0:

bit = (n – 1) * 8 + lbit

lain:

bit = n * 8

jika n == 0:

n = 1

elif n > 16:

n = 16

untuk _ dalam rentang (n):

recv.append(self._rreg(0x09))

lain:

stat = diri.ERR

kembali stat, recv, bit

def _crc(diri, data):

diri._cflags(0x05, 0x04)

self._sflags (0x0A, 0x80)

untuk c dalam data:

diri._wreg(0x09, c)

diri._wreg(0x01, 0x03)

saya = 0xFF

sementara Benar:

n = diri._rreg(0x05)

saya -= 1

jika tidak ((i != 0) dan tidak (n & 0x04)):

istirahat

kembali [self._rreg (0x22), self._rreg (0x21)]

def init (diri sendiri):

reset sendiri()

diri._wreg(0x2A, 0x8D)

diri._wreg(0x2B, 0x3E)

self._wreg(0x2D, ​​30)

diri._wreg(0x2C, 0)

diri._wreg(0x15, 0x40)

diri._wreg(0x11, 0x3D)

diri.antena_on()

def reset (sendiri):

diri._wreg(0x01, 0x0F)

def antena_on(diri, aktif=Benar):

jika aktif dan ~(self._rreg(0x14) & 0x03):

self._sflags (0x14, 0x03)

lain:

diri._cflags(0x14, 0x03)

permintaan def (mandiri, mode):

diri._wreg(0x0D, 0x07)

(stat, recv, bit) = self._tocard(0x0C, [mode])

if (stat != self.OK) | (bit != 0x10):

stat = diri.ERR

kembali stat, bit

def anticol (sendiri):

ser_chk = 0

ser = [0x93, 0x20]

diri._wreg(0x0D, 0x00)

(stat, recv, bit) = self._tocard(0x0C, ser)

jika stat == self.OK:

jika len(recv) == 5:

untuk i dalam kisaran (4):

ser_chk = ser_chk ^ penerimaan[i]

jika ser_chk != recv[4]:

stat = diri.ERR

lain:

stat = diri.ERR

kembali stat, recv

def select_tag(sendiri, ser):

buf = [0x93, 0x70] + ser[:5]

buf += diri._crc(buf)

(stat, recv, bit) = self._tocard(0x0C, buf)

kembalikan self.OK jika (stat == self.OK) dan (bit == 0x18) else self.ERR

def auth(diri, mode, alamat, sekte, ser):

kembalikan self._tocard(0x0E, [mode, addr] + sekte + ser[:4])[0]

def stop_crypto1(sendiri):

diri._cflags(0x08, 0x08)

def read(sendiri, addr):

data = [0x30, tambahan]

data += diri._crc(data)

(stat, penerimaan, _) = self._tocard(0x0C, data)

kembalikan recv jika stat == self.OK else Tidak ada

def menulis (diri, addr, data):

buf = [0xA0, tambahan]

buf += diri._crc(buf)

(stat, recv, bit) = self._tocard(0x0C, buf)

jika tidak (stat == self.OK) atau tidak (bits == 4) atau tidak ((recv[0] & 0x0F) == 0x0A):

stat = diri.ERR

lain:

bu = []

untuk i dalam kisaran (16):

buf.tambahkan(data[i])

buf += diri._crc(buf)

(stat, recv, bit) = self._tocard(0x0C, buf)

jika tidak (stat == self.OK) atau tidak (bits == 4) atau tidak ((recv[0] & 0x0F) == 0x0A):

stat = diri.ERR

status kembali

Sumber: Plato Data Intelligence