You are on page 1of 87

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.

HỒ CHÍ MINH
KHOA ĐIỆN – ĐIỆN TỬ
----------

BÁO CÁO ĐỒ ÁN 1
ĐỀ TÀI:

THIẾT KẾ KHÓA CỬA ĐIỆN TỬ

Giảng viên hướng dẫn: PGS.TS Phan Văn Ca


Sinh viên thực hiện: Phạm Trần Siêu
Mã số sinh viên: 19161282

Tp. Hồ Chí Minh, tháng 6 năm 2022.


TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP. HỒ CHÍ MINH
KHOA ĐIỆN – ĐIỆN TỬ
----------

BÁO CÁO ĐỒ ÁN 1
ĐỀ TÀI:

THIẾT KẾ KHÓA CỬA ĐIỆN TỬ

Giảng viên hướng dẫn: PGS.TS Phan Văn Ca


Sinh viên thực hiện: Phạm Trần Siêu
Mã số sinh viên: 19161282

Tp. Hồ Chí Minh, tháng 6 năm 2022.


MỤC LỤC

MỤC LỤC ................................................................................................................... i


DANH MỤC HÌNH ẢNH ........................................................................................ iii
DANH MỤC BẢNG BIỂU ....................................................................................... v
LIỆT KÊ TỪ VIẾT TẮT......................................................................................... vi
Chương 1 GIỚI THIỆU............................................................................................ 1

1.1. ĐẶT VẤN ĐỀ .................................................................................................. 1


1.2. MỤC TIÊU ĐỀ TÀI ......................................................................................... 1
1.3. NỘI DUNG THỰC HIỆN ................................................................................ 2
1.4. KẾT QUẢ ĐẠT ĐƯỢC ................................................................................... 2
1.5. BỐ CỤC CỦA BÁO CÁO ............................................................................... 2

Chương 2 CƠ SỞ LÝ THUYẾT .............................................................................. 3

2.1. GIỚI THIỆU VI ĐIỀU KHIỂN ATMEGA328P ............................................. 3

2.1.1. Giới thiệu chung ......................................................................................... 3


2.1.2. Thông số kỹ thuật ....................................................................................... 4
2.1.3. Ứng dụng .................................................................................................... 4
2.1.3. Arduino Uno R3 SMD ............................................................................... 4

2.2. CÔNG NGHỆ RFID ......................................................................................... 6

2.2.1. Giới thiệu chung ......................................................................................... 6


2.2.2. Các thành phần của hệ thống RFID ........................................................... 6
2.2.3. Cách thức hoạt động ................................................................................... 8

2.3. MỘT SỐ CHUẦN TRUYỀN THÔNG CÓ DÂY............................................ 8

2.3.1. Chuẩn truyền thông SPI ............................................................................. 8


2.3.2. Chuẩn truyền thông I2C ........................................................................... 11

Chương 3 THIẾT KẾ HỆ THỐNG ....................................................................... 15


i
3.1. YÊU CẦU NGƯỜI DÙNG ............................................................................ 15
3.2. YÊU CẦU KỸ THUẬT ................................................................................. 15

3.2.1. Chức năng kỹ thuật................................................................................... 15


3.2.2. Thông số kỹ thuật ..................................................................................... 15

3.3. SƠ ĐỒ KHỐI CỦA HỆ THỐNG ................................................................... 16


3.4. THIẾT KẾ CHI TIẾT ..................................................................................... 17

3.4.1. Khối nhập mật khẩu ................................................................................. 17


3.4.2. Khối nhập đọc thẻ..................................................................................... 17
3.4.3. Khối nhập thực thi .................................................................................... 19
3.4.4. Khối nhập hiển thị .................................................................................... 19
3.4.5. Khối nhập cảnh báo .................................................................................. 20
3.4.6. Khối nhập xử lý trung tâm ....................................................................... 21
3.4.7. Khối nguồn ............................................................................................... 22
3.4.8. Sơ đồ nguyên lý và sơ đồ nối dây toàn mạch ........................................... 23

3.5. THIẾT KẾ PHẦN MỀM ................................................................................ 24

3.5.1. Lưu đồ giải thuật ...................................................................................... 24


3.5.2. Mã nguồn chương trình ............................................................................ 38

Chương 4 THI CÔNG HỆ THỐNG VÀ ĐÁNH GIÁ KẾT QUẢ ...................... 43


Chương 5 KẾT LUẬN ............................................................................................ 55
TÀI LIỆU THAM KHẢO ...................................................................................... 56
PHỤ LỤC ................................................................................................................. 57

ii
DANH MỤC HÌNH ẢNH

Hình 2.1: Vi điều khiển Atmega328P dạng chip cắm................................................ 3


Hình 2.2: Vi điều khiển Atmega328P dạng chip dán ................................................ 3
Hình 2.3: Arduino Uno R3 SMD ............................................................................... 5
Hình 2.4: Cách thức hoạt động của công nghệ RFID ................................................ 8
Hình 2.5: Giao tiếp SPI một Master với một Slave ................................................. 10
Hình 2.6: Giao tiếp SPI một Master với nhiều Slave ............................................... 11
Hình 2.7: Giao tiếp I2C ............................................................................................ 12
Hình 2.8: Truyền dữ liệu trong giao tiếp I2C .......................................................... 14
Hình 3.1: Sơ đồ khối của hệ thống ........................................................................... 16
Hình 3.2: Sơ đồ nguyên lý toàn mạch ...................................................................... 23
Hình 3.3: Sơ đồ nối dây toàn mạch .......................................................................... 24
Hình 3.4: Lưu đồ giải thuật chương trình chính ...................................................... 25
Hình 3.5: Lưu đồ giải thuật chương trình xác thực mật khẩu .................................. 26
Hình 3.6: Lưu đồ giải thuật chương trình xác thực thẻ ............................................ 28
Hình 3.7: Lưu đồ giải thuật chương trình so sánh ID thẻ ........................................ 30
Hình 3.8: Lưu đồ giải thuật chương trình quản lý ................................................... 31
Hình 3.9: Lưu đồ giải thuật chương trình đổi mật khẩu .......................................... 32
Hình 3.10: Lưu đồ giải thuật chương trình thêm thẻ ............................................... 34
Hình 3.11: Lưu đồ giải thuật chương trình xóa thẻ.................................................. 36
Hình 3.12: Lưu đồ giải thuật chương trình báo động .............................................. 38
Hình 3.13: Mã nguồn chương trình chính (a) .......................................................... 39
Hình 3.14: Mã nguồn chương trình chính (b) .......................................................... 40
Hình 3.15: Mã nguồn chương trình chính (c) .......................................................... 40
Hình 3.16: Mã nguồn chương trình chính (d) .......................................................... 41
Hình 3.17: Mã nguồn chương trình chính (e) .......................................................... 41
Hình 3.18: Mã nguồn chương trình chính (f) ........................................................... 42

iii
Hình 3.19: Mã nguồn chương trình chính (g) .......................................................... 42
Hình 4.1: Hệ thống hoàn chỉnh (a) ........................................................................... 43
Hình 4.2: Hệ thống hoàn chỉnh (b)........................................................................... 44
Hình 4.3: Chi tiết bên trong hệ thống....................................................................... 45
Hình 4.4: Giao diện màn hình khi chọn chế độ mở khóa bằng mật khẩu ................ 46
Hình 4.5: Giao diện màn hình khi chọn chế độ mở khóa bằng thẻ .......................... 46
Hình 4.6: Giao diện màn hình khi nhập đúng mật khẩu hoặc nhập đúng thẻ .......... 47
Hình 4.7: Trạng thái của chốt cửa khi nhập đúng mật khẩu hoặc nhập đúng thẻ .... 47
Hình 4.8: Giao diện màn hình khi nhập sai mật khẩu .............................................. 48
Hình 4.9: Giao diện màn hình khi nhập sai mật khẩu nhiều lần .............................. 48
Hình 4.10: Giao diện màn hình khi truy cập vào chương trình quản lý (a) ............. 49
Hình 4.11: Giao diện màn hình khi truy cập vào chương trình quản lý (b) ............. 49
Hình 4.12: Giao diện màn hình khi truy cập vào chương trình quản lý (c) ............. 50
Hình 4.13: Giao diện màn hình khi truy cập vào chương trình quản lý (d) ............. 50
Hình 4.14: Giao diện màn hình khi đổi mật khẩu thành công ................................. 51
Hình 4.15: Giao diện màn hình khi xác nhận mật khẩu sai mới .............................. 51
Hình 4.16: Giao diện màn hình khi thêm thẻ thành công ........................................ 52
Hình 4.17: Giao diện màn hình khi thêm thẻ đã có trong hệ thống ......................... 52
Hình 4.18: Giao diện màn hình khi xóa thẻ thành công .......................................... 53
Hình 4.19: Giao diện màn hình khi xóa thẻ thành công .......................................... 53
Hình 4.20: Giao diện màn hình khi xóa thẻ không có trong hệ thống ..................... 54

iv
DANH MỤC BẢNG BIỂU

Bảng 2.1 Thông số kỹ thuật của vi điều khiến Atmega328P ..................................... 4


Bảng 2.2 Thông số kỹ thuật của Arduino Uno R3 SMD ........................................... 6
Bảng 3.1 Liệt kê các linh kiện phù hợp cho khối nhập mật khẩu ............................ 17
Bảng 3.2 Liệt kê các linh kiện phù hợp cho khối đọc thẻ ........................................ 18
Bảng 3.3 Liệt kê các linh kiện phù hợp cho khối thực thi ....................................... 19
Bảng 3.4 Liệt kê các linh kiện phù hợp cho khối hiển thị ....................................... 20
Bảng 3.5 Liệt kê các linh kiện phù hợp cho khối cảnh báo ..................................... 21
Bảng 3.6 Liệt kê các linh kiện phù hợp cho khối xử lý trung tâm ........................... 22

v
LIỆT KÊ TỪ VIẾT TẮT

ACK Acknowledged
ADC Analog - to - Digital Converters
CS Chip Select
DAC Digital - to - Analog Converters
EEPROM Electrically Erasable Programmable Read Only Memory
I2C Inter Integrated Circuit
IC Integrated Circuit
LCD Liquid Crystal Display
MISO Master Input Slave Output
MOSI Master Output Slave Input
MMC Multi Media Card
NACK Not Acknowledged
RFID Radio Frequency Identification
RISC Reduced Instructions Set Computer
RTC Real Time Clock
SCL Serial Clock Line
SCLK Serial Clock
SD Secure Digital
SDA Serial Data Line
SMD Surface Mount Device
SPI Serial Peripheral Interface
SRAM Static Random Access Memory
SS Slave Select
UART Universal Asynchronous Receiver Transmitter

vi
USART Universal Synchronous Asynchronous Receiver Transmitter

vii
Chương 1 GIỚI THIỆU

1.1. ĐẶT VẤN ĐỀ

Sự phát triển mạnh mẽ của xã hội kéo theo sự đi lên không ngừng của nhiều lĩnh
vực, và có thể kể đến các ngành, nghề trong lĩnh vực khoa học – kỹ thuật như: điện,
điện tử, tự động… Khi đó, người ta dễ dàng sản xuất ra các sản phẩm, thiết bị phục
vụ tốt nhu cầu của mọi người như: máy hút bụi, máy rửa bát tự động, máy rửa tay tự
động, máy đo thân nhiệt…, trong đó có khóa cửa điện tử, cụ thể ở mỗi gia đình, công
ty, cơ quan việc bảo vệ tài sản là vô cùng quan trọng. Với một số cách như sử dụng
khóa cửa, lắp camera an ninh, hệ thống chống trộm nhưng có lẽ khóa cửa là thiết bị
thông dụng nhất. Hiện nay trên thị trường có nhiều loại khóa như khóa cơ truyền
thống, khóa điện tử, nhưng khóa cơ truyền thống có độ an toàn không cao, dễ bị phá
bởi chìa khóa vạn năng, kìm cắt sắt,… còn đối với khóa điện tử tuy an toàn hơn nhưng
giá thành tương đối cao.
Từ những vấn đề trên cùng với những kiến thức đã học tôi quyết định thực hiện
đề tài “Thiết kế khóa cửa điện tử” nhằm thiết kế ra một loại khóa vừa an toàn vừa phù
hợp với túi tiền của mọi người.

1.2. MỤC TIÊU ĐỀ TÀI

Vận dụng các kiến thức vốn có và các kỹ năng đọc, phân tích tài liệu để tìm hiểu
các lý thuyết có liên quan đến đề tài, từ đó có thể thi công hoàn thiện sản phẩm và
cuốn báo cáo đồ án 1.
Ứng dụng được các kiến thức đã được học từ các môn như: ngôn ngữ lập trình C,
các môn lý thuyết và thực tập vi xử lý… để hoàn thành đề tài “Thiết kế khóa cửa điện
tử”.

1
1.3. NỘI DUNG THỰC HIỆN

Nội dung thực hiện của đề tài gồm đưa ra nhu cầu người dùng, yêu cầu kỹ thuật,
chức năng kỹ thuật, thông số kỹ thuật, thiết kế kiến trúc, thiết kế sơ đồ khối hệ thống,
thiết kế chi tiết, chọn linh kiện, thiết kế sơ đồ nguyên lý, thiết kế phần mềm, thiết kế
lưu đồ giải thuật, viết chương trình và tiến hành thi công hệ thống.

1.4. KẾT QUẢ ĐẠT ĐƯỢC

Qua quá trình thực hiện đã đạt được mục tiêu như ban đầu đã đề ra là thiết kế và
thi công thành công khóa cửa điện tử.

1.5. BỐ CỤC CỦA BÁO CÁO

Báo cáo được chia thành 5 chương, cụ thể như sau:


Chương 1 Giới thiệu
Trình bày phần đặt vấn đề, mục tiêu đề tài, nội dung thực hiện, kết quả đạt được
và bố cục bao cáo.
Chương 2 Cơ sở lý thuyết
Tìm hiểu về vi điều khiển Atemega328P, công nghệ RFID và một số chuẩn truyền
thông có dây.
Chương 3 Thiết kế hệ thống
Đưa ra nhu cầu người dùng, yêu cầu kỹ thuật, chức năng kỹ thuật, thông số kỹ
thuật, thiết kế kiến trúc, thiết kế sơ đồ khối hệ thống, thiết kế chi tiết, chọn linh kiện,
thiết kế sơ đồ nguyên lý, thiết kế phần mềm, thiết kế lưu đồ giải thuật, viết chương
trình.
Chương 4 Thi công hệ thống và đánh giá kết quả
Tiến hành thi công hệ thống dựa vào thiết kế đã đưa ra và sau đó đánh già hệ thống.
Chương 5 Kết luận
Đưa ra kết luận và hướng phát triển của đề tài.

2
Chương 2 CƠ SỞ LÝ THUYẾT

2.1. GIỚI THIỆU VI ĐIỀU KHIỂN ATMEGA328P

2.1.1. Giới thiệu chung

Atmega328P là một vi điều khiển hiệu suất cao, công suất thấp từ Microchip.
Atmega328P là vi điều khiển 8 bit dựa trên kiến trúc AVR RISC. Nó là loại phổ biến
nhất trong số tất cả các bộ điều khiển AVR vì nó được sử dụng trong các bo mạch
Arduino. Vi điều khiền này có 2 dạng là chip cắm và chip dán được thể hiện như hình
2.1, 2.2 bên dưới.

Hình 2.1: Vi điều khiển Atmega328P dạng chip cắm.

Hình 2.2: Vi điều khiển Atmega328P dạng chip dán.


3
2.1.2. Thông số kỹ thuật

Thông số kỹ thuật của vi điều khiến Atmega328P được thể hiện như bảng 2.1 bên
dưới.
Bảng 2.1 Thông số kỹ thuật của vi điều khiến Atmega328P [3].
Thông số Mô tả
Kích thước lõi 8 bit
Tốc độ tối đa 20 MHz
Hỗ trợ kết nối I2C, SPI, UART/USART
Số chân I/O 23
Loại bộ nhớ Flash
Dung lượng bộ nhớ 32 KB
Dung lượng bộ nhớ EEPROM 1 KB
Dung lượng bộ nhớ SRAM 2 KB
Điện áp hoạt động 1.8 – 5.5 V

2.1.3. Ứng dụng

ATmega328 thường được sử dụng trong nhiều dự án, nơi cần một bộ điều khiển
vi mô đơn giản, công suất thấp, chi phí thấp. Có lẽ cách triển khai phổ biến nhất của
chip này là trên nền tảng phát triển Arduino phổ biến, cụ thể là các mô hình Arduino
Uno, Arduino Pro Mini và Arduino Nano.

2.1.3. Arduino Uno R3 SMD

Arduino Uno R3 SMD là một họ trong dòng Arduino Uno. Dòng này khá phổ biến
và được sử dụng rộng rãi để làm nhiều dự án ứng dụng trong học tập cũng như sản
phẩm thực tế.
Arduino Uno R3 SMD có kích thước nhỏ, gọn với chiều dài là 68.6mm, chiều rộng
là 53.4mm, khối lượng là 25g. Dưới đây là một số thành phần chính trên board
Arduino Uno R3 SMD được thể hiện như hình 2.3.

4
Hình 2.3: Arduino Uno R3 SMD.
Thông số kỹ thuật của Arduino Uno R3 SMD được thể hiện như bảng 2.2 bên
dưới.

5
Bảng 2.2 Thông số kỹ thuật của Arduino Uno R3 SMD [4].
Thông số Mô tả
Vi điều khiển Atmega328P
Tốc độ 16 MHz
Chip nạp CH340
Số chân Digital 14
Số chân Analog 6
Dung lượng bộ nhớ Flash 32 KB
Dung lượng bộ nhớ SRAM 2 KB
Dung lượng bộ nhớ EEPROM 1 KB
Điện áp hoạt động 5V
Điện áp hoạt động khuyên dùng 7–9V
Dòng ra tối đa trên chân Digital 40 mA

2.2. CÔNG NGHỆ RFID

2.2.1. Giới thiệu chung

Công nghệ RFID được biết là công nghệ nhận dạng tần số vô tuyến, RFID là viết
tắt của Radio Frequency Identification. Công nghệ này cho phép một thiết bị đọc
thông tin chứa trong chip không tiếp xúc trực tiếp ở khoảng cách xa. Công nghệ này
cho ta phương pháp truyền nhận dữ liệu giữa điểm khác nhau. Truyền thông không
dây trong dải tần sóng vô tuyến được sử dụng trong công nghệ này để truyền dữ liệu
từ thẻ đến bộ đọc [1].

2.2.2. Các thành phần của hệ thống RFID

Công nghệ RFID bao gồm bốn thành phần như thẻ RFID, ăng-ten, bộ thu RFID
(bộ thu phát) và phần mềm.

 Thẻ RFID

6
Thẻ RFID là một thiết bị nhỏ bao gồm một vi mạch điện tử được nhúng bên trong
và một ăng-ten. Vi mạch có số nhận dạng duy nhất của thẻ RFID. Thẻ RFID thụ
động không có nguồn điện; nó sẽ nhận điện từ tín hiệu vô tuyến truyền từ bộ thu
RFID. Các thẻ này sẽ hoạt động khi người đọc ở gần các thẻ (không bắt buộc phải
có đường ngắm). Cuộn dây anten sẽ đóng vai trò là nguồn điện và phương tiện
truyền dữ liệu đến đầu đọc.
Các loại thẻ:

 Thẻ bị động: không có nguồn điện, sử dụng nguồn từ đầu đọc để hoạt động.
Thẻ bị động hỗ trợ pin: Chip mạch logic sử dụng năng lượng pin. Cần tín hiệu
RF từ đầu đọc để kích hoạt và hoạt động.
 Thẻ chủ động: sử dụng nguồn điện như pin, không cần nguồn từ nguồn/đầu
đọc.
 Ăng-ten
Ăng ten RFID được thiết kế để hoạt động ở một tần số cụ thể cho từng ứng dụng
mà nó hoạt động. Các ăng-ten này thường được gắn trên đầu đọc RFID và dễ dàng
truy cập để các thẻ gõ vào nó. Trong một số thiết bị cầm tay, ăng-ten thường được
gắn vào thiết bị. Kích thước và hình dạng của ăng-ten phụ thuộc vào ứng dụng và
tần số hoạt động của hệ thống.
 Đầu đọc RFID

Đầu đọc RFID là một trong những thành phần phần cứng quan trọng trong hệ
thống RFID có chức năng đọc thông tin từ các thiết bị/thẻ RFID và được kết nối
với mạng để chuyển thông tin đến cơ sở dữ liệu.

 Phần mềm

Công nghệ RFID sử dụng phần mềm cụ thể phụ thuộc vào nhà cung cấp dịch vụ.
Phần mềm này điều khiển trình đọc RFID, bắt đầu quét và lấy thông tin từ các thẻ
và lưu trữ thông tin vào máy tính cục bộ hoặc gửi đến bộ nhớ đám mây. Thẻ RFID
có thể được xóa và sử dụng lại bằng phần mềm điều khiển.

7
2.2.3. Cách thức hoạt động

Hình 2.4: Cách thức hoạt động của công nghệ RFID.
Hình 2.4 mô tả cách thức hoạt động của công nghệ RFID, công nghệ này hoạt
động dựa trên nguyên lý ghép cảm ứng bao gồm anten nguồn và anten thu. Mỗi thẻ
RFID sẽ có một vi mạch chứa số nhận dạng duy nhất, kiểu máy, ngày sản xuất, ngày
hết hạn, thông tin truy cập, v.v.…
Đọc RFID là một quá trình truy cập thông tin của thẻ bằng cách sử dụng một trình
đọc. Khi người dùng bắt đầu quét, các thẻ được đặt gần đầu đọc RFID hoặc ngược lại.
Đầu đọc RFID gửi tín hiệu tần số vô tuyến bằng cách sử dụng ăng-ten của nó, các
cuộn dây nhỏ được nhúng trên thẻ RFID nhận tín hiệu từ đầu đọc và kích hoạt thẻ
(trong thẻ thụ động) bằng cách cấp nguồn cho nó.
Khi thẻ được kích hoạt, nó bắt đầu truyền dữ liệu trở lại đầu đọc bằng cách sử
dụng cùng các cuộn dây ăng-ten bằng phương pháp ghép quy nạp (khớp nối tán xạ
ngược).

2.3. MỘT SỐ CHUẦN TRUYỀN THÔNG CÓ DÂY

2.3.1. Chuẩn truyền thông SPI

2.3.1.1. Giới thiệu chung

8
SPI là viết tắt của Serial Peripheral Interface, SPI là là một giao thức truyền thông
nối tiếp đồng bộ cung cấp truyền thông song công với tốc độ rất cao. SPI là một giao
thức kiểu chủ - tớ cung cấp một giao diện đơn giản và chi phí thấp giữa vi điều khiển
và các thiết bị ngoại vi của nó. SPI thường được sử dụng để giao tiếp bộ vi xử lý hoặc
vi điều khiển với bộ nhớ như EEPROM, RTC (Real Time Clock), ADC (Analog - to
- Digital Converters), DAC (Digital - to - Analog Converters), các màn hình như LCD,
IC âm thanh, các cảm biến như nhiệt độ và áp suất, thẻ nhớ như MMC hoặc SD Cards
hoặc thậm chí là các bộ vi điều khiển khác [2].
Đối với giao tiếp khoảng cách ngắn, giao tiếp nối tiếp đồng bộ sẽ là lựa chọn tốt
hơn và trong giao diện ngoại vi nối tiếp hoặc đặc biệt là SPI là lựa chọn tốt nhất. Khi
chúng ta nói giao tiếp khoảng cách ngắn, nó thường có nghĩa là giao tiếp trong một
thiết bị hoặc giữa các thiết bị trên cùng một bo mạch.
2.3.1.2. Cách thức hoạt động
Trong giao thức SPI, các thiết bị được kết nối theo mối quan hệ Master - Slave
trong một giao diện đa điểm. Trong kiểu giao diện này, một thiết bị được coi là Master
của bus (thường là vi điều khiển) và tất cả các thiết bị khác (IC ngoại vi hoặc thậm
chí là các vi điều khiển khác) được coi là Slave. Trong giao thức SPI, chỉ có một
Master và có một hoặc nhiều Slave.
Bus SPI bao gồm 4 tín hiệu gồm:

 Master - Out / Slave - In (MOSI)


 Master - In / Slave - Out (MISO)
 Đồng hồ (SCLK)
 Chọn chip (CS) hoặc Chọn Slave (SS)

9
Hình 2.5: Giao tiếp SPI một Master với một Slave.
Hình 2.5 mô tả một Master kết nối với một Slave bằng cách sử dụng bus SPI.
Master - Out/Slave - In hay MOSI, như tên gọi MOSI là dữ liệu được tạo bởi
Master và được nhận bởi Slave. Do đó, các chân MOSI trên cả chủ và tớ đều được kết
nối với nhau. Master - In/Slave - Out hay MISO là dữ liệu do Slave tạo ra và phải
được truyền đến Master. Các chân MISO trên cả Master và Slave đều gắn kết với
nhau. Mặc dù Tín hiệu trong MISO được tạo ra bởi Slave, đường truyền được điều
khiển bởi Master. Master tạo ra một tín hiệu đồng hồ tại SCLK và được cung cấp cho
đầu vào đồng hồ của phụ. Chip Select (CS) hoặc Slave Select (SS) được sử dụng để
chọn một Slave cụ thể của chủ.
Vì tín hiệu đồng hồ được tạo bởi Master, luồng dữ liệu được điều khiển bởi Master.
Đối với mỗi chu kỳ xung nhịp, một bit dữ liệu được truyền từ chủ sang Slave và một
bit dữ liệu được truyền ngược lại. Quá trình này xảy ra đồng thời và sau 8 chu kỳ đồng
hồ, một byte dữ liệu được truyền theo cả hai hướng và do đó, SPI là giao tiếp song
công. Nếu dữ liệu chỉ được truyền bởi một thiết bị, thì thiết bị kia phải gửi thứ gì đó
và dữ liệu được truyền có phải là dữ liệu thực hay không là tùy thuộc vào thiết bị.
Điều này có nghĩa là đối với mỗi bit được truyền bởi một thiết bị, thiết bị kia phải gửi
một bit dữ liệu tức là Master đồng thời truyền dữ liệu trên đường MOSI và nhận dữ
liệu từ phụ trên đường MISO. Nếu Slave muốn truyền dữ liệu, chủ phải tạo ra tín hiệu
đồng hồ cho phù hợp bằng cách biết khi nào Slave muốn gửi dữ liệu trước. Nếu phải

10
kết nối nhiều hơn một Slave với Master, thì thiết lập sẽ tương tự như hình 2.6 bên
dưới.

Hình 2.6: Giao tiếp SPI một Master với nhiều Slave.
Mặc dù nhiều Slave được kết nối với chủ trong bus SPI, chỉ một Slave sẽ hoạt
động bất cứ lúc nào. Để chọn Slave, Master sẽ kéo xuống dòng SS (Slave Select) hoặc
CS (Chip Select) của Slave tương ứng. Do đó, phải có một chân CS riêng biệt trên
Master tương ứng với từng thiết bị phụ. Chúng ta cần kéo dòng SS hoặc CS xuống để
chọn Slave vì dòng này hoạt động ở mức thấp.

2.3.2. Chuẩn truyền thông I2C

2.3.2.1. Giới thiệu chung


I2C là viết tắt của Inter-Integrated Circuit, I2C là giao thức truyền thông nối tiếp
đồng bộ, cho phép nhiều mạch tích hợp kỹ thuật số ngoại vi (chip) giao tiếp với một

11
hoặc nhiều chip “bộ điều khiển”. Giống như SPI, nó chỉ dành cho giao tiếp khoảng
cách ngắn trong một thiết bị duy nhất. I2C còn được gọi là hai giao diện có dây [2].
2.3.2.2. Cách thức hoạt động
Nó chỉ sử dụng 2 đường thoát mở hai chiều để giao tiếp dữ liệu được gọi là SDA
và SCL. Cả hai dòng này đều được điện trở kéo lên.

 Dữ liệu nối tiếp (SDA) - Truyền dữ liệu diễn ra thông qua chân này.
 Đồng hồ nối tiếp (SCL) – Chân này mang tín hiệu đồng hồ.

I2C hoạt động ở 2 chế độ Master và Slave.


Mỗi bit dữ liệu được truyền trên đường SDA được đồng bộ hóa bởi xung từ cao
xuống thấp của mỗi xung nhịp trên đường SCL.

Hình 2.7: Giao tiếp I2C.

12
Theo các giao thức I2C, dòng dữ liệu không thể thay đổi khi dòng xung nhịp cao,
nó chỉ có thể thay đổi khi dòng xung nhịp thấp. Hai đường dây là hở, do đó cần có
một điện trở kéo lên để các đường dây ở mức cao vì các thiết bị trên bus I2C đang
hoạt động ở mức thấp. Dữ liệu được truyền dưới dạng gói bao gồm 9 bit. Trình tự của
các bit này là 1 bit cho điều kiện bắt đầu, 8 bit địa chì Slave, 1 bit cho phép.

 Điều kiện bắt đầu và dừng:

START và STOP có thể được tạo ra bằng cách giữ dòng SCL ở mức cao và thay
đổi mức SDA. Để tạo điều kiện START, SDA được thay đổi từ cao xuống thấp
trong khi vẫn giữ SCL ở mức cao. Để tạo điều kiện STOP, SDA đi từ thấp đến cao
trong khi vẫn giữ SCL ở mức cao.

 Điều kiện bắt đầu lặp lại:

Giữa mỗi cặp điều kiện bắt đầu và dừng, bus được coi là bận và không có chủ có
thể điều khiển bus. Nếu Master cố gắng bắt đầu chuyển giao mới và không muốn
giải phóng bus trước khi bắt đầu chuyển giao mới, nó sẽ đưa ra một điều kiện
START mới. Nó được gọi là điều kiện khởi động lặp lại.

 Bit đọc/ghi:

Một bit đọc/ghi cao chỉ ra rằng cái chủ đang gửi dữ liệu đến bộ phận phụ, trong
khi một bit đọc/ghi thấp chỉ ra rằng cái chủ đang nhận dữ liệu từ bộ phận phụ.

 ACK/NACK bit:

Sau mỗi khung dữ liệu, theo sau một bit ACK/NACK. Nếu khung dữ liệu được
nhận thành công thì bit ACK sẽ được người nhận gửi đến người gửi.

 Địa chỉ:

Khung địa chỉ là khung đầu tiên sau bit bắt đầu. Địa chỉ của Slave mà chủ muốn
giao tiếp được chủ gửi tới mọi Slave được kết nối với nó. Sau đó, Slave sẽ so sánh
địa chỉ của chính nó với địa chỉ này và gửi ACK.

 Định dạng gói I2C:


13
Trong giao thức truyền thông I2C, dữ liệu được truyền dưới dạng gói tin. Các gói
này dài 9 bit, trong đó 8 bit đầu tiên được đưa vào dòng SDA và bit thứ 9 được
dành riêng cho ACK/NACK. Điều kiện bắt đầu cộng với gói địa chỉ cộng thêm
một gói dữ liệu nữa cộng với điều kiện dừng sẽ tạo thành một quá trình truyền dữ
liệu hoàn chỉnh và được thể như trong hình 2.8 bên dưới.

Hình 2.8: Truyền dữ liệu trong giao tiếp I2C.

14
Chương 3 THIẾT KẾ HỆ THỐNG

3.1. YÊU CẦU NGƯỜI DÙNG

Người dùng cần một loại khóa cửa điện tử có những chức năng sau:

 Mở khóa bằng mật khẩu


 Mở khóa bằng thẻ
 Thay đổi mật khẩu, thêm/xóa thẻ khi cần
 Hiển thị các sự kiện lên màn hình
 Cảnh báo khi nhập sai mật khẩu hoặc sai thẻ nhiều lần.

3.2. YÊU CẦU KỸ THUẬT

3.2.1. Chức năng kỹ thuật

Dưới đây là các chức năng kỹ thuật được đưa ra dựa vào yêu cầu người dùng đã
nêu ở trên.

 Điều khiển chốt cửa đóng/mở


 Đọc ký tự từ bàn phím
 Xác thực thẻ
 Xuất các sự kiện ra màn hình hiển thị
 Phát tín hiệu cảnh báo nếu nhập sai mật khẩu hoặc sai thẻ nhiều lần.

3.2.2. Thông số kỹ thuật

Dưới đây là các thông số kỹ thuật của hệ thống.

 Điện áp hoạt động: 5V


 Dòng tiêu thụ: 350 mA
 Thời gian xác thực thẻ: ~1 s
 Khoảng cách đọc thẻ tối đa: 5 cm
 Kích thước toàn hệ thống: 12x6x28 cm.
15
3.3. SƠ ĐỒ KHỐI CỦA HỆ THỐNG

Dựa vào những yêu cầu kỹ thuật đã nêu ở trên ta thiết kế được sơ đồ khối của hệ
thống và được thể hiện như hình 3.1 bên dưới

Hình 3.1: Sơ đồ khối của hệ thống.


Sơ đồ này gồm các khối: khối nhập mật khẩu, khối đọc thẻ, khối thực thi, khối
hiển thị, khối cảnh báo, khối xử lý trung tâm, khối nguồn.

 Khối nhập mật khẩu có nhiệm vụ nhập mật khẩu và chuyển thông tin đến khối xử
lý trung tâm.
 Khối đọc thẻ có nhiệm vụ xác thực thẻ và chuyển thông tin đến khối xử lý trung
tâm.
 Khối thực thi có nhiệm vụ nhận tín hiệu từ khối xử lý trung tâm rồi điều khiển
chốt cửa đóng/mở.
 Khối hiển thị có nhiệm vụ nhận dữ liệu từ khối xử lý trung tâm rồi hiển thị các sự
kiện lên màn hình.
 Khối cảnh báo có nhiệm vụ nhận tín hiệu điều khiển từ khối xử lý trung tâm rồi
phát tín hiệu cảnh báo khi nhập sai mật khẩu hoặc sai thẻ nhiều lần.
 Khối xử lý trung tâm có nhiệm vụ xử lý các thông tin từ khối nhập mật khẩu, khối
đọc thẻ và điều khiển thiết bị ở các khối thực thi, khối cảnh báo và xuất thông tin
ra khối hiển thị.
 Khối nguồn có nhiệm vụ cung cấp năng lượng cho toàn hệ thống.
16
3.4. THIẾT KẾ CHI TIẾT

3.4.1. Khối nhập mật khẩu

 Khối này có nhiệm vụ nhập mật khẩu.


Có hai loại mật khẩu thường dùng nhất là mật khẩu ký tự và mật khẩu số.
 Mật khẩu ký tự là loại mật khẩu gồm 26 chữ cái trong bảng chữ cái alphabet
và các số từ 0 đến 9, có tính bảo mật cao nhưng ưu cầu thiết bị bàn phím phải
có nhiều phím, kích thước lớn, dẫn đến giá thành thiết bị cao.
 Mật khẩu số là loại mật khẩu gồm các số từ 0 đến 9, có tính bảo mật không cao
bằng so với loại mật khẩu ký tự, ưu cầu thiết bị bàn phím chỉ với 10 phím.

 Qua phân tích trên ta chọn loại mật khẩu số nhằm tiết kiệm diện tích của linh

kiện chiếm trên toàn hệ thống, tiết kiệm chi phí nhất có thể.

 Khối cần một linh kiện có chức năng nhập ký tự số, có 10 phím hoặc có thể nhiều
hơn và có thể dễ dàng thao tác với các phím nhấn.

Dựa vào những yêu cầu trên ta liệt kê được một số linh kiện phù hợp và được thể
hiện như bảng 3.1 bên dưới.
Bảng 3.1 Liệt kê các linh kiện phù hợp cho khối nhập mật khẩu.
Kích thước Giá thành
Tên linh kiện Loại phím
(mm) (đồng)

Bàn phím ma trận 4x4 Phím mềm 77 x 69 13 000

Bàn phím ma trận 4x4 Phím cứng 43 x 39 x 10 12 000

 Linh kiện “Bàn phím ma trận 4x4” loại phím mềm là phù hợp nhất với yêu
cầu đã đề ra.

3.4.2. Khối nhập đọc thẻ

 Khối này có nhiệm vụ xác thực thẻ.


Hiện nay trên thị trường có hai loại thẻ thông dụng nhất là thẻ từ và thẻ RFID.

17
 Thẻ từ là loại thẻ có gắn một dải băng từ màu đen trên thẻ, hoạt động dựa trên
từ tính, khi giao tiếp với đầu đọc thẻ cần phải quẹt thẻ, giá thành của thiết bị
đọc thẻ từ khoảng 1 triệu – 2 triệu đồng.
 Thẻ RFID là loại thẻ được tích hợp anten, giao tiếp bằng sóng vô tuyến, khi
giao tiếp chỉ cần đưa thẻ lại gần đầu đọc thẻ, giá thành của thiết bị đọc thẻ
khoảng dưới 150 000 đồng.

 Qua phân tích trên ta chọn loại thẻ RFID nhằm tiết kiệm chi phí nhất có thể.

 Khối cần một linh kiện có chức năng đọc thẻ RFID và có những thông số sau:
 Điện áp hoạt động: 5 V
 Thời gian xác thực thẻ: ~1 s
 Khoảng cách đọc thẻ tối đa: 5 cm.

Dựa vào những yêu cầu trên ta liệt kê được một số linh kiện phù hợp và được thể
hiện như bảng 3.2 bên dưới.
Bảng 3.2 Liệt kê các linh kiện phù hợp cho khối đọc thẻ.
Thông số kỹ thuật
Khoảng
Điện áp Thời gian Giá thành
Tên linh kiện cách đọc
hoạt động xác thực (đồng)
thẻ tối đa
(V) (s)
(cm)
Module RFID MFRC-522
3.3 - 5 <1 6 35 000
NFC 13.56MHz
Module PN532 NFC RFID V3 3.3 - 5 <1 7 140 000
Module RFID RDM6300
5 <1 5 85 000
125KHz giao tiếp UART
 Linh kiện “Module RFID MFRC-522 NFC 13.56MHz” là phù hợp nhất với yêu
cầu đã đề ra.

18
3.4.3. Khối nhập thực thi

 Khối này có nhiệm vụ điều khiển chốt cửa đóng/mở.


 Khối cần một linh kiện tương tự như chốt cửa, đóng/mở khi có tín hiệu kích.

Dựa vào những yêu cầu trên ta liệt kê được một số linh kiện phù hợp và được thể
hiện như bảng 3.3 bên dưới.
Bảng 3.3 Liệt kê các linh kiện phù hợp cho khối thực thi.
Thông số kỹ thuật
Giá thành
Tên linh kiện Điện áp hoạt Kích thước
(đồng)
động (V) (mm)
Khóa chốt điện DC12V LY-03 12 65 x 40 x 28 95 000
Khóa chốt điện DC24V LY-03 24 65 x 40 x 28 120 000
 Linh kiện “Khóa chốt điện DC12V LY-03” là phù hợp nhất với yêu cầu đã đề ra.
Ở khối này ta sẽ dùng thêm module relay để xử lý tín hiệu kích. Ta sẽ chọn module
“Module 1 relay 5V với opto cách ly kích H/L”.

3.4.4. Khối nhập hiển thị

 Khối này có nhiệm vụ hiển thị các sự kiện lên màn hình.
 Khối cần một linh kiện có chức năng hiển thị, có màn hình LCD và hoạt động với
điện áp 5 V.

Dựa vào những yêu cầu trên ta liệt kê được một số linh kiện phù hợp và được thể
hiện như bảng 3.4 bên dưới.

19
Bảng 3.4 Liệt kê các linh kiện phù hợp cho khối hiển thị.
Thông số kỹ thuật
Giá thành
Tên linh kiện Điện áp hoạt Kích thước
(đồng)
động (V) (mm)
LCD 1602 3.3V 3.3 80 x 36 x 12.5 52 000
LCD 1602 5V 5 80 x 36 x 12.5 45 000
LCD 1604 5V 5 87 x 80 x 14 110 000
LCD 2004 5V 5 98 x 60 x 13.5 110 000
 Linh kiện “LCD 1602 5V” là phù hợp nhất với yêu cầu đã đề ra. Ở khối này ta sẽ
dùng thêm module mở rộng I/O nhằm tiết kiệm chân I/O của khối xử lý trung tâm. Ta
sẽ chọn module “Module I2C giao tiếp LCD1602, LCD1604, LCD2004”.

3.4.5. Khối nhập cảnh báo

 Khối này có nhiệm vụ phát tín hiệu cảnh báo khi nhập sai mật khẩu nhiều lần.
 Khối cần một linh kiện có chức năng phát âm thanh khi có tín hiệu kích và hoạt
động với điện áp 5V.

Dựa vào những yêu cầu trên ta liệt kê được một số linh kiện phù hợp và được thể
hiện như bảng 3.5 bên dưới.

20
Bảng 3.5 Liệt kê các linh kiện phù hợp cho khối cảnh báo.
Thông số kỹ thuật
Điện
Giá thành
Tên linh kiện áp hoạt Âm Kích thước
(đồng)
động thanh (mm)
(V)
Còi Thạch Anh SFM-27 DC 3- Ngắt
3 - 24 40 x 30 x 15 10 000
24V quãng
Còi báo SFM-20B DC 3-24V 3 - 24 Liên tục 35 x 22.5 x 12 10 000
Ngắt
Còi hú 12V 12 41 x 54 x 135 60 000
quãng
 Linh kiện “Còi Thạch Anh SFM-27 DC 3-24V” là phù hợp nhất với yêu cầu đã đề
ra. Ở khối này ta sẽ dùng thêm module relay để xử lý tín hiệu kích. Ta sẽ chọn module
“Module 1 relay 5V với opto cách ly kích H/L”.

3.4.6. Khối nhập xử lý trung tâm

 Khối này có nhiệm vụ xử lý các thông tin từ khối nhập mật khẩu, khối đọc thẻ và
điều khiển thiết bị ở các khối thực thi, khối cảnh báo và xuất thông tin ra khối hiển
thị.
 Khối cần một vi xử lý hoặc vi điều khiển hoạt động với điện áp 5 V, có thể giao
tiếp với các ngoại vi qua chuẩn giao tiếp SPI, I2C, có số lượng chân I/O vừa đủ so
với tổng chân I/O của các ngoại vi (khoảng 20 chân I/O).

Dựa vào những yêu cầu trên ta liệt kê được một số linh kiện phù hợp và được thể
hiện như bảng 3.6 bên dưới.

21
Bảng 3.6 Liệt kê các linh kiện phù hợp cho khối xử lý trung tâm.
Thông số kỹ thuật
Điện
Giá
áp Tốc độ Bộ nhớ Số
Tên linh kiện thành
hoạt Chuẩn giao tiếp tối đa EEPROM chân
(đồng)
động (MHz) (byte) I/O
(V)
USART,
2–
PIC16F887 UART, SPI, 20 256 35 80 000
5.5
I2C
USART,
2–
PIC18F4550 UART, SPI, 48 256 35 150 000
5.5
I2C
USART,
2.7 –
ATMEGA8A UART, SPI, 16 512 23 50 000
5.5
I2C
USART,
4.5 –
ATMEGA16 UART, SPI, 16 512 32 95 000
5.5
I2C
USART,
2.7 –
ATMEGA32A UART, SPI, 16 1024 32 110 000
5.5
I2C
USART,
1.8 –
ATMEGA328P UART, SPI, 20 1024 23 160 000
5.5
I2C
 Vi điều khiển “ATMEGA328P” là phù hợp nhất với yêu cầu đã đề ra.

3.4.7. Khối nguồn

 Khối này có nhiệm vụ cung cấp năng lượng cho toàn hệ thống.

22
 Từ các linh kiện đã chọn ở trên nguồn 5 V là nguồn phù hợp nhất và nguồn pin là
hoàn toàn phù hợp với hệ thống khóa cửa này.

 Lựa chọn nguồn pin 5 V.

3.4.8. Sơ đồ nguyên lý và sơ đồ nối dây toàn mạch

3.4.8.1. Sơ đồ nguyên lý toàn mạch


Từ các linh kiện đã chọn ở trên ta tiến hành thiết kế sơ đồ nguyên lý toàn mạch và
được thể hiện như hình 3.2 bên dưới.

Hình 3.2: Sơ đồ nguyên lý toàn mạch.


3.4.8.2. Sơ đồ nối dây toàn mạch
Để thuận tiện cho quá trình thi công hệ thống ta sẽ chọn board “Aruino Uno R3
SMD” để thay thế cho vi điều khiển “Atmega328P” ở khối xử lý trung tâm. Và ta tiến
hành thiết kế sơ đồ nối dây toàn mạch và được thể hiện như hình 3.3 bên dưới.

23
Hình 3.3: Sơ đồ nối dây toàn mạch.

3.5. THIẾT KẾ PHẦN MỀM

3.5.1. Lưu đồ giải thuật

3.5.1.1. Lưu đồ giải thuật chương trình chính

24
Hình 3.4: Lưu đồ giải thuật chương trình chính.
Hình 3.4 mô tả cách thức hoạt động của chương trình chính. Chương trình này có
2 chế độ mở khóa là mở khóa bằng mật khẩu và mở khóa bằng thẻ.
Khi chọn mở khóa bằng mật khẩu thì chương trình sẽ gọi chương trình xác thực
mật khẩu, khi chương trình xác thực mật khẩu thực hiện xong thì sẽ cho kết quả trong
3 trường hợp.

 Trường hợp 1 kết quả là mật khẩu chưa được nhập.


 Trường hợp 2 kết quả là mật khẩu sai.
 Trường hợp 3 kết quả là mật khẩu đúng.

Khi kết quả là mật khẩu đúng thì cửa sẽ mở trong 3 giây.

25
Khi chọn mở khóa bằng thẻ thì chương trình sẽ gọi chương trình xác thực thẻ, khi
chương trình xác thực thẻ thực hiện xong thì sẽ cho kết quả cũng trong 3 trường hợp.

 Trường hợp 1 kết quả là thẻ chưa được quét.


 Trường hợp 2 kết quả là thẻ sai.
 Trường hợp 3 kết quả là thẻ đúng.

Khi kết quả là thẻ đúng thì cửa sẽ mở trong 3 giây.


Khi nhập sai mật khẩu hoặc sai thẻ 5 lần thì chương trình sẽ gọi chương trình báo
động.
Khi thực hiện chương trình xác thực thẻ xong thì còn cho một kết quả nữa là cho
hay không cho phép vào chương trình quản lý, khi cho phép vào chương trình quản
lý thì chương trình sẽ gọi chương trình quản lý.
3.5.1.2. Lưu đồ giải thuật các chương trình con

 Chương trình xác thực mật khẩu

Hình 3.5: Lưu đồ giải thuật chương trình xác thực mật khẩu.

26
Hình 3.5 mô tả cách thức hoạt động của chương trình xác thực mật khẩu. Chương
trình nằm trong hàm có tham số là mật khẩu, chương trình này sẽ tiến hành so sánh
dãy số nhập vào với mật khẩu.
Trường hợp 1 nếu dãy số nhập vào trùng với mật khẩu và độ dài của dãy số bằng
độ dài của mật khẩu thì cho kết quả là mật khẩu đúng.
Trường hợp 2 nếu độ dài của dãy số bằng không thì cho kết quả là mật khẩu chưa
được nhập.
Trường hợp 3 khi trường hợp 1, 2 không xảy ra thì cho kết quả là mật khẩu sai.
 Chương trình xác thực thẻ

27
Hình 3.6: Lưu đồ giải thuật chương trình xác thực thẻ.
28
Hình 3.6 mô tả cách thức hoạt động của chương trình xác thực thẻ. Chương trình
này nằm trong một hàm, khi có thẻ mới được quét thì chương trình sẽ tiến hành so
sánh ID thẻ quét được với ID quản lý nếu hai ID trùng nhau thì cho kết quả là cho
phép vào chương trình quản lý và không cho phép vào chương trình quản lý khi hai
ID không trùng nhau.
Tiếp theo chương trình sẽ gọi chương trình so sánh ID thẻ, khi chương trình so
sánh ID thẻ thực hiện xong thì sẽ cho kết quả là thẻ đúng hoặc thẻ sai.
Khi cho phép vào chương trình quản lý thì cho kết quả là thẻ đúng và kêt thúc
chương trình.
 Chương trình so sánh ID thẻ

29
Hình 3.7: Lưu đồ giải thuật chương trình so sánh ID thẻ.
Hình 3.7 mô tả cách thức hoạt động của chương trình so sánh ID thẻ. Chương trình
nằm trong hàm có tham số là ID, chương trình sẽ tiến hành tìm kiếm xem thử ID có
trong bộ nhớ không, nếu có thì cho kết quả là ID trùng và ngược lại cho kết quả là ID
không trùng và kết thúc chương trình.
 Chương trình quản lý

30
Hình 3.8: Lưu đồ giải thuật chương trình quản lý.
Hình 3.8 mô tả cách thức hoạt động của chương trình quản lý. Chương trình nằm
trong một hàm, chương trình liệt kê danh sách các mục lựa chọn, mỗi mục tương ứng
với chương trình con tương ứng, cụ thể khi lựa chọn mục “Thoát” thì chương trình sẽ
kết thúc, khi chọn mục “Đổi mật khẩu” thì chương trình đổi mật khẩu sẽ được gọi,
khi chọn mục “Thêm/xóa thẻ” thì chương trình sẽ liệt kê một danh sách mới, khi chọn
mục “Trở lại” thì chương trình sẽ quay về danh sách trước đó, khi chọn mục “Thêm
thẻ” thì chương trình thêm thẻ được gọi, khi chọn mục “Xóa thẻ” thì chương trình sẽ
gọi chương trình xóa thẻ.
 Chương trình đổi mật khẩu

31
Hình 3.9: Lưu đồ giải thuật chương trình đổi mật khẩu.

32
Hình 3.9 mô tả cách thức hoạt động của chương trình đổi mật khẩu. Chương trình
nằm trong một hàm, đầu tiên chương trình yêu cầu nhập mật khẩu bằng cách gọi
chương trình xác thực mật khẩu.

Khi mật khẩu chưa được nhập hoặc mật khẩu sai thì chương trình sẽ kết thúc.
Khi mật khẩu đúng thì chương trình tiếp tục yêu cầu nhập mật khẩu mới bằng cách
gọi chương trình xác thực mật khẩu.
Khi mật khẩu chưa được nhập thì chương trình sẽ kết thúc.
Khi mật khẩu đã được nhập thì chương trình tiếp tục yêu cầu xác nhận mật khẩu
bằng cách gọi chương trình xác nhận mật khẩu.
Khi mật khẩu chưa được nhập hoặc mật khẩu sai thì chương trình sẽ kết thúc.
Khi xác mật khẩu đúng tương ứng xác nhận mật khẩu thành công thì chương trình
sẽ tiến hành lưu mật khẩu mới này vào vùng nhớ đã định và kết thúc chương trình.

 Chương trình thêm thẻ

33
Hình 3.10: Lưu đồ giải thuật chương trình thêm thẻ.
34
Hình 3.10 mô tả cách thức hoạt động của chương trình thêm thẻ. Chương trình
nằm trong một hàm, đầu tiên chương trình yêu cầu quét thẻ bằng cách gọi chương
trình xác thực thẻ.
Khi thẻ chưa được quét thì chương trình sẽ kết thúc.
Khi đã quét được thẻ thì chương trình sẽ tiến hành tìm kiếm xem thử ID thẻ có
trong bộ nhớ không.
Nếu có thì chương trình sẽ kết thúc.
Còn nếu không thì chương trình sẽ tiến hành tìm kiếm trong bộ nhớ có vùng nhớ
nào trống không bằng cách gọi chương trình so sánh ID thẻ.
Nếu không thì chương trình sẽ kết thúc.
Ngược lại thì chương trình sẽ lưu ID thẻ mới này vào vùng nhớ đã định và kết thúc
chương trình.
 Chương trình xóa thẻ

35
Hình 3.11: Lưu đồ giải thuật chương trình xóa thẻ.
36
Hình 3.11 mô tả cách thức hoạt động của chương trình xóa thẻ. Chương trình nằm
trong một hàm, đầu tiên chương trình yêu cầu quét thẻ bằng cách gọi chương trình
xác thực thẻ.
Khi thẻ chưa được quét thì chương trình sẽ kết thúc.
Khi đã quét được thẻ thì chương trình sẽ tiến hành tìm kiếm xem thử ID thẻ có
trong bộ nhớ không.
Nếu không thì chương trình sẽ kết thúc.
Còn nếu có thì chương trình sẽ tiến hành so sánh ID thẻ có trùng với ID thẻ quản
lý không.
Nếu có thì chương trính sẽ kết thúc.
Ngược lại thì chương trình sẽ xóa ID thẻ này trong vùng nhớ đã định và kết thúc
chương trình.
 Chương trình báo động

37
Hình 3.12: Lưu đồ giải thuật chương trình báo động.
Hình 3.12 mô tả cách thức hoạt động của chương trình báo động. Chương trình
nằm trong một hàm, chương trình sẽ tạo trễ trong thời gian đã đặt, trong thời gian này
còi báo động sẽ được bật, khi hết thời gian thì còi sẽ tắt và kết thúc chương trình.
3.5.2. Mã nguồn chương trình
38
Dựa vào lưu đồ giải thuật chương trình chính ta suy ra được chương trình chính
sử dụng ngôn ngữ C trên phần mềm Arduino IDE và được biểu diễn như hình 3.13 –
3.19 bên dưới.

Hình 3.13: Mã nguồn chương trình chính (a).

39
Hình 3.14: Mã nguồn chương trình chính (b).

Hình 3.15: Mã nguồn chương trình chính (c).

40
Hình 3.16: Mã nguồn chương trình chính (d).

Hình 3.17: Mã nguồn chương trình chính (e).

41
Hình 3.18: Mã nguồn chương trình chính (f).

Hình 3.19: Mã nguồn chương trình chính (g).

42
Chương 4 THI CÔNG HỆ THỐNG VÀ ĐÁNH GIÁ
KẾT QUẢ

Hình 4.1: Hệ thống hoàn chỉnh (a).

43
Hình 4.2: Hệ thống hoàn chỉnh (b).

44
Hình 4.1, 4.2 thể hiện hệ thống khi hoàn thiện, với hệ thống này người dùng có
thể tương tác qua bàn phím, vùng đọc thẻ RFID, biết được các sự kiện đang xảy ra
thông qua màn hình, chốt cửa và tín hiệu còi.

Hình 4.3: Chi tiết bên trong hệ thống.


Qua hình 4.3 ta thấy rằng hệ thống gồm có các khối như khối nguồn, khối hiển thị,
khối thực thi, khối nhập mật khẩu, khối đọc thẻ và khối xử lý trung tâm.

45
Hình 4.4: Giao diện màn hình khi chọn chế độ mở khóa bằng mật khẩu.

Hình 4.5: Giao diện màn hình khi chọn chế độ mở khóa bằng thẻ.
Qua hình 4.4, 4.5 ta thấy hệ thống thực hiện đúng như lưu đồ giải thuật đã đề ra,
cụ thể ở hình 4.4 màn hình đã hiển thị yêu cầu nhập mật khẩu sau khi ta bấm ‘*’ và ở
hình 4.5 màn hình đã hiển thị yêu cầu quét thẻ sau khi ta bấm ‘#’.

46
Hình 4.6: Giao diện màn hình khi nhập đúng mật khẩu hoặc nhập đúng thẻ.

Hình 4.7: Trạng thái của chốt cửa khi nhập đúng mật khẩu hoặc nhập đúng thẻ.
Qua hình 4.6, 4.7 ta thấy hệ thống thực hiện đúng như lưu đồ giải thuật đã đề ra,
cụ thể ở hình 4.6 màn hình đã hiển thị thông báo cửa đã được mở và ở hình 4.7 chốt
cửa đã thụt vào sau khi ta nhập đúng mật khẩu hoặc nhập đúng thẻ.

47
Hình 4.8: Giao diện màn hình khi nhập sai mật khẩu.
Qua hình 4.8 ta thấy hệ thống thực hiện đúng như lưu đồ giải thuật đã đề ra, cụ thể
màn hình đã hiển thị thông báo mật khẩu sai sau khi ta nhập sai mật khẩu.

Hình 4.9: Giao diện màn hình khi nhập sai mật khẩu nhiều lần.
Qua hình 4.9 ta thấy hệ thống thực hiện đúng như lưu đồ giải thuật đã đề ra, cụ thể
màn hình đã hiển thị yêu cầu chờ sau khi ta nhập sai mật khẩu nhiều lần.

48
Hình 4.10: Giao diện màn hình khi truy cập vào chương trình quản lý (a).

Hình 4.11: Giao diện màn hình khi truy cập vào chương trình quản lý (b).

49
Hình 4.12: Giao diện màn hình khi truy cập vào chương trình quản lý (c).

Hình 4.13: Giao diện màn hình khi truy cập vào chương trình quản lý (d).
Qua hình 4.10, 4.11, 4.12, 4.13 ta thấy hệ thống thực hiện đúng như lưu đồ giải
thuật đã đề ra, cụ thể màn hình đã hiển thị danh sách các mục lựa chọn sau khi ta truy
cập vào chương trình quản lý.

50
Hình 4.14: Giao diện màn hình khi đổi mật khẩu thành công.
Qua hình 4.14 ta thấy hệ thống thực hiện đúng như lưu đồ giải thuật đã đề ra, cụ
thể màn hình đã hiển thị thông báo đổi mật khầu thành công sau khi ta thực hiện đúng
các bước trong quá trình đổi mật khẩu.

Hình 4.15: Giao diện màn hình khi xác nhận mật khẩu sai mới.
Qua hình 4.15 ta thấy hệ thống thực hiện đúng như lưu đồ giải thuật đã đề ra, cụ
thể màn hình đã hiển thị thông báo mật khẩu không khớp sau khi ta xác nhận mật khẩu
sai mới.

51
Hình 4.16: Giao diện màn hình khi thêm thẻ thành công.
Qua hình 4.16 ta thấy hệ thống thực hiện đúng như lưu đồ giải thuật đã đề ra, cụ
thể màn hình đã hiển thị thông báo thêm thẻ thành công sau khi ta thực hiện đúng các
bước trong quá trình thêm thẻ.

Hình 4.17: Giao diện màn hình khi thêm thẻ đã có trong hệ thống.
Qua hình 4.17 ta thấy hệ thống thực hiện đúng như lưu đồ giải thuật đã đề ra, cụ
thể màn hình đã hiển thị thông báo thẻ đã có trong hệ thống sau khi ta thêm thẻ đã có
trong hệ thống trước đó.

52
Hình 4.18: Giao diện màn hình khi xóa thẻ thành công.
Qua hình 4.18 ta thấy hệ thống thực hiện đúng như lưu đồ giải thuật đã đề ra, cụ
thể màn hình đã hiển thị thông báo xóa thẻ thành công sau khi ta thực hiện đúng các
bước trong quá trình xóa thẻ.

Hình 4.19: Giao diện màn hình khi xóa thẻ thành công.
Qua hình 4.19 ta thấy hệ thống thực hiện đúng như lưu đồ giải thuật đã đề ra, cụ
thể màn hình đã hiển thị thông báo thẻ quán lý không được xóa sau khi ta tiến hành
xóa thẻ quản lý.

53
Hình 4.20: Giao diện màn hình khi xóa thẻ không có trong hệ thống.
Qua hình 4.20 ta thấy hệ thống thực hiện đúng như lưu đồ giải thuật đã đề ra, cụ
thể màn hình đã hiển thị thông báo thẻ không có trong hệ thống sau khi ta thêm thẻ
không có trong hệ thống trước đó.

54
Chương 5 KẾT LUẬN

5.1. KẾT LUẬN


Sau quá trình thực hiện đề tài, hệ thống khóa cửa điện tử đã đáp ứng được hết tất
cả yêu cầu người dùng đã đề ra, cụ thể như sau:

 Hệ thống cho phép mở khóa bằng mật khẩu, thẻ RFID


 Hệ thống có chức năng đổi mật khẩu, thêm/xóa thẻ khi cần
 Hệ thống cho phép hiển thị các sự kiện lên màn hình
 Hệ thống có chức năng báo động khi nhập sai mật khẩu hoặc sai thẻ RFID
nhiều lần.

Tuy nhiên, đề tài vẫn còn một số hạn chế như:

 Tốc độ đóng/mở của chốt cửa vẫn còn chậm


 Đôi khi hệ thống không nhận thẻ dù đã quét thẻ.

5.2. HƯỚNG PHÁT TRIỂN


Trong tương lai đề tài “Thiết kế khóa cửa điện tử” có thể phát triển theo một số
hường như sau:

 Tích hợp thêm cho hệ thống chức năng mở khóa bằng vân tay, khuôn mặt,
mống mắt, mở khóa qua điện thoại.
 Tích hợp thêm cho hệ thống chức năng thông báo đến điện thoại khi cửa được
mở.
 Thay thế bàn phím hiện có bằng bàn phím cảm ứng.

55
TÀI LIỆU THAM KHẢO

[1] Nguyễn Văn Hiệp, Công nghệ nhận dạng bằng vô tuyến, Tp.HCM, Việt Nam, Nhà
Xuất bản Đại học Quốc gia Tp.HCM, 2016.
[2] Phan Văn Ca – Trương Quang Phúc, Cơ sở ứng dụng Internet of Things (Thiết kế
hệ thống nhúng), Tp.HCM, Việt Nam, Nhà Xuất bản Đại học Quốc gia Tp.HCM,
2017.
[3] Datasheet “ATmega48A/PA/88A/PA/168A/PA/328/P”.
[4] Datasheet “Arduino UNO R3”.

56
PHỤ LỤC

Mã nguồn chương trình cài đặt dữ liệu vào bộ nhớ.


#include <EEPROM.h>
int ID[4] = {19,114,170,30};
char codes[] = "123456";
void setup() {
Serial.begin(9600);
while(!Serial) {
}
// ghi ID thẻ quản lý vào bộ nhớ
for(byte i=0;i<4;i++) {
EEPROM.write(i,ID[i]);
}
for(byte i=0;i<4;i++) {
Serial.print(EEPROM.read(i));
Serial.print(' ');
}
Serial.println();
// ghi MK vào bộ nhớ
byte lenCodes = strlen(codes);
for(byte i=0;i<lenCodes;i++) {
EEPROM.write(i+4,codes[i]);
}
for(byte i=0;i<8;i++) {
if(EEPROM.read(i+4)<48 || EEPROM.read(i+4)>57) break;

57
else {
Serial.print(EEPROM.read(i+4), HEX);
Serial.print(' ');
}
}
Serial.println();
// ghi giá trị chỉ địa chỉ ô nhớ lưu MK vào bộ nhớ
EEPROM.write(15,16);
Serial.println(EEPROM.read(15));
for(byte i=16;i<EEPROM.read(15)+1;i+=4) {
for(byte j=0;j<4;j++) {
if(EEPROM.read(i+j) == 0) break;
else {
Serial.print(EEPROM.read(i+j));
Serial.print(' ');
}
}
Serial.println();
}
}
void loop() {
}

Mã nguồn chương trình chính.


#include <Keypad.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>

58
#include <SPI.h>
#include <MFRC522.h>
#define siren 6
#define latch 7
//định nghĩa kiểu struct
typedef struct LINKED {
char LIST1[16];
struct LINKED *menu_list1;
void (*function1);
char LIST2[16];
struct LINKED *menu_list2;
void (*function2);
char LIST3[16];
struct LINKED *menu_list3;
void (*function3);
} MENU;
MENU main_menu, tag_menu;
const byte numRowsKp = 4;
const byte numColsKp = 4;
byte rowPins[numRowsKp] = {0,1,2,3};
byte colPins[numColsKp] = {A3,A2,A1,A0};
const char keyMap[numRowsKp][numColsKp] =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

59
char keyPressed;
char codes[9], codesTemp[9], codesConfirm[9];
int IDManage[4], IDTemp[4];
byte wrongCodes = 2;
byte wrongID = 2;
byte failCodes, failID, allowManage, match, addr, addrTemp;
LiquidCrystal_I2C lcd(0x27,16,2);
Keypad myKeypad =
Keypad(makeKeymap(keyMap),rowPins,colPins,numRowsKp,numColsKp
);
MFRC522 mfrc522(10,9);
//hàm xác thực MK
void getCodes(char codesSource[]) {
byte i, error;
i = error = 0;
byte lenCodes = strlen(codesSource);
while(true) {
keyPressed = myKeypad.getKey();
if(keyPressed != NO_KEY &&
keyPressed != '*' &&
keyPressed != '#' &&
keyPressed != 'A' &&
keyPressed != 'B' &&
keyPressed != 'C' &&
keyPressed != 'D') {
codesTemp[i] = keyPressed;
lcd.setCursor(i,1);
lcd.print('*');

60
if(i<lenCodes)
if(keyPressed != codesSource[i]) error++;
i++;
}
if(keyPressed == 'D') {
for(byte j=0;j<20;j++) {
lcd.setCursor(j,1);
lcd.print(" ");
}
i = error = 0;
byte lenCodesTemp = strlen(codesTemp);
for(byte j=0;j<lenCodesTemp;j++) {
codesTemp[j] = '\0';
}
}
if(keyPressed == 'A') break;
}
if(!i) wrongCodes = 2;
else if(error==0 && i==lenCodes) wrongCodes = 0;
else wrongCodes = 1;
lcd.clear();
}
//hàm so sánh ID thẻ với dữ liệu trong bộ nhớ
void compareID(int IDSource[]) {
for(byte i=16;i<addr+1;i+=4) {
for(byte j=0;j<4;j++) {
if(EEPROM.read(i+j) != IDSource[j]) {
match*=0;

61
break;
}
else match = 1;
}
if(match) {
addrTemp = i;
break;
}
}
lcd.clear();
}
//hàm xác thực ID thẻ
void getID() {
while(true) {
keyPressed = myKeypad.getKey();
if(keyPressed == 'A') break;
}
if(!mfrc522.PICC_IsNewCardPresent()) {
return;
}
if(!mfrc522.PICC_ReadCardSerial()) {
return;
}
wrongID = 0;
allowManage = 1;
for(byte i=0;i<4;i++) {
IDTemp[i] = mfrc522.uid.uidByte[i];
if(mfrc522.uid.uidByte[i] != IDManage[i]) allowManage*=0;

62
else allowManage*=1;
}
compareID(IDTemp);
if(match) wrongID = 0;
else wrongID = 1;
if(allowManage) wrongID = 0;
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
}
//hàm báo động
void alert() {
digitalWrite(siren,HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Vui long doi sau");
lcd.setCursor(9,1);
lcd.print('s');
for(int cnt=15;cnt>0;cnt--) {
lcd.setCursor(7,1);
if(cnt/10 == 0)
lcd.print(' ');
else
lcd.print(cnt/10);
lcd.print(cnt%10);
delay(1000);
}
digitalWrite(siren,LOW);
lcd.clear();

63
}
//chương trình quản lý
void manage() {
MENU main_menu = {
"Thoat",NULL,&main_menu,
"Doi MK",NULL,&changeCode,
"Them & xoa the",&main_menu,NULL,
};
MENU tag_menu = {
"Tro lai",&main_menu,NULL,
"Them the",NULL,&addTag,
"Xoa the",NULL,&removeTag,
};
MENU *menu = &main_menu;
byte sel, page, no;
sel = 0;
byte out = 0;
lcd.clear();
while(out == 0) {
keyPressed = myKeypad.getKey();
if(keyPressed == 'B') {
lcd.clear();
sel = (sel == 0)?2 : sel-1;
}
if(keyPressed == 'C') {
lcd.clear();
sel = (sel == 2)?0 : sel+1;
}

64
if(keyPressed == 'A') {
switch(sel) {
case 0: {
if(menu->menu_list1 != NULL) {
lcd.clear();
sel = 0;
menu = menu->menu_list1;
}
else
if(menu->function1 != NULL) out = 1;
else menu = menu;
break;
}
case 1: {
if(menu->menu_list2 != NULL) {
lcd.clear();
sel = 0;
menu = menu->menu_list2;
}
else
if(menu->function2 == &changeCode) changeCode();
else if(menu->function2 == &addTag) addTag();
else menu = menu;
break;
}
case 2: {
if(menu->menu_list3 != NULL) {
lcd.clear();

65
sel = 0;
menu = &tag_menu;
}
else
if(menu->function3 != NULL) removeTag();
else menu = menu;
break;
}
}
}

if(sel<=1) {
page = 1;
no = sel;
}
else {
page = 2;
no = sel-2;
}
menuDisplay(menu,page,no);
}
lcd.clear();
}
//hàm hiển thị menu
void menuDisplay(MENU *menu, int page, int no) {
if(page == 1) {
lcd.setCursor(1,0);
lcd.print(menu->LIST1);

66
lcd.setCursor(1,1);
lcd.print(menu->LIST2);
lcd.setCursor(0,no);
lcd.print('>');
}
else {
lcd.setCursor(1,0);
lcd.print(menu->LIST3);
lcd.setCursor(0,no);
lcd.print('>');
}
}
//hàm đổi MK
void changeCode() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Moi nhap MK cu");
getCodes(codes);
if(wrongCodes == 2) {
lcd.setCursor(4,0);
lcd.print("Mat khau");
lcd.setCursor(1,1);
lcd.print("chua duoc nhap");
}
else {
if(wrongCodes) {
lcd.setCursor(0,0);
lcd.print("Mat khau sai");

67
}
else {
wrongCodes = 2;
byte lenCodesTemp = strlen(codesTemp);
for(byte i=0;i<lenCodesTemp;i++) {
codesTemp[i] = '\0';
}
lcd.setCursor(0,0);
lcd.print("MK moi phai gom");
lcd.setCursor(4,1);
lcd.print("4 - 8 so");
delay(2500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Moi nhap MK moi");
getCodes(codes);
if(wrongCodes == 2) {
lcd.setCursor(4,0);
lcd.print("Mat khau");
lcd.setCursor(1,1);
lcd.print("chua duoc nhap");
}
else {
wrongCodes = 2;
lenCodesTemp = strlen(codesTemp);
if(lenCodesTemp<4 || lenCodesTemp>8) {
lcd.setCursor(0,0);
lcd.print("MK moi phai gom");

68
lcd.setCursor(4,1);
lcd.print("4 - 8 so");
}
else {
byte lenCodesConfirm = strlen(codesConfirm);
for(byte i=0;i<lenCodesConfirm;i++) {
codesConfirm[i] = '\0';
}
for(byte i=0;i<lenCodesTemp;i++) {
codesConfirm[i] = codesTemp[i];
}
lcd.setCursor(0,0);
lcd.print("Xac nhan MK moi");
getCodes(codesConfirm);
if(wrongCodes == 2) {
lcd.setCursor(4,0);
lcd.print("Mat khau");
lcd.setCursor(1,1);
lcd.print("chua duoc nhap");
}
else {
if(wrongCodes) {
lcd.setCursor(4,0);
lcd.print("Mat khau");
lcd.setCursor(3,1);
lcd.print("khong khop");
delay(2000);
lcd.clear();

69
lcd.setCursor(2,0);
lcd.print("Doi mat khau");
lcd.setCursor(0,1);
lcd.print("khong thanh cong");
}
else {
byte lenCodes = strlen(codes);
for(byte i=0;i<lenCodes;i++) {
codes[i] = '\0';
}
for(byte i=0;i<8;i++) {
EEPROM.write(i+4,'\0');
}
for(byte i=0;i<lenCodesTemp;i++) {
EEPROM.write(i+4,codesTemp[i]);
codes[i] = codesTemp[i];
}
lcd.setCursor(2,0);
lcd.print("Doi mat khau");
lcd.setCursor(3,1);
lcd.print("thanh cong");
}
}
}
}
}
}
delay(2000);

70
wrongCodes = 2;
lcd.clear();
}
//hàm thêm thẻ
void addTag() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Moi quet the");
getID();
allowManage = 0;
lcd.clear();
if(wrongID == 2) {
lcd.setCursor(6,0);
lcd.print("The");
lcd.setCursor(1,1);
lcd.print("chua duoc quet");
}
else {
if(!wrongID) {
lcd.setCursor(3,0);
lcd.print("The da co");
lcd.setCursor(1,1);
lcd.print("trong he thong");
delay(2000);
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Them the");
lcd.setCursor(0,1);

71
lcd.print("khong thanh cong");
}
else {
int IDZero[4] = {0,0,0,0};
compareID(IDZero);
if(!match) {
addr = addr + 4;
EEPROM.write(15,addr);
}
else {
addr = addrTemp;
}
if(addr > 1023) {
lcd.setCursor(0,0);
lcd.print("He thong da day");
delay(2000);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Khong the them");
lcd.setCursor(1,1);
lcd.print("the duoc nua!");
}
else {
for(byte i=0;i<4;i++) {
EEPROM.write(addr+i,IDTemp[i]);
}
lcd.setCursor(4,0);
lcd.print("Them the");

72
lcd.setCursor(3,1);
lcd.print("thanh cong");
}
}
}
wrongID = 2;
delay(2000);
lcd.clear();
}
//hàm xóa thẻ
void removeTag() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Moi quet the");
getID();
lcd.clear();
if(wrongID == 2) {
lcd.setCursor(6,0);
lcd.print("The");
lcd.setCursor(1,1);
lcd.print("chua duoc quet");
}
else {
if(wrongID) {
lcd.setCursor(2,0);
lcd.print("The khong co");
lcd.setCursor(1,1);
lcd.print("trong he thong");

73
delay(2000);
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Xoa the");
lcd.setCursor(0,1);
lcd.print("khong thanh cong");
}
else {
if(allowManage) {
lcd.setCursor(2,0);
lcd.print("The quan ly");
lcd.setCursor(0,1);
lcd.print("khong duoc xoa!");
}
else {
if(addrTemp == addr && addrTemp != 16) {
EEPROM.write(15,addrTemp-4);
addr = addrTemp - 4;
}
for(byte i=0;i<4;i++) {
EEPROM.write(addrTemp+i,0);
}
lcd.setCursor(4,0);
lcd.print("Xoa the");
lcd.setCursor(3,1);
lcd.print("thanh cong");
}
}

74
}
allowManage = 0;
wrongID = 2;
delay(2000);
lcd.clear();
}
void setup() {
lcd.init();
lcd.backlight();
SPI.begin();
mfrc522.PCD_Init();
pinMode(siren,OUTPUT);
pinMode(latch,OUTPUT);
// đọc MK từ bộ nhớ
for(byte i=0;i<8;i++) {
if(EEPROM.read(i+4)<48 || EEPROM.read(i+4)>57) break;
else codes[i] = EEPROM.read(i+4);
}
// đọc ID thẻ quản lý từ bộ nhớ
for(byte i=0;i<4;i++) {
IDManage[i] = EEPROM.read(i);
}
// đọc giá trị chỉ địa chỉ ô nhớ lưu MK từ bộ nhớ
addr = EEPROM.read(15);
}

void loop() {
lcd.setCursor(4,0);

75
lcd.print("XIN CHAO");
keyPressed = myKeypad.getKey();
// mở khóa bằng mật khẩu
if(keyPressed == '*') {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Moi nhap MK");
getCodes(codes);
if(wrongCodes == 2) {
lcd.setCursor(4,0);
lcd.print("Mat khau");
lcd.setCursor(1,1);
lcd.print("chua duoc nhap");
delay(2000);
}
else {
if(wrongCodes) {
failCodes++;
lcd.setCursor(0,0);
lcd.print("Mat khau sai");
delay(2000);
}
else {
failCodes = failID = 0;
digitalWrite(latch,HIGH);
lcd.setCursor(4,0);
lcd.print("MOI VAO");
delay(3000);

76
digitalWrite(latch,LOW);
}
}
lcd.clear();
wrongCodes = 2;
}
// mở khóa bằng thẻ
if(keyPressed == '#') {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Moi quet the");
getID();
lcd.clear();
if(wrongID == 2) {
lcd.setCursor(6,0);
lcd.print("The");
lcd.setCursor(1,1);
lcd.print("chua duoc quet");
delay(2000);
}
else {
if(wrongID) {
failID++;
lcd.setCursor(0,0);
lcd.print("The sai");
delay(2000);
}
else {

77
failCodes = failID = 0;
digitalWrite(latch,HIGH);
lcd.setCursor(4,0);
lcd.print("MOI VAO");
delay(3000);
digitalWrite(latch,LOW);
}
}
lcd.clear();
wrongID = 2;
}
// báo động khi sai mật khẩu 5 lần
if(failCodes == 5) {
failCodes = 0;
alert();
}
// báo động khi sai thẻ 5 lần
if(failID == 5) {
failID = 0;
alert();
}
// truy cập vào chương trình quản lý
if(allowManage == 1) {
allowManage = 0;
manage();
}
}

78

You might also like