Professional Documents
Culture Documents
HỒ CHÍ MINH
KHOA ĐIỆN – ĐIỆN TỬ
----------
BÁO CÁO ĐỒ ÁN 1
ĐỀ TÀI:
BÁO CÁO ĐỒ ÁN 1
ĐỀ TÀI:
ii
DANH MỤC HÌNH ẢNH
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
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
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.
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.
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ử.
2
Chương 2 CƠ SỞ LÝ THUYẾT
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.
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
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.
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
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].
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).
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:
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.
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ồ.
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.
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.
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.
14
Chương 3 THIẾT KẾ HỆ THỐ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:
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.
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
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
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)
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.
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
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”.
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”.
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”.
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.
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.
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.
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.
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.
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.
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.
39
Hình 3.14: Mã nguồn chương trình chính (b).
40
Hình 3.16: Mã nguồn chương trình chính (d).
41
Hình 3.18: Mã nguồn chương trình chính (f).
42
Chương 4 THI CÔNG HỆ THỐNG VÀ ĐÁNH GIÁ
KẾT QUẢ
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.
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
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
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() {
}
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