IOT

Kiểm soát truy cập thông minh dựa trên STONE TFT LCD và ESP32

Giới thiệu ngắn gọn

Nhà thông minh ngày càng trở nên phổ biến cùng với sự phát triển của công nghệ, bài viết này sẽ tập trung vào khía cạnh bảo mật của dự án kiểm soát truy cập thông minh.

Bài viết này sử dụng Màn hình cảm ứng của STONE để gửi lệnh đến MCU để điều khiển rơle và mô-đun MFRC522.

Nguyên tắc đọc thẻ: bằng cách điều khiển mô-đun RFID-RC522, xác định ID thẻ ID gần với thẻ ID, sau đó xác định xem ID có tồn tại trong cơ sở dữ liệu của từ điển hình hay không, ID là giá trị điển hình của từ đó, nếu sự tồn tại của xác minh thông qua , sau đó in ra tên tương ứng, sau đó điều khiển khóa điện từ theo cách tương tự.

Vật liệu cần thiết

Chức năng thực hiện

  1. đăng ký thẻ.
  2. đăng ký tên người dùng và mật khẩu.
  3. quẹt thẻ để mở khóa điện tử.
  4. Tên người dùng và mật khẩu để mở khóa khóa điện tử.

Phần cứng chính Mô tả

Mô-đun RFID

Mô-đun này có thể được tải trực tiếp vào các mô-đun đọc khác nhau. Nó sử dụng điện áp 3.3V, thông qua giao diện SPI chỉ với một vài dây. Được kết nối trực tiếp với bo mạch chủ CPU, mô-đun này có thể hoạt động ổn định và đáng tin cậy như một đầu đọc thẻ từ xa.

Kiểm soát truy cập thông minh dựa trên STONE TFT LCD và ESP32 IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
Kiểm soát truy cập thông minh dựa trên STONE TFT LCD và ESP32

STWI070WT-01 được hình thành dưới dạng màn hình TFT & bộ điều khiển cảm ứng. Nó bao gồm bộ xử lý, chương trình điều khiển, trình điều khiển, bộ nhớ flash, cổng RS232/RS422/RS485/TTL/LAN, Wi-Fi/Bluetooth, màn hình cảm ứng, nguồn điện, v.v., vì vậy đây là toàn bộ hệ thống hiển thị dựa trên sự mạnh mẽ và dễ dàng hệ điều hành, có thể được điều khiển bởi bất kỳ MCU nào.

Kiểm soát truy cập thông minh dựa trên STONE TFT LCD và ESP32 IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
Kiểm soát truy cập thông minh dựa trên STONE TFT LCD và ESP32

Thiết kế GUI

Kiểm soát truy cập thông minh dựa trên STONE TFT LCD và ESP32 IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
Kiểm soát truy cập thông minh dựa trên STONE TFT LCD và ESP32

Chia sẽ mã

Kiểm soát truy cập thông minh dựa trên STONE TFT LCD và ESP32 IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
Kiểm soát truy cập thông minh dựa trên STONE TFT LCD và ESP32

nhập khẩu mfrc522

thời gian nhập khẩu

nhập _thread

từ uname nhập hệ điều hành

từ máy nhập Pin, UART

#from pyb nhập UART

#máy nhập khẩu

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 = Sai

mật khẩu_flag = Sai

temp_id = ”

temp_mima = ”

nhân sự_id = {'zbw':[236,230,169,47],'lbw':[19,165,93,4]}

nhân sự_ps = {'zbw':'zbw3366′,'lbw':'lbwnb'}

admin_password = ('yyds')

nút_cmd = [16,1]

edit1_cmd = [16,112]

edit2_cmd = [16,113]

edit3_cmd = [16,114]

nếu uname()[0] == 'esp32':

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

chắc chắn do_write():

thử:

(stat, tag_type) = rdr.request(rdr.REQIDL)

nếu chỉ số == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

nếu chỉ số == rdr.OK:

print(“Đã phát hiện thấy thẻ mới”)

print(” – loại thẻ: 0x%02x” % tag_type)

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

in("")

nếu rdr.select_tag(raw_uid) == rdr.OK:

khóa = [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()

nếu chỉ số == rdr.OK:

print(“Dữ liệu ghi vào thẻ”)

khác:

print(“Ghi dữ liệu vào thẻ không thành công”)

khác:

print(“Lỗi xác thực”)

khác:

print(“Không chọn được thẻ”)

ngoại trừ Bàn phímInterrupt:

print(“lỗi ghi”)

chắc chắn do_read():

trong khi Đúng:

thử:

(stat, tag_type) = rdr.request(rdr.REQIDL)

nếu chỉ số == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

nếu chỉ số == rdr.OK:

print(“Đã phát hiện thấy thẻ mới”)

print(” – loại thẻ: 0x%02x” % tag_type)

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

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

in("")

nếu rdr.select_tag(raw_uid) == rdr.OK:

khóa = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:

print(“Dữ liệu địa chỉ 8: %s” % rdr.read(8))

cho ps trong human_id:

nếu raw_uid[0:4:1] == human_id.get(ps):

suos.value(1)

in (ps)

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

thời gian ngủ (3)

uart2.sendbreak ()

phá vỡ

rdr.stop_crypto1()

thời gian ngủ (3)

suos.value(0)

khác:

print(“Lỗi xác thực”)

khác:

print(“Không chọn được thẻ”)

nếu uart2.any ()> 1:

rx2 = []

data_name2 =”

bin_data = uart2.read (40)

uart2.sendbreak ()

rx1 = list (bin_data)

cho mục trong rx1:

rx2.append (chr (item))

in (rx2)

nếu 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)

nếu data_name2 == 'back3':

trở lại

ngoại trừ Bàn phímInterrupt:

print(“lỗi đọc”)

def do_read2 (idd):

in(idd)

trong khi Đúng:

thử:

(stat, tag_type) = rdr.request(rdr.REQIDL)

nếu chỉ số == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

nếu chỉ số == rdr.OK:

print(“Đã phát hiện thấy thẻ mới”)

print(” – loại thẻ: 0x%02x” % tag_type)

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

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

in("")

nếu rdr.select_tag(raw_uid) == rdr.OK:

khóa = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:

print(“Dữ liệu địa chỉ 8: %s” % rdr.read(8))

nhân sự_id[idd] = raw_uid[0:4:1]

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

rdr.stop_crypto1()

khác:

print(“Lỗi xác thực”)

khác:

print(“Không chọn được thẻ”)

nếu uart2.any ()> 1:

rx2 = []

data_name2 =”

bin_data = uart2.read (40)

uart2.sendbreak ()

rx1 = list (bin_data)

cho mục trong rx1:

rx2.append (chr (item))

nếu 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)

nếu data_name2 == 'back1':

trở lại

ngoại trừ Bàn phímInterrupt:

print(“lỗi đọc”)

def uart_write(văn bản, *id):

# in(văn bản, *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(ids)+'”}>ET' )

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

thời gian ngủ (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(văn bản,văn bản2):

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”'+text+'”}>ET')

thời gian ngủ (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' )

thời gian ngủ (3)

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”””}>ET')

def uart_write4(văn bản,văn bản2):

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”login”,”text”:”'+text+'”}>ET')

thời gian ngủ (1)

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”login”,”text”:”'+text2+'”}>ET')

thời gian ngủ (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')

chắc chắn uart_write5():

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”'+str(id2)+'”}>ET' )

thời gian ngủ (3)

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”””}>ET')

thẻ def_zhuce():

trong khi Đúng:

nếu uart2.any():

user_id = ”

mật khẩu = ”

rx2 = []

rx_num = 0

bin_data = uart2.read (40)

uart2.sendbreak ()

rx1 = list (bin_data)

cho mục trong rx1:

rx2.append (chr (item))

rx_num += 1

dữ liệu_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = ”.join(data_id_st)

in(data_id_st2)

nếu data_id_st2 == 'edit1':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = ”.join(data_id_st3)

in(data_id_st4)

nếu data_id_st4 != ”:

tên = Đúng

dữ liệu Elif_id_st2 == 'edit2':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = ”.join(data_id_st5)

nếu data_id_st6 == admin_password:

quản trị viên = Đúng

uart_write2('Xác minh đã thành công!','Vui lòng đặt thẻ!')

do_read2(data_id_st4)

trở lại

chắc chắn mima_zuce():

temp_id3 = ”

temp_mima3 = ”

trong khi Đúng:

nếu uart2.any():

user_id = ”

mật khẩu = ”

rx2 = []

rx_num = 0

# dữ liệu_end = 0

bin_data = uart2.read (40)

uart2.sendbreak ()

rx1 = list (bin_data)

cho mục trong rx1:

rx2.append (chr (item))

rx_num += 1

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

# phá vỡ

dữ liệu_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = ”.join(data_id_st)

in(data_id_st2)

nếu 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)

nếu data_name2 == 'back2':

trở lại

nếu data_id_st2 == 'edit3':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = ”.join(data_id_st3)

in(data_id_st4)

user_id_flag = Đúng

temp_id3 = dữ liệu_id_st4

# nhân_ps[temp_id] = raw_uid[0:4:1]

dữ liệu Elif_id_st2 == 'edit4':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = ”.join(data_id_st5)

in(data_id_st6)

# if HR_ps.get(temp_id) == data_id_st6:

mật khẩu_flag = Đúng

temp_mima3 = data_id_st6

# nhân_ps[temp_id] = mật khẩu_flag

# print(rx2,user_id_flag,password_flag)

dữ liệu Elif_id_st2 == 'edit7':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = ”.join(data_id_st5)

nếu (data_id_st6 == admin_password) và (password_flag == True) và (user_id_flag == True):

quản trị viên = Đúng

nhân sự_ps[temp_id3] = temp_mima3

mật khẩu_flag = Sai

user_id_flag = Sai

uart_write4('Xác minh đã thành công!','đăng nhập thành công!')

xác định mật khẩu_loin():

temp_id2 = ”

temp_mima = ”

trong khi Đúng:

nếu uart2.any():

user_id = ”

mật khẩu = ”

rx2 = []

rx_num = 0

# dữ liệu_end = 0

bin_data = uart2.read (40)

uart2.sendbreak ()

rx1 = list (bin_data)

cho mục trong rx1:

rx2.append (chr (item))

rx_num += 1

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

# phá vỡ

dữ liệu_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = ”.join(data_id_st)

in(data_id_st2)

nếu 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)

nếu data_name2 == 'back4':

trở lại

nếu data_id_st2 == 'edit5':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = ”.join(data_id_st3)

in(data_id_st4)

nếu data_id_st4 trong nhân sự_ps:

user_id_flag = Đúng

temp_id2 = dữ liệu_id_st4

dữ liệu Elif_id_st2 == 'edit6':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = ”.join(data_id_st5)

in(data_id_st6)

in(temp_id2)

in(nhân sự_ps)

nếu HR_ps.get(temp_id2) == data_id_st6:

mật khẩu_flag = Đúng

# print(rx2,user_id_flag,password_flag)

in(user_id_flag,password_flag)

nếu (password_flag == True) và (user_id_flag == True):

uart_write(temp_id2,temp_id2)

mật khẩu_flag = Sai

user_id_flag = Sai

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

thời gian ngủ (3)

# uart_write('sinh viên',")

suos.value(0)

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

uart2.sendbreak ()

trong khi Đúng:

nếu uart2.any ()> 1:

rx2 = []

data_name2 =”

bin_data = uart2.read (40)

# thời gian ngủ(1)

uart2.sendbreak ()

# thời gian ngủ(1)

rx1 = list (bin_data)

cho mục trong rx1:

rx2.append (chr (item))

in (rx2)

nếu 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)

nếu data_name2 == 'card1':

card_zhuce()

Elif data_name2 == 'password1':

mima_zuce()

dữ liệu Elif_name2 == 'card2':

do_read()

Elif data_name2 == 'password2':

mật khẩu_loin()

MFRC522.py

từ máy nhập Pin, SPI

từ uname nhập hệ điều hành

lớp MFRC522:

được = 0

NOTAGERR = 1

LỖI = 2

REQIDL = 0x26

YÊU CẦU = 0x52

TÁC GIẢ1A = 0x60

TÁC GIẢ1B = 0x61

def __init__(self, sck, mosi, miso, rst, cs):

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

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

self.miso = Pin(miso)

self.rst = Pin(đầu tiên, Pin.OUT)

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

self.rst.value(0)

self.cs.value(1)

bảng = uname()[0]

nếu bảng == 'WiPy' hoặc bảng == 'LoPy' hoặc bảng == 'FiPy':

self.spi = SPI(0)

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

bảng Elif == 'esp32':

self.spi = SPI(tốc độ truyền=100000, phân cực=0, pha=0, sck=self.sck, mosi=self.mosi, miso=self.miso)

self.spi.init()

khác:

raise RuntimeError(“Nền tảng không được hỗ trợ”)

self.rst.value(1)

tự.init()

def _wreg(self, reg, val):

self.cs.value(0)

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

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

self.cs.value(1)

def _rreg(tự, reg):

self.cs.value(0)

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

val = self.spi.read(1)

self.cs.value(1)

trả lại giá trị [0]

def _sflags(tự, reg, mặt nạ):

self._wreg(reg, self._rreg(reg) | mặt nạ)

def _cflags(tự, reg, mặt nạ):

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

def _tocard(self, cmd, send):

recv = []

bit = irq_en = wait_irq = n = 0

stat = self.ERR

nếu cmd == 0x0E:

irq_en = 0x12

chờ_irq = 0x10

Elif cmd == 0x0C:

irq_en = 0x77

chờ_irq = 0x30

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

self._cflags(0x04, 0x80)

self._sflags(0x0A, 0x80)

self._wreg(0x01, 0x00)

cho c gửi:

self._wreg(0x09, c)

self._wreg(0x01, cmd)

nếu cmd == 0x0C:

self._sflags(0x0D, 0x80)

i = 2000

trong khi Đúng:

n = self._rreg(0x04)

tôi -= 1

nếu ~((i != 0) và ~(n & 0x01) và ~(n & wait_irq)):

phá vỡ

self._cflags(0x0D, 0x80)

nếu tôi:

nếu (self._rreg(0x06) & 0x1B) == 0x00:

stat = tự.OK

nếu n & irq_en & 0x01:

stat = self.NOTAGERR

Elif cmd == 0x0C:

n = self._rreg(0x0A)

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

nếu lbits != 0:

bit = (n – 1) * 8 + lbits

khác:

bit = n * 8

nếu n == 0:

n = 1

Elif n > 16:

n = 16

cho _ trong range (n):

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

khác:

stat = self.ERR

trả về stat, recv, bit

def _crc(tự, dữ liệu):

self._cflags(0x05, 0x04)

self._sflags(0x0A, 0x80)

cho c trong dữ liệu:

self._wreg(0x09, c)

self._wreg(0x01, 0x03)

tôi = 0xFF

trong khi Đúng:

n = self._rreg(0x05)

tôi -= 1

nếu không ((i != 0) và không (n & 0x04)):

phá vỡ

trả về [self._rreg(0x22), self._rreg(0x21)]

def init(tự):

tự.reset()

self._wreg(0x2A, 0x8D)

self._wreg(0x2B, 0x3E)

self._wreg(0x2D, ​​30)

self._wreg(0x2C, 0)

self._wreg(0x15, 0x40)

self._wreg(0x11, 0x3D)

self.antenna_on()

thiết lập lại def (tự):

self._wreg(0x01, 0x0F)

def anten_on(self, on=True):

nếu bật và ~(self._rreg(0x14) & 0x03):

self._sflags(0x14, 0x03)

khác:

self._cflags(0x14, 0x03)

yêu cầu def (tự, chế độ):

self._wreg(0x0D, 0x07)

(stat, recv, bit) = self._tocard(0x0C, [chế độ])

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

stat = self.ERR

trả về chỉ số, bit

def anticoll(tự):

ser_chk = 0

ser = [0x93, 0x20]

self._wreg(0x0D, 0x00)

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

nếu stat == self.OK:

nếu len(recv) == 5:

cho tôi trong phạm vi (4):

ser_chk = ser_chk ^ recv[i]

nếu ser_chk != recv[4]:

stat = self.ERR

khác:

stat = self.ERR

trả về stat, recv

def select_tag(self, ser):

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

buf += self._crc(buf)

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

trả về self.OK nếu (stat == self.OK) và (bit == 0x18) nếu không thì self.ERR

def auth(self, mode, addr, sect, ser):

trả về self._tocard(0x0E, [mode, addr] + sect + ser[:4])[0]

def stop_crypto1(tự):

self._cflags(0x08, 0x08)

def đọc(self, addr):

dữ liệu = [0x30, addr]

dữ liệu += self._crc(dữ liệu)

(stat, recv, _) = self._tocard(0x0C, dữ liệu)

trả về recv nếu stat == self.OK khác Không có

def write(self, addr, data):

buf = [0xA0, addr]

buf += self._crc(buf)

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

nếu không (stat == self.OK) hay không (bit == 4) hay không ((recv[0] & 0x0F) == 0x0A):

stat = self.ERR

khác:

buf = []

cho tôi trong phạm vi (16):

buf.append(dữ liệu[i])

buf += self._crc(buf)

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

nếu không (stat == self.OK) hay không (bit == 4) hay không ((recv[0] & 0x0F) == 0x0A):

stat = self.ERR

chỉ số trở lại

Nguồn: Plato Data Intelligence