You are on page 1of 101

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC NÔNG LÂM TP.HỒ CHÍ MINH


KHOA CƠ KHÍ VÀ CÔNG NGHỆ

TIỂU LUẬN TỐT NGHIỆP

ĐỀ TÀI:

QUẢN LÝ VÀ CẢNH BÁO THÔNG TIN SINH VIÊN


BẰNG MÁY QUÉT VÂN TAY

GVHD: NGUYỄN ĐĂNG KHOA


SVTH: NGUYỄN HÙNG DUY
MSSV: 17153023

TP.HỒ CHÍ MINH-5/2021


BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC NÔNG LÂM TP.HỒ CHÍ MINH
KHOA CƠ KHÍ VÀ CÔNG NGHỆ

TIỂU LUẬN TỐT NGHIỆP


NGÀNH CÔNG NGHỆ KĨ THUẬT CƠ ĐIỆN TỬ

ĐỀ TÀI:

QUẢN LÝ VÀ CẢNH BÁO THÔNG TIN SINH VIÊN


BẰNG MÁY QUÉT VÂN TAY

GVHD: NGUYỄN ĐĂNG KHOA


SVTH: NGUYỄN HÙNG DUY
MSSV: 17153023

TP.HỒ CHÍ MINH-5/2021


TRƯỜNG ĐẠI HỌC NÔNG LÂM TP.HỒ CHÍ MINH CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM

KHOA CƠ KHÍ VÀ CÔNG NGHỆ ĐỘC LẬP-TỰ DO- HẠNH PHÚC

Tp.Hồ Chí Minh, ngày 11 tháng 5 năm 2021

NHIỆM VỤ TIỂU LUẬN TỐT NGHIỆP


Họ và tên sinh viên: Nguyễn Hùng Duy MSSV: 17152023
Chuyên ngành: Công nghệ kĩ thuật cơ điện tử
Hệ đào tạo: Chính quy
Khóa :2017 Lớp: DH17CD

I. TÊN ĐỀ TÀI: QUẢN LÝ VÀ CẢNH BÁO THÔNG TIN SINH VIÊN BẰNG
MÁY QUÉT VÂN TAY
II. NHIỆM VỤ:
- Tìm hiểu và nghiên cứu về cấu tạo, nguyên lý hoạt động, chức năng của các module
Arduino, cảm biến vân tay R307, Module ESP8266 Mode MCU V3, mạch hạ áp
LM2965 , ma trận phím.
- Tìm hiểu và nghiên cứu về cách lập trình Web Server, Exel , tìm hiểu về ngôn ngữ
HTML, CSS, PHP, cơ sở dữ liệu MySQL để tạo nên một trang Web hoàn chỉnh.
- Cách thiết kế và thi công một mô hình hoàn thiện.
- Thiết kế hệ thống điều khiển, lưu đồ giải thuật và chương trình điều khiển mô hình.
- Thiết kế hoàn thiện mô hình thực tế.
- Chạy thử nghiệm mô hình hệ thống.
- Cân chỉnh mô hình hệ thống.
- Viết sách luận văn.
- Bảo vệ tiểu luận tốt nghiệp tốt nghiệp.
III. NGÀY GIAO NHIỆM VỤ:
IV. NGÀY HOÀN THÀNH NHIỆM VỤ:
V. HỌ VÀ TÊN CÁN BỘ HƯỚNG DẪN: NGUYỄN ĐĂNG KHOA
CÁN BỘ HƯỚNG DẪN

3
TRƯỜNG ĐẠI HỌC NÔNG LÂM TP.HỒ CHÍ MINH CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM

KHOA CƠ KHÍ VÀ CÔNG NGHỆ ĐỘC LẬP-TỰ DO- HẠNH PHÚC

Tp.Hồ Chí Minh, ngày 11 tháng 5 năm 2021

LỊCH TRÌNH THỰC HIỆN ĐỒ ÁN TỐT NGHIỆP


Họ và tên sinh viên:……………………………………………………………………
Lớp: ……………………………………………..MSVV: ………………………….
Tên đề tài:
…………………………………………………………………………………………
…………………………………………………………………………………………

Tuần/ngày Nội dung Xác nhận GVHD

GV HƯỚNG DẪN
(Ký và ghi rỏ họ tên )

4
LỜI CAM ĐOAN

Đề tài này là do sinh viên Nguyễn Hùng Duy tự thực hiện, dựa vào một số tài
liệu trước đó và không sao chép từ tài liệu hay công trình nào đã có trước đó.

Người thực hiện đề tài

Nguyễn Hùng Duy

5
LỜI CẢM ƠN

Sau quá trình tìm hiểu, nghiên cứu và thực hiện đề tài đồ án tốt nghiệp và hoàn
thành đúng tiến độ, chúng em xin chân thành gửi lời cảm ơn sâu sắc nhất đến quý thầy
cô, gia đình và những người anh, người bạn đã hết mình giúp đỡ, đưa ra những lời
khuyên, lời động viên trong những lúc khó khăn.

Chúng em xin gửi lời cảm ơn đến thầy Nguyễn Đăng Khoa, giảng viên trường
Đại Học Nông Lâm TP.Hồ Chí Minh đã hướng dẫn và tạo mọi điều kiện điều kiện để
nhóm có thể thực hiện tốt đề tài của mình.

Và chúng em cũng xin gửi lời tri ân đến các thầy cô trong khoa Điện tử-Công
nghệ của Đại Học Nông Lâm TP.Hồ Chí Minh đã tận tình dạy dỗ và giảng dạy cho
chúng em những kiến thức cơ bản đến nâng cao tạo cho chúng em một cơ sở kiến thức
vững vàng để hoàn thành đề tài này.

Gia đình luôn là nguồn động lực và là nguồn cảm hứng để chúng em liên tục
phấn đấu và hoàn thành đề tài, xin cảm ơn đấng sinh thành đã luôn động viên chúng
em trong những lúc bế tắc và chán nản nhất.

Và cuối cùng chúng em xin cảm ơn các anh, chị đi trước và bạn bè đã có những
lời khuyên, lời góp ý chân thành để đề tài của chúng em có thể hoàn thiện hơn.

Một lần nữa, chúng em xin cảm ơn tất cả mọi người đã luôn ở bên cạnh và giúp
đỡ chúng em, tạo động lực để chúng em hoàn thành tốt đề tài này.

Xin chân thành cảm ơn

6
MỤC LỤC
TÓM TẮT..................................................................................................................12

CHƯƠNG 1: TỔNG QUAN.....................................................................................13

1.1. Đặt vấn đề.....................................................................................................13

1.2. Mục tiêu..........................................................................................................14

1.3. Nội dung thực hiện........................................................................................14

1.4. Bố cục.............................................................................................................15

CHƯƠNG 2: CƠ SỞ LÝ THUYẾT........................................................................16

2.1. TỔNG QUAN VỀ ARDUINO......................................................................16

2.1.1. Giới thiệu.....................................................................................................16

2.1.2. Phần cứng....................................................................................................17

2.2. NHẬN DẠNG VÂN TAY..............................................................................17

2.2.1. Giới thiệu sơ lược về dấu vân tay và nhận dạng vân tay..............................17

2.2.2. Việc ứng dụng công nghệ nhận dạng vân tay hiện nay................................18

2.2.3. Nguyên lý hoạt động cơ bản của nhận dạng vân tay....................................18

2.2.4. Các bước xử lý trong quá trình nhận dạng vân tay......................................19

2.3. GIỚI THIỆU VỀ PHẦN CỨNG..................................................................21

2.3.1. Arduino Mega 2560.....................................................................................21

2.3.2. Module cảm biến vân tay R307 (Finger print R307)...................................24

2.3.3. Bàn phím ma trận 3x4 (Keypad 3x4)...........................................................32

2.3.4. Màn hình LCD 1602....................................................................................34

2.3.5. Mạch chuyển giao tiếp LCD 1602...............................................................35

2.3.6. Module ESP 8266 MCU V3........................................................................36

2.3.7. Mạch hạ áp LM2596...................................................................................41

CHƯƠNG 3: TÍNH TOÁN VÀ THIẾT KẾ............................................................43

7
3.1. GIỚI THIỆU..................................................................................................43

3.2. TÍNH TOÁN VÀ THIẾT KẾ HỆ THỐNG.................................................43

3.2.1. Thiết kế sơ đồ khối hệ thống.......................................................................43

3.2.2. Tính toán và thiết kế mạch..........................................................................44

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

CHƯƠNG 4: THI CÔNG HỆ THỐNG...................................................................50

4.1. ĐÓNG GÓI VÀ THI CÔNG MÔ HÌNH.....................................................50

4.1.1. Đóng gói bộ điều khiển...............................................................................50

4.1.2. Thi công mô hình........................................................................................50

4.2. LẬP TRÌNH HỆ THỐNG.............................................................................51

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

4.2.2. Phần mềm lập trình cho vi điều khiển.........................................................57

4.2.3. Phần mềm Exel............................................................................................61

4.3. VIẾT TÀI LIỆU HƯỚNG DẪN SỬ DỤNG, THAO TÁC.........................61

CHƯƠNG 5: KẾT QUẢ, NHẬN XÉT, ĐÁNH GIÁ...............................................63

5.1. KẾT QUẢ.......................................................................................................63

5.2. Nhận xét và đánh giá.....................................................................................67

CHƯƠNG 6: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN.........................................69

6.1. Kết luận..........................................................................................................69

6.2. HƯỚNG PHÁT TRIỂN................................................................................70

TÀI LIỆU THAM KHẢO.........................................................................................71

PHỤ LỤC................................................................................................................... 72

8
DANH SÁCH CÁC HÌNH
Hình 2.1: Các loại Arduino..........................................................................................16

Hình 2.2: Sơ đồ quá trình xử lý ảnh.............................................................................19

Hình 2.3: Sơ đồ quá trình so sánh vân tay....................................................................20

Hình 2.4: Sơ đồ các chân kết nối trên Arduino Mega 2560.........................................22

Hình 2.5: Mạch Arduino Mega....................................................................................23

Hình 2.6: Module cảm biến vân tay R305...................................................................25

Hình 2.7: Giao thức truyền thông của R307................................................................28

Hình 2.8: Định dạng gói dữ liệu..................................................................................30

Hình 2.91: Sơ đồ nối dây và hình ảnh thực tế của bàn phím ma trận 3x4....................32

Hình 2.10: Màn hình LCD 1602 và các chân kết nốt...................................................34

Hình 2.11: Mạch chuyển giao tiếp LCD 1602.............................................................35

Hình 2.12: Sơ đồ các chân kết nối của Module ESP 8266...........................................37

Hình 2.13: Mạch hạ áp LM2596..................................................................................41

Hình 2.14: Sơ đồ chân kết nối của mạch hạ áp LM2596.............................................41

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

Hình 3.2: Khối xử lý trung tâm sử dụng board Arduino Mega 2560...........................44

Hình 3.3: Sơ đồ nguyên lý Cảm biến vân tay kết nối Arduino Mega...........................46

Hình 3.4: LCD 12x6....................................................................................................46

Hình 3.5: Mạch chuyển giao tiếp LCD sang I2C.........................................................47

Hình 3.6: Hình ảnh thực tế của Adapter 12V 3A.........................................................47

Hình 3.7: Module hạ áp LM2596.................................................................................48

Hình 3.8: Sơ đồ chuyên lý toàn mạch..........................................................................49

Hình 4.1: Sơ đồ bố trí linh kiện mặt trước mô hình.....................................................50

9
Hình 4.2: Hình dạng bên ngoài mô hình......................................................................50

Hình 4.3: Hình dạng bên trong mô hình.......................................................................51

Hình 4.4: Lưu đồ menu................................................................................................52

Hình 4.5: Lưu đồ quét vân tay.....................................................................................54

Hình 4.6: Lưu đồ truyền dữ liệu lên wed.....................................................................55

Hình 4.7: Lưu đồ quản trị............................................................................................56

Hình 4.8: Giao diện lập trình arduino..........................................................................57

Hình 4.9: Arduino Toolbar..........................................................................................57

Hình 4.10: Giao diện Web...........................................................................................60

Hình 4.11: Excel..........................................................................................................61

Hình 5.1: Phần check vân tay......................................................................................64

Hình 5.2: Phần thêm vân tay và xóa vân tay................................................................64

Hình 5.3: Phần quản lí Admin.....................................................................................64

Hình 5.4: Đưa ngón tay vào cảm biến..........................................................................65

Hình 5.5: Hệ thống xác nhận vân tay...........................................................................65

Hình 5.6: Phần thêm vân tay và xóa vân tay................................................................65

Hình 5.7: Phần nhập mật mã........................................................................................65

Hình 5.8: Phần thêm vân tay........................................................................................66

Hình 5.9: Thao tác thêm vân tay..................................................................................66

Hình 5.10: Phần xóa vân tay........................................................................................66

Hình 5.11: Phần hiển thị thông tin quét vân tay trên wed server..................................66

Hình 5.12: Hệ thống cảnh báo sinh viên......................................................................67

10
DANH SÁCH CÁC BẢN
Bảng 2.1: Các chân kết nối của Module R307.............................................................27

Bảng 2.2: Định dạng gói dữ liệu..................................................................................31

Bảng 2.3: Bảng thông tin các chân kết nối của Module ESP 8266..............................38

Bảng 2.4: Bảng thông tin chân kết nối của mạch hạ áp LM2596.................................42

11
TÓM TẮT

Ngày nay, với sự phát triển vượt bậc của khoa học công nghệ, kéo theo các
công nghệ nhận dạng sinh trắc học phát triển. Do tính bảo mật cũng như giá thành
không quá đắt nên công nghệ nhận dạng vân tay được được sử dụng rộng rãi trong đời
sống. Công nghệ nhận dạng vân tay được tích hợp trong nhiều thiết bị điện tử mang lại
những ứng dụng cần thiết cho nhu cầu của con người. Những ứng dụng hiện hữu của
công nghệ nhận dạng vân tay như quét vân tay để đóng mở cửa, quản lí số lượng cá
nhân ra vào hay điểm danh chấm công trong một công ty, bệnh viện hay trường học,…

Được sự gợi ý từ giáo viên hướng dẫn cũng như mong muốn tìm hiểu các công
nghệ đang phát triển trên thế giới. Nên nhóm thực hiện đồ án này với mong muốn chế
tạo ra một hệ thống giám sát và cảnh báo thời gian ra vào lớp học của sinh viên thông
qua việc quét vân tay. Hệ thống quét vân tay sử dụng kit Arduino được giám sát và
cảnh báo bằng máy tính qua Internet bao gồm:

Quá trình quét vân tay sẽ được gửi lên Internet nhằm thống kê thời gian ra vào
lớp học, số lần đi trễ, số ngày vắng, thông tin sinh viên, giảng viên… Hệ thống cho
phép thêm vân tay hay xóa vân tay người dung, đổi mật khẩu,… Hệ thống sẽ gửi cảnh
báo về mail của người dùng về thời gian ra vào cũng như số ngày trễ, vắng thông qua
ứng dụng Exel.

Mô hình sử dụng kit Arduino Mega làm vi điều khiển trung tâm để điều khiển
các module mở rộng như cảm biến vân tay R307, Module ESP8266, ma trận phím,…

Người dùng dễ dàng tương tác sử dụng thông qua cảm biến vân tay, ma trận
phím. Giám sát và cảnh báo người dùng thông qua mạng Internet.

12
CHƯƠNG 1: TỔNG QUAN

CHƯƠNG 1: TỔNG QUAN


1.1. Đặt vấn đề
Trong thời đại ngày nay, sự phát triển không ngừng của khoa học kỹ thuật
đã giúp cho con người thuận tiện hơn trong các công việc hằng ngày. Với sự bùng
nổ về công nghệ thông tin, quá trình toàn cầu hóa diễn ra nhanh chóng, sự bảo mật
riêng tư thông tin cá nhân cũng như để nhận biết một người nào đó trong hàng tỉ
người trên trái đất đòi hỏi phải có một tiêu chuẩn, hệ thống đảm nhận các chức
năng đó. Công nghệ sinh trắc ra đời và đáp ứng được các yêu cầu trên.
Nhiều công nghệ sinh trắc đã và đang được phát triển, một số chúng đang
được sử dụng trong các ứng dụng thực tế và phát huy hiệu quả cao. Các đặc trưng
sinh trắc thường được sử dụng là vân tay, gương mặt, mống mắt, tiếng nói. Mỗi
đặc trưng sinh trắc có điểm mạnh và điểm yếu riêng, nên việc sử dụng đặc trưng
sinh trắc cụ thể là tùy thuộc vào yêu cầu của mỗi ứng dụng nhất định. Nhận dạng
vân tay được xem là một trong những kỹ thuật nhận dạng hoàn thiện và đáng tin
cậy nhất.
Với việc kế thừa và phát triển từ đề tài trước đó “Thiết kế và thi công hệ
thống đóng mở cửa bằng vân tay sử dụng kit Arduino được giám sát bằng máy tính
thông qua Internet”., nhóm sinh viên quyết định thực hiện mở rộng thêm với tên đề
tài “QUẢN LÝ VÀ CẢNH BÁO SINH VIÊN THÔNG QUA HỆ THỐNG QUÉT
VÂN TAY” nhằm mục đích kiểm soát tốt hơn trong việc quản lý sinh viên trong
trường học cũng như thông báo, cảnh báo cho sinh viên biết được số lần vi phạm
của mỗi sinh viên trong quá trình tham gia hoạt động học tập trên lớp.

Dấu vân tay của mỗi cá nhân là độc nhất và không thay đổi trong suốt cuộc
đời. Vân tay là một tham số sinh học bất biến theo tuổi tác đặc trưng cho mỗi cá
thể. Mạng Internet đang ngày càng phát triển, nhờ có nó mà cuộc sống và công
việc của con người ngày càng hiện đại hơn. Vì vậy, việc truyền dữ liệu lên mạng
quản lý dữ liệu vân tay bằng Internet trở nên tiện lợi, nhanh chóng và chính xác.
Mặt khác, việc phát triển không ngừng của vi xử lý đã cho ra đời nhiều loại sản
phẩm thông minh nhỏ gọn, tích hợp nhiều chứ năng cho người dùng dễ sử dụng.
Không thể không kể đến kit Arduino, một sản phẩm được sử dụng trên toàn cầu và
13
CHƯƠNG 1: TỔNG QUAN
có cộng đồng người dùng rất lớn. Kit Arduino có thể kết hợp với nhiều module
khác để tạo nên những ứng dụng thiết thực cho cuộc sống hiện đại ngày nay. Với
những đặc tính trên, nhóm đã quyết định thực hiện mô hình bao gồm Arduino,
module cảm biến vân tay và ma trận phím để làm một hệ thống quét vân tay quản lí
sinh viên và gửi dữ liệu lên Internet, cảnh báo số lần vi phạm của sinh viên thông
qua việc mail thông báo cho sinh viên.

1.2. Mục tiêu


Tìm hiểu và nghiên cứu về kit Arduino, module cảm biến vân tay R307, thiết bị
điện và cách kết nối giữa các module để hoàn thành mô hình hoàn thiện.

Xây dựng hệ thống quét dấu vân tay để điều khiển đóng mở cửa qua cảm biến vân
tay và dữ liệu vân tay sẽ được gửi lên Internet thông qua module ESP8266.

Dữ liệu vân tay, thống kê thời gian ra vào, số lần ra vào, số lần trễ so với quy định
của người dùng sẽ được quản lý thông qua Internet.

Cảnh báo sinh viên ra số lần ra vào, số lần trễ, vắng bằng cách gửi cảnh báo về
mail của người dùng.

1.3. Nội dung thực hiện


Nội dung 1: Tìm hiểu và nghiên cứu về cấu tạo phần cứng, nguyên lí hoạt động,
tính năng của các module Adruino, cảm biến vân tay R307, ma trận phím,
ESP2688.
Nội dung 2: Tìm hiểu và nghiên cứu về lập trình Wed, Exel, cơ sở dữ liệu
Database, gửi thông tin đến gmail sinh viên.
Nội dung 3: Các giải pháp thiết kế hệ thống và thi công mô hình.
Nội dung 4: Thiết kế hệ thống điều khiển, lưu đồ giải thuật và chương trình điều
khiển mô hình hệ thống.
Nội dung 5: Thiết kế hoàn chỉnh mô hình thực tế.
Nội dung 6: Tiến hành chạy thử nghiệm mô hình hệ thống.
Nội dung 7: Cân chỉnh mô hình hệ thống.

14
CHƯƠNG 1: TỔNG QUAN
Nội dung 8: Viết sách luận văn.
Nội dung 9: Bảo vệ tiểu luận tốt nghiệp.
1.4. Bố cục
Chương 1: Tổng quan
Trình bày về đặt vấn đề dẫn nhập lý do chọn đề tài, mục tiêu, nội dung
nghiên cứu,các giới hạn thông số và bố cục đồ án.

Chương 2: Cơ sở lí thuyết
Trình bày về các lý thuyết có liên quan đến các vấn đề mà đề tài sẽ dùng để
thực hiện thiết kế, thi công cho đề tài.

Chương 3: Tính toán và thiết kế


Giới thiệu tổng quan về các yêu cầu của đề tài mà mình thiết kế và các tính
toán, thiết kế gồm những phần nào. Như: thiết kế sơ đồ khối hệ thống, sơ đồ
nguyên lý toàn mạch, tính toán thiết kế mạch.

Chương 4: Thi công hệ thống


Trình bày về quá trình vẽ mạch in lắp ráp các thiết bị, đo kiểm tra mạch, lắp
ráp mô hình. Thiết kế lưu đồ giải thuật cho chương trình và viết chương
trình cho hệ thống. Hướng dẫn quy trình sử dụng hệ thống.

Chương 5: Kết quả-Nhận xét-Đánh giá


Trình bày về những kết quả đã được mục tiêu đề ra sau quá trình nghiên cứu
thi công. Từ những kết quả đạt được để đánh giá quá trình hoàn thành được
bao nhiêu phần trăm.

Chương 6: Kết luận và hướng phát triển


Trình bày về những kết quả mà đồ án đạt được, những hạn chế, từ đó rút ra
kết luận và hướng phát triển để giải quyết các vấn đề tồn đọng để đồ án
hoàn thiện hơn.

15
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT

CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
2.1. TỔNG QUAN VỀ ARDUINO

Hình 2.1: Các loại Arduino


2.1.1. Giới thiệu
- Arduino thật ra là một bo mạch vi xử lý được dùng để lập trình tương tác với
các thiết bị phần cứng như cảm biến, động cơ hoặc các thiết bị khác. Đặc điểm
nổi bật của Arduino là môi trường phát triển ứng dụng cực kỳ dễ sử dụng, với
một ngôn ngữ lập trình có thể học một cách nhanh chóng ngay cả với người ít
am hiểu về điện tử và lập trình cũng có thể sử dụng một cách dễ dàng. Arduino
có mức giá thấp, phù hợp với nhu cầu người dùng, có tính chất nguồn mở và
cộng đồng người dùng đông đảo. Với lợi thế đến từ giá thành cũng như lợi thế
về cộng đồng người dùng, không quá ngạc nhiên khi được biết số người sử
dụng Arduino trải rộng từ học sinh phổ thông đến sinh viên đại học.

- Board mạch Arduino được sử dụng để thực hiện nhiều ứng dụng như: cánh tay
robot, điều khiển và giám sát nhiệt độ độ ẩm phòng thí nghiệm, điều khiển động
cơ đóng mở cửa, ...

16
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT

2.1.2. Phần cứng


- Phần cứng bao gồm một board mạch nguồn mở được thiết kế trên nền tảng vi
xử lý AVR Atmel 8-bit, hoặc ARM Atmel 32-bit. Board Arduino sẽ đưa ra hầu
hết các chân I/O của vi điều khiển để sử dụng cho những mạch ngoài.

- Những Model hiện tại được trang bị gồm 1 cổng giao tiếp USB, 6 chân đầu vào
analog, 14 chân I/O kỹ thuật số tương thích với nhiều board mở rộng khác nhau
giúp dễ dàng lập trình và có thể mở rộng với các mạch khác, các module thêm
vào có thể dễ dàng chuyển đổi, được gọi là shield. Vài shield kết nối với board
Arduino trực tiếp thông qua các chân khác nhau, nhưng nhiều shield được định
địa chỉ thông qua serial bus I2C, nhiều shield có thể được xếp chồng và sử dụng
dưới dạng song song. Arduino chính thức thường sử dụng các dòng chip
MegaAVR, đặc biệt là ATMega8, ATMega168, ATMega328, ATMega1280,
và ATMega2560.

- Theo nguyên tắc, khi sử dụng phần mềm Arduino, tất cả các board được lập
trình thông qua một kết nối RS-232, nhưng cách thức thực hiện lại tùy thuộc
vào đời phần cứng. Các board Serial Arduino có chứa một mạch chuyển đổi
giữa RS-232 sang TTL. Các board Arduino hiện tại được lập trình thông qua
cổng USB, thực hiện thông qua chip chuyển đổi USB-to-serial như là FTDI
FT232.

2.2. NHẬN DẠNG VÂN TAY


2.2.1. Giới thiệu sơ lược về dấu vân tay và nhận dạng vân tay
a. Khái niệm về dấu vân tay
- Vân tay là do các gai da đội lớp biểu bì lên mà thành. Đó là nơi tập kết miệng
các tuyến mồ hôi, tuyến bã nhờn… Nó đã định hình khi con người còn là cái
thai 4 tháng trong bụng mẹ. Khi đứa bé ra đời, lớn lên, vân tay được phóng đại
nhưng vẫn giữ nguyên dạng cho đến khi về già. Nếu tay có bị bỏng, bị thương,
bị bệnh thì khi lành, vân tay lại tái lập y hệt như cũ. Chỉ khi có tổn thương sâu

17
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
huỷ hoại hoàn toàn, sẹo chằng chịt mới xoá mất vân tay.Vân tay không ai giống
ai, đặc sắc nhất là vân ngón cái và ngón trỏ.
b. Giới thiệu về nhận dạng vân tay
- Từ xa xưa, con người đã nhận ra mỗi cá nhân đều có một vân tay riêng nhưng
chưa có một cơ sở khoa học nào để nghiên cứu và nhận dạng. Nhưng đến thế kỷ
16, các kỹ thuật vân tay khoa học hiện đại đã xuất hiện và từ đó các lí thuyết và
chương trình mô tả, nhận dạng vân tay mới phát triển mau chóng. Năm 1888,
Francis Galton giới thiệu các đặc trưng chi tiết phục vụ cho đối sánh vân tay.

- Nhưng đến đầu thế kỉ 20, nhận dạng vân tay chính thức được chấp nhận như
một phương pháp nhận dạng cá nhân có giá trị và trở thành tiêu chuẩn trong
pháp luật. Ví dụ, năm 1924 FBI đã thiết lập một cơ sở dữ liệu có 810.000 thẻ
vân tay.

2.2.2. Việc ứng dụng công nghệ nhận dạng vân tay hiện nay
- Trên thế giới hiện nay đã xuất hiện nhiều sản phẩm công nghệ cao sử dụng
phương pháp nhận dạng vân tay như khóa vân tay, máy chấm công vân tay,
máy tính xách tay, điện thoại thông minh. Tuy nhiên đây vẫn là vấn đề còn
chưa được nghiên cứu nhiều ở Việt Nam. Ở nước ta, phương pháp này mới chỉ
phổ biến ở việc quản lý nhân sự thông qua chứng minh thư nhân dân và phục
vụ điều tra phá án. Các sản phẩm công nghệ cao nói trên chúng ta vẫn phải
nhập khẩu với giá thành khá cao, do đó chúng vẫn chưa được phổ biến rộng rãi.

2.2.3. Nguyên lý hoạt động cơ bản của nhận dạng vân tay
- Nguyên lý hoạt động của công nghệ nhận dạng vân tay là khi đặt ngón tay lên
trên một thiết bị nhận dạng dấu vân tay, ngay lập tức thiết bị này sẽ quét hình
ảnh ngón tay đó và đối chiếu các đặc điểm của ngón tay đó với dữ liệu đã được
lưu trữ trong hệ thống. Quá trình xử lý dữ liệu sẽ được thiết bị chuyển sang các
dữ liệu số và ra thông báo rằng dấu vân tay đó là hợp lệ hay không hợp lệ để
cho phép hệ thống thực hiện các chức năng tiếp theo. Hệ thống sinh trắc học sẽ
ghi nhận mẫu vân tay của người dùng và lưu trữ tất cả những dữ liệu đặc biệt

18
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
này thành một mẫu nhận diện được số hoá toàn phần. Có hai phương pháp để
lấy dấu vân tay.

- Cách thứ nhất (cổ điển) là sao chép lại hình dạng vân tay (như lăn tay bằng
mực, hay chạm vào một vật gì đó) thông qua máy quét ghi nhận và xử lý.
- Cách thứ hai, hiện tại đa số các nước đều sử dụng phần mềm hoặc thiết bị quét
vân tay để nhận dạng vân tay.

2.2.4. Các bước xử lý trong quá trình nhận dạng vân tay
- Quá trình xử lý nhận dạng vân tay được chia làm hai quá trình lớn: quá trình xử
lý ảnh và quá trình so sánh vân tay.
a. Quá trình xử lý ảnh

Hình 2.2: Sơ đồ quá trình xử lý ảnh


- Mục đích của quá trình này được biểu diễn qua hình 2.2 là tăng cường ảnh vân
tay, sau đó, rút trích các đặc trưng vân tay từ ảnh đã được tăng cường. Quá trình
này được thực hiện qua các bước nhỏ sau:

 Tăng cường ảnh (Image Enhancement): Ảnh được lấy từ thiết bị đầu đọc
vân tay sẽ được làm rõ. Do các thiết bị đầu đọc vân tay không lấy ảnh tốt
hay do vân tay của người dùng trong lúc lấy bị hao mòn, dơ bẩn, hay do lực
ấn ngón tay trong lúc lấy vân tay. Vì vậy, bước này là một trong các bước
quan trọng nhất của quá trình này để làm rõ ảnh vân tay để rút trích các đặc
trưng đúng và đầy đủ.

19
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
 Phân tích ảnh (Image Analysis): Thông qua phân tích ảnh, ảnh sẽ được loại
bỏ những thông tin làm nhiễu hay những thông tin không cần thiết.
 Nhị phân hóa (Binarization): Nhị phân hóa ảnh vân tay thành ảnh trắng đen.
Bước này phục vụ cho bước Làm mỏng vân tay. Bước này có thể có hoặc
không vì phục thuộc vào thuật toán rút trích đặc trưng.

 Làm mỏng (Thinning): Làm mỏng các đường vân lồi của ảnh vân tay. Bước
này nhằm mục đích cho việc rút trích đặc trưng của vân tay. Bước này cũng
có thể có hoặc không vì phục thuộc vào thuật toán rút trích đặc trưng.

 Rút trích đặc trưng (Minutiae Extraction): Rút trích những đặc trưng cần
thiết cho quá trình so sánh vân tay.

b. Quá trình so sánh vân tay

Hình 2.3: Sơ đồ quá trình so sánh vân tay


- Mục đích của quá trình này được biểu diễn trên hình 2.3 là so sánh vân tay dựa
trên các đặc trưng đã được rút trích. Quá trình này được thực hiện qua các bước
nhỏ sau:

 Phân tích đặc trưng (Minutiae Analysis): Phân tích các đặc điểm cần thiết
của các đặc trưng để phục vụ cho việc so sánh vân tay.
 Xét độ tương tự cục bộ (Local Similarily): Thuật toán so sánh vân tay sẽ dựa
vào các thông tin cục bộ của các đặc trưng (gồm: tọa độ (x, y), hướng của
đặc trưng, góc tạo bởi tiếp tuyến của đường vân tại đặc trưng và trục ngang)
của vân tay để tìm ra các cặp đặc trưng giống nhau giữa hai vân tay.
20
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
 Xét độ tương tự toàn cục (Global Similarily): Từ nhưng khu vực tương tự
nhau trên cục bộ, thuật toán sẽ tiếp tục mở rộng so sánh trên toàn cục.
 Tính điểm so sánh (Calculate Matching Score): Tính toán tỷ lệ độ giống
nhau giữa các cặp đặc trưng. Điểm so sánh này sẽ cho biết độ giống nhau
của hai ảnh vân tay là bao nhiêu.
2.3. GIỚI THIỆU VỀ PHẦN CỨNG
 Thiết bị đầu vào: bàn phím ma trận 3x4, module cảm biến vân tay R307.
 Thiết bị đầu ra: màn hình LCD, Module ESP8266.
 Thiết bị điều khiển trung tâm: Board Arduino Mega 2560.
 Các chuẩn truyền dữ liệu UART, Database.
2.3.1. Arduino Mega 2560
- Arduino Mega 2560 sử dụng chip ATmega2560. Nó có 54 chân digital I/O
(trong đó có 15 chân điều chế độ rộng xung PWM), 16 chân đầu vào tương tự
(Analog Inputs),4 UARTs (cổng nối tiếp phần cứng), một thạch anh dao động
16 MHz, kết nối USB, một jack cắm điện, một đầu ICSP và một nút reset. Nó
chứa tất cả mọi thứ cần thiết để hỗ trợ các vi điều khiển, chỉ đơn giản là kết nối
nó với một máy tính bằng cáp USB hoặc với một bộ chuyển đổi điện AC-DC
hoặc có thể sử dụng pin.

- Board có khả năng tự động reset nhờ phần mềm thay vì đòi hỏi phải ấn nút reset
trước khi tải lên. Phần mềm Arduino sử dụng khả năng này để cho phép nạp
code lên chỉ cần nhấn vào nút Upload trong Arduino IDE. Điều này có nghĩa
rằng bộ nạp khởi động có thể có một thời gian chờ ngắn hơn. Arduino Mega
2560 có thể bảo vệ cổng USB của máy tính khi xảy ra hiện tượng quá dòng.
Mặc dù hầu hết các máy tính cung cấp bảo vệ nội bộ, các cầu chì cung cấp thêm
một lớp bảo vệ. Nếu dòng cao hơn 500mA được áp dụng cho các cổng USB,
cầu chì sẽ tự động phá vỡ các kết nối cho đến khi ngắt hoặc hiện tượng quá tải
được khắc phục.
a. Thông số kỹ thuật Arduino Mega 2560
- Chip vi điều khiển: ATmega2560.
- Điện áp cấp nguồn: 5V.
- Điện áp đầu vào (kiến nghị): 7-12V.
21
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
- Điện áp đầu vào (giới hạn): 6-20V.
- Số chân Digital I/O: 54 (có 15 chân điều chế độ rộng xung PWM).
- Số chân Analog (Input): 16.
- Dòng DC trên chân I/O: 40 mA.
- Dòng DC cho chân 3.3V: 50 mA.
- Flash Memory: 256KB trong đó có 8KB được sử dụng bởi bộ nạp khởi động
(bootloader).
- SRAM: 8 KB.
- EEPROM: 4 KB.
- Xung nhịp: 16 MH.
- Chiều dài: 101,52 mm.
- Chiều rộng: 53,3 mm.
- Cân nặng: 37 g.

b. Sơ đồ kết nối chân của Arduino Mega 2560


- Trong hình 2.4 bên dưới là hình ảnh sơ đồ các chân kết nối trên Arduino
Mega 2560 cùng với hình 2.5 là vị trí các chân của Arduino Mega 2560.

Hình 2.4: Sơ đồ các chân kết nối trên Arduino Mega 2560

22
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT

Hình 2.5: Mạch Arduino Mega


- USB (1): Arduino sử dụng cáp USB để giao tiếp với máy tính. Thông qua
cáp USB chúng ta có thể Upload chương trình cho Arduino hoạt động,
ngoài ra USB còn là nguồn cho Arduino.

- Nguồn (2 và 3): Khi không sử dụng USB làm nguồn thì chúng ta có thể sử
dụng nguồn ngoài thông qua jack cắm 2.1mm (cực dương ở giữa) hoặc có
thể sử dụng 2 chân Vin và GND để cấp nguồn cho Arduino. Bo mạch hoạt
động với nguồn ngoài ở điện áp từ 5 – 20 volt. Chúng ta có thể cấp một áp
lớn hơn tuy nhiên chân 5V sẽ có mức điện áp lớn hơn 5 volt. Và nếu sử
dụng nguồn lớn hơn 12 Volt thì sẽ có hiện tượng nóng và làm hỏng bo
mạch. Khuyến cáo nên dùng nguồn ổn định từ 6 đến dưới 12 volt. Chân 5V
và chân 3.3V (Output voltage): các chân này dùng để lấy nguồn ra từ nguồn
mà chúng ta đã cung cấp cho Arduino để cấp cho các thiết bị giao tiếp khác.
Lưu ý: không được cấp nguồn vào các chân này vì sẽ làm hỏng Arduino.

- Ngõ vào tương tự (4): Arduino Mega 2560 có 16 ngõ vào tương tự (các
chân từ A0 đến A15), mỗi ngõ vào này đều có độ phân giải 10 bit (1024 giá
trị). Mặc định đo từ 0 đến 5V, có thể thiết ập giá trị bằng cách điều chỉnh
chân AREF và sử dụng hàm Analog Referency() để chuyển đổi.

- Ngõ vào số (5 và 6): Mỗi một chân trong 54 chân số của board đều có thể
sử dụng như một ngõ vào hoặc ngõ ra. Mỗi chân có thể cung cấp hoặc nhận

23
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
được tối đa 40 mA và có một điện trở kéo lên bên trong 20-50 kOhms.
Ngoài ra, một số chân có chức năng đặc biệt:
 Serial: để truyền và nhận dữ liệu nối tiếp. Gồm các chân: Serial 0: 0
(RX) và 1 (TX); Serial 1: 19 (RX) và 18 (TX); Serial 2: 17 (RX) và 16
(TX); Serial 3: 15 (RX) và 14 (TX).
 External Interrupt: Các chân này có thể được cấu hình để kích hoạt sự
kiện ngắt mức thấp, ngắt cạnh lên hoặc xuống. Gồm các chân: 2
(interrupt 0), 3 (interrupt 1), 18 (interrupt 5), 19 (interrupt 4), 20
(interrupt 3), 21 (interrupt 2).
 PWM: Cung cấp ngõ ra PWM 8 bit. Gồm các chân từ chân 2 đến 13 và
44 đến 46.
 SPI: Các chân này hỗ trợ giao tiếp SPI bằng cách sử dụng thư viện SPI.
Có các chân: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS).
 TWI: Hỗ trợ giao tiếp TWI bằng việc sử dụng thư viện WIRE. Có các
chân: 20 (SDA) và 21 (SCL).

- Nút Retset (7): Mang dòng mức thấp để thiết lập lại vi điều khiển.

2.3.2. Module cảm biến vân tay R307 (Finger print R307)
- Hiện tại trên thị trường có rất nhiều loại cảm biến để nhận dạng và phát hiện
người dùng như: cảm biến nhận dạng khuôn mặt, cảm biến hồng ngoại, cảm
biến giọng nói, RFID,… nhưng với tính bảo mật và tiện lợi của cảm biến vân
tay rất phù hợp cho việc quản lý khóa và mở cửa.

- Đây là module nhận dạng vân tay giao tiếp trực tiếp qua giao thức UART có thể
kết nối trực tiếp đến vi điều khiển hoặc qua PC adapter Max232/USB-Serial.
Người sử dụng có thể lưu trữ dữ liệu vân tay trực tiếp vào module. Module có
thể dễ dàng giao tiếp với các loại vi điều khiển chuẩn 3.3V hoặc 5V. Có một
con Led xanh được bật sáng nằm sẵn trong ống kính trong suốt quá trình chụp
vân tay. Cảm biến với độ chính xác cao và có thể được nhúng vào các thiết bị
như: điều khiển truy cập, két sắt, khóa cửa nhà, khóa cửa xe,…

24
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT

Hình 2.6: Module cảm biến vân tay R305


a. Nguyên lý hoạt động
 Nguyên lý hoạt động của module cảm biến vân tay cơ bản có 2 phần:
- Lấy dữ liệu hình ảnh của vân tay: Khi lấy dữ liệu, người dùng cần phải thực
hiện quét dấu vân tay hai lần thông qua cảm biến quang học. Hệ thống sẽ
tiến hành thuật toán xử lý hình ảnh của 2 lần quét vân tay, tạo ra một khuôn
mẫu của các vân tay dựa trên kết quả xử lý và lưu trữ lại các bản mẫu.
- So sánh dấu vân tay (có thể theo chế độ 1:1 hoặc theo 1:N): Khi người dùng
thực hiện quét dấu vân tay, module sẽ chụp lại dữ liệu hình ảnh vân tay và
so sánh với các mẫu vân tay đã được lưu trữ sẵn trong thư viện. Đối với 1:1,
hệ thống sẽ so sánh trực tiếp vân tay với mẫu được chỉ định cụ thể trong
module; đối với 1:N, hoặc tìm kiếm, hệ thống sẽ tìm kiếm trong thư viện để
tìm vân tay phù hợp. Sau đó trả về kết quả đúngnếu trùng khớp hoặc kết quả
sai nếu không trùng khớp dữ liệu đã được lưu trữ.

b. Các đặc tính


- Module tích hợp nhiều loại chip xử lý trong cùng 1 module: cảm biến dấu vân
tay quang học, bộ vi xử lý DSP tốc độ cao, bộ nhớ PLASH…
- Dễ dàng sử dụng với các tính năng bảo mật cao, thông minh. Mức độ bảo mật
điều chỉnh được: thích hợp cho các ứng dụng khác nhau, mức độ bảo mật có thể
được thiết lập điều chỉnh bởi người sử dụng.

25
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
- Người dùng có thể tiến hành phát triển kết hợp với các module khác để làm ra
một loạt các sản phẩm cuối cùng, chẳng hạn như: kiểm soát quyền truy cập,
điểm danh vào lớp học hoặc chấm công, két an toàn, khóa cửa nhà hay cửa
xe…
- Tiêu thụ điện năng thấp, giá thành không cao, kích thước nhỏ gọn, hiệu năng
tuyệt vời.
- Khả năng chống tĩnh điện mạnh mẽ, chỉ số chống tĩnh điện đạt 15KV trở lên.
- Khả năng xử lý hình ảnh tốt, có thể chụp được hình ảnh có độ phân giải lên đến
500 dpi.

c. Thông số kỹ thuật
- Điện áp cung cấp: DC 3.6 ~ 6.0V.
- Dòng cung cấp:
 Dòng làm việc bình thường 40 mA
 Dòng đỉnh 150 mA
 So sánh với một mẫu duy nhất (1:1)
 Tìm kiếm và so sánh với mẫu lưu trong bộ nhớ (1:N). Bộ nhớ lưu mẫu: 256
Bytes
- Mức độ an toàn: năm (từ thấp đến cao: 1, 2, 3, 4, 5 (cao nhất)).
- Tỷ lệ lỗi chấp nhận nhầm (FAR): < 0,001.
- Tỷ lệ từ chối nhầm (FRR): < 0.1%.
- Thời gian tìm kiếm: < 0.8 giây (1: 880, trung bình).
- Giao tiếp với máy tính: UART (TTL mức logic) hoặc USB 1:1
- Tốc độ truyền thông tin liên lạc (UART): (9600 x N) bps đó N = 1 ~ 12 (giá trị
mặc định N = 6, tức là 57600bps)
 Nhiệt độ: -10ºC ~ +40ºC
 Độ ẩm tương đối: 40ºC - 85ºC
- Môi tường bảo quản
 Nhiệt độ: -40ºC ~ +85ºC
 Độ ẩm tương đối: < 85%

26
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT

d. Giao tiếp phần cứng


- Giao tiếp phần cứng của module R305 được thể hiện qua bảng 2.1:

Số Tên Chức năng


chân chân
1 VCC Nguồn vào
2 GND Tín hiệu nối đất
3 TXD Dữ liệu đầu ra. Kiểu TTL logic
4 RXD Dữ liệu đầu vào. Kiểu TTL logic
5 VCC +5V DC
6 D- Dữ liệu âm
7 D+ Dữ liệu dương
8 GND Ground
Bảng 2.1: Các chân kết nối của Module R307

e. Giao thức truyền thông nối tiếp không đồng bộ UART


- Được truyền theo chế độ nối tiếp bán song công bất đồng bộ. Tốc độ baud
truyền mặc định là 57600 bps và có thể cài đặt tốc độ này trong dải từ 9600 –
115200. Tại thời điểm bật nguồn, nó sẽ tốn 300ms cho việc thiết lập.

- Khung truyền với định dạng 10bit: với 1 bit bắt đầu (start bit) ở mức logic ‘0’, 8
bit dữ liệu với bit đầu LBS và 1 bit kết thúc (stop bit). Không có bit kiểm tra
(check bit).

- Dữ liệu được truyền đi trên chân TX gồm 1 start bit (mức ‘0’), data và 1 stop bit
(mức ‘1’). Tốc độ truyền: đơn vị bit per second (bps) còn gọi là Baud (số lần
thay đổi tín hiệu trong 1 giây – thường sử dụng cho modem). UART là phương
thức truyền nhận bất đồng bộ, nghĩa là bên nhận và bên phát không cần phải có
chung tốc độ xung clock (ví dụ: xung clock của vi điều khiển khác xung clock
của máy tính). Khi đó bên truyền muốn truyền dữ liệu sẽ gửi start bit (bit ‘0’)

27
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
để báo cho bên thu biết để bắt đầu nhận dữ liệu và khi truyền xong dữ liệu thì
stop bit (bit ‘1’) sẽ được gửi để báo cho bên thu biết kết thúc quá trình truyền.
- Khi có start bit thì cả hai bên sẽ dùng chung 1 xung clock (có thể sai khác một
ít) với độ rộng 1 tín hiệu (0 hoặc 1) được quy định bởi baud rate, ví dụ baud
rate = 9600 bps nghĩa là độ rộng của tín hiệu 0 (hoặc 1) là 1/9600 = 104 ms và
khi phát thì bên phát sẽ dùng baud rate chính xác (ví dụ 9600 bps) còn bên thu
có thể dùng baud rate sai lệch 1 ít (9800bps chẳng hạn). Truyền bất đồng bộ sẽ
truyền theo từng frame và mỗi có cấu trúc như trong hình 2.10 sau đây:

Hình 2.7: Giao thức truyền thông của R307


- Ngoài ra trong frame truyền có thể có thêm bit odd parity (bit lẻ) hoặc even
parity (bit chẵn) để kiểm tra lỗi trong quá trình truyền. Bit parity này có đặc
điểm nếu sử dụng odd parity thì số các bit ‘1’ + odd parity bit sẽ ra một số lẻ
còn nếu sử dụng even parity thì số các bit ‘1’ + even parity bit sẽ ra một số
chẵn.

- Module sẽ kết nối với MCU theo kết nối sau: TXD (chân 3 của module) kết nối
với RXD (chân nhận của MCU), RXD (chân 4 của module) kết nối với TXD
(chân truyền của MCU).

f. Tài nguyên hệ thống


- Bộ đệm: Có một bộ đệm hình ảnh và hai 512byte tệp kí tự đệm bên trong không
gian bộ nhớ RAM của module. Người dùng có thể đọc và viết bất kỳ của bộ
đệm bằng cách hướng dẫn.
 Lưu ý: Nội dung của bộ đệm trên sẽ bị mất khi tắt nguồn.

 Bộ đệm hình ảnh: Bộ đệm hình ảnh phục vụ cho việc lưu trữ hình ảnh và
các định dạng hình ảnh là 256 * 288 pixel. Khi truyền qua UART, để đẩy
nhanh tốc độ, chỉ có 4bit cao của các điểm ảnh được truyền (có nghĩa là 16
28
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
độ xám). Và hai điểm ảnh lân cận của cùng hàng sẽ hình thành một byte
trước khi truyền. Khi tải lên máy tính, hình ảnh 16-xám-độ sẽ được mở rộng
sang định dạng 256 mức xám. Đó là định dạng BMP 8-bit. Khi chuyển qua
USB, hình ảnh 8bit pixel, đó là 256 mức xám.
 Bộ đếm ký tự: Bộ đệm kí tự CharBuffer1, CharBuffer2, có thể được sử dụng
để lưu trữ cả tệp kí tự và tệp mẫu.

- Thư viện vân tay:


 Hệ thống đặt ra một không gian nhất định trong Flash cho mẫu dấu vân tay
lưu trữ, đó là thư viện vân tay. Nội dung của thư viện vẫn còn khi tắt nguồn.

 Dung lượng của thư viện thay đổi dung lượng của Flash, hệ thống sẽ nhận
biết sau khi tự động. Lưu trữ dấu vân tay mẫu trong Flash là theo tuần tự.

- Cấu hình các thông số:


 Kiểm soát tốc độ baud: Các thông số điều khiển UART tốc độ truyền thông
của Module. Giá trị của nó là một số nguyên N, N = [1, 12]. Tỷ lệ tương ứng
là 9600 baud * N bps.
 Mức độ bảo mật: Các thông số kiểm soát các giá trị ngưỡng phù hợp với tìm
kiếm của dấu vân tay và đối chiếu. Mức độ bảo mật được chia thành 5 lớp
và giá trị tương ứng là 1, 2, 3, 4, 5. Ở cấp độ 1, FAR là cao nhất và FRR là
thấp nhất. Tuy nhiên ở cấp độ 5, FAR là thấp nhất và FRR là cao nhất.
 Độ dài gói dữ liệu: Các thông số quyết định độ dài tối đa của các gói dữ liệu
chuyển giao khi giao tiếp với máy tính trên. Giá trị của nó là 0, 1, 2, 3,
tương ứng với 32 bytes, 64 byte, 128 byte, 256 byte tương ứng.

- Mật khẩu Module:


 Khi mở nguồn lại, hệ thống kiểm tra đầu tiên cho dù mật khẩu bắt tay đã
được sửa đổi. Nếu không, hệ thống máy tính trên xét thấy không có yêu cầu
xác minh mật khẩu và sẽ bước vào chế độ hoạt động bình thường. Đó là, khi
mật khẩu vẫn là mặc định, quá trình xác minh có thể được bỏ qua. Chiều dài

29
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
mật khẩu là 4 byte, và giá trị nhà máy mặc định của nó là 0xFF, 0xFF,
0xFF, 0xFF.

 Nên thay đổi mật khẩu, tham khảo hướng dẫn SetPwd, sau đó Module (hoặc
thiết bị) bắt tay mật khẩu phải được xác nhận trước khi hệ thống đi vào chế
độ hoạt động bình thường. Hoặc nếu không, hệ thống sẽ từ chối thực hiện và
lệnh.

- Địa chỉ Module:


 Mỗi module có một địa chỉ xác định. Khi giao tiếp với máy tính trên, mỗi
lệnh / dữ liệu được chuyển giao theo hình thức gói dữ liệu, trong đó có các
mục địa chỉ. Module hệ thống chỉ phản ứng với các gói dữ liệu có mục địa
chỉ giá trị là giống với địa chỉ xác định của nó. Chiều dài địa chỉ là 4 byte,
và giá trị mặc định của nó là 0xFFFFFFFF. Người dùng có thể thay đổi địa
chỉ qua SetAdder. Địa chỉ đổi mới vẫn còn lưu lại khi tắt nguồn.
- Bộ tạo số ngẫu nhiên:
 Module tích hợp một phần cứng 32-bit Bộ tạo số ngẫu nhiên (RNG). Qua
GetRandomCode, hệ thống sẽ tạo ra một số ngẫu nhiên và tải nó lên.

g. Giao thức truyền gói dữ liệu


- Khi module R308 thực hiện việc giao tiếp, truyền và nhận các câu lệnh/ dữ liệu/
kết quả thì tất cả được gói trong một định dạng gói dữ liệu được biểu diễn qua
hình 2.9:

Hình 2.8: Định dạng gói dữ liệu

- Trong đó, các thông số chi tiết hơn được biểu diễn qua bảng 2.2 sau:

30
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT

Bảng 2.2: Định dạng gói dữ liệu

h. Kiểm tra và xác nhận gói dữ liệu


 Lưu ý: lệnh chỉ được gửi từ VXL đến cảm biến, cảm biến chỉ trả về các gói xác
nhận.
- Định nghĩa bytes xác nhận:
 0x00h: thực thi hoàn tất.
 0x01h: lỗi nhận dữ liệu.
 0x02h: không phải vân tay.
 0x03h: thất bại đăng ký vân tay.
 0x06h: không tạo được đặt điểm nhân dạng.
 0x07h: dấu vân quá nhỏ để lấy mẫu.
 0x08h: dấu vân không trùng.
 0x09h: thất bại tìm kiếm dấu vân tay.
31
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
 0x0Ah: lỗi kết hợp đặc điểm dấu vân tay.
 0x0Bh: đại chỉ ID vượt khung.
 0xCh: lỗi đọc từ dữ liệu vân tay. Dữ liệu xấu.
 0xDh: lỗi nạp dữ liệu.
 0xEh: không thể nhận dữ liệu
 0xFh: lỗi gửi hình ảnh.
 0x10h: lỗi xoá dữ liệu.
 0x11h: lỗi xoá một ID.
 0x15h: lỗi tạo ảnh.
 0x18h: lỗi ghi flash.
 0x19h: không xác định được lỗi.
 0x1Ah: số đăng ký không hợp lệ.
 0x1Bh: gói dữ liệu sai.
 0x1Ch: sai số trang.
 0x1Dh: lỗi cổng giao tiếp.
 others: dự phòng.

2.3.3. Bàn phím ma trận 3x4 (Keypad 3x4)


- Sơ đồ nối dây và hình ảnh thực tế của bàn phím ma trận 4x4 được giới thiệu
qua hình 2.9 bên dưới.

Hình 2.91: Sơ đồ nối dây và hình ảnh thực tế của bàn phím ma trận 3x4
32
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
a. Khái niệm
- Keypad là một "thiết bị nhập" chứa các nút nhấn cho phép người dùng nhập
các chữ số, chữ cái hoặc ký hiệu vào bộ điều khiển. Keypad không chứa tất cả
bảng mã ASCII như keyboard và vì thế keypad thường được tìm thấy trong
các thiết bị chuyên dụng. Các nút nhấn trên các máy tính điện tử cầm tay là
một ví dụ về keypad. Số lượng nút nhấn của một keypad thay đổi phụ thuộc
vào yêu cầu ứng dụng. Gọi là keypad 3x4 vì keypad này có 12 nút nhấn được
bố trí dạng ma trận 4 hàng và 3 cột. Cách bố trí ma trận hàng và cột là cách
chung mà các keypad sử dụng. Cũng giống như các ma trận LED, các nút
nhấn cùng hàng và cùng cột được nối với nhau, vì thế với keypad 3x4 sẽ có
tổng cộng 7 ngõ ra (4 hàng và 3 cột).

b. Hoạt động của Keypad 3x4


- Theo hình trên, giả sử nút ‘2’ được nhấn, khi đó đường R1 và C2 được nối với
nhau. Giả sử đường C2 được nối với GND (mass, 0V) thì R1 cũng sẽ là GND.
Tuy nhiên, bằng cách kiểm tra trạng thái đường R1 chúng ta sẽ không kết luận
nút ‘2’ được nhấn. Giả sử tất cả các đường C1, C2, C3 đều nối với GND, nếu
R1= GND thì rõ ràng ta không thể kết luận nút ‘1’ hay nút ‘2’ hay nút ‘3’. Kỹ
thuật để khắc phục vấn đề này chính là kỹ thuật “quét” keypad. Có 2 cách
quét phím là quét theo cột hoặc quét theo hàng. Sau đây là ví dụ về quét theo
hàng, quét cột cũng hoàn toàn tương tự:

 Ta lần lượt xuất tín hiệu mức 0 ra các hàng (khi một hàng là mức ‘0’ thì tất
cả các hàng khác phải là mức 1).
 Sau đó kiểm tra các cột nếu cột nào có mức logic 0 thì phím có tọa độ hàng
và cột đó được ấn.

c. Thông số kỹ thuật
- Độ dài cáp: 88mm.
- Nhiệt độ hoạt động 0 ~ 70oC.
- Đầu nối ra 7 chân.
- Kích thước bàn phím 76.9 x 69.2 mm
33
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
d. Ứng dụng của Keypad 4x4
- Hệ thống an ninh bảo vệ bằng mật khẩu.
- Nhập liệu lựa chọn menu, điều khiển thiết bị.
- Nhập dữ liệu cho các hệ thống nhúng.

2.3.4. Màn hình LCD 1602

Hình 2.10: Màn hình LCD 1602 và các chân kết nốt

 Chức năng của từng chân LCD 1602:


- Chân số 1 - VSS: chân nối đất cho LCD được nối với GND của mạch điều
khiển.
- Chân số 2 - VDD: chân cấp nguồn cho LCD, được nối với VCC=5V của
mạch điều khiển.
- Chân số 3 - VE: điều chỉnh độ tương phản của LCD.
- Chân số 4 - RS: chân chọn thanh ghi, được nối với logic "0" hoặc logic "1":
 Logic “0”: Bus DB0 - DB7 sẽ nối với thanh ghi lệnh IR của LCD (ở chế
độ “ghi” - write) hoặc nối với bộ đếm địa chỉ của LCD (ở chế độ “đọc”
- read).
 Logic “1”: Bus DB0 - DB7 sẽ nối với thanh ghi dữ liệu DR bên trong
LCD.
- Chân số 5 - R/W: chân chọn chế độ đọc/ghi (Read/Write), được nối với
logic “0” để ghi hoặc nối với logic “1” đọc.
- Chân số 6 - E: chân cho phép (Enable). Sau khi các tín hiệu được đặt lên bus
DB0-DB7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép của chân
này như sau:
34
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
 Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào thanh ghi bên
trong khi phát hiện một xung (high-to-low transition) của tín hiệu chân
E.
 Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát hiện
cạnh lên (low-to-high transition) ở chân E và được LCD giữ ở bus đến
khi nào chân E xuống mức thấp.
- Chân số 7 đến 14 - D0 đến D7: 8 đường của bus dữ liệu dùng để trao đổi
thông tin với MPU. Có 2 chế độ sử dụng 8 đường bus này là: Chế độ 8bit
(dữ liệu được truyền trên cả 8 đường, với bit MSB là bit DB7) và Chế độ 4
bit (dữ liệu được truyền trên 4 đường từ DB4 tới DB7, bit MSB là DB7).
- Chân số 15 - A: nguồn dương cho đèn nền.
- Chân số 16 - K: nguồn âm cho đèn nền.

2.3.5. Mạch chuyển giao tiếp LCD 1602

Hình 2.11: Mạch chuyển giao tiếp LCD 1602

- Bằng việc sử dụng giao tiếp I2C, việc điều khiển trực tiếp màn hình được
chuyển sang cho IC xử lý nằm trên mạch. Chỉ cần việc gửi mã lệnh cùng nội
dung hiển thị, do vậy giúp vi điều khiển có nhiều thời gian xử lý các tiến trình
phức tạp khác.
- Ưu điểm của việc sử dụng giao tiếp I2C:

 Giao tiếp I2C chỉ sử dụng duy nhất 2 dây tín hiệu: SDA và SCL giúp tiết
kiệm chân trên vi điều khiển.
 Tốc độ truyền dữ liệu lên đến 400Kbps

35
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
 Dữ liệu truyền nhận đảm bảo tính toàn vẹn vì sử dụng cơ chế phản hồi
(ACK) trên mỗi byte dữ liệu.
 Có khả năng kết nối nhiều thiết bị với nhau: trên mạch có sẵn các mối hàn
A0, A1, A2 để thay đổi địa chỉ của module.

- Địa chỉ mặc định: 0x27, có thể mắc vào I2C bus tối đa 8 module
- Điện áp hoạt động: 3V-6V.
- Đề điều khiển độ tương phản điều chỉnh biến trở màu xanh.

2.3.6. Module ESP 8266 MCU V3


a. Giới thiệu
- Module ESP8266 là kit phát triển dựa trên nền chip Wifi SoC ESP8266 với
thiết kế dễ dàng sửa dụng vì tích hợp sẵn mạch nạp sử dụng chíp CP2102
trên borad. Bên trong ESP8266 có sẵn một lõi vi xử lý vì thế bạn có thể trực
tiếp lập trình cho ESP8266 mà không cần thêm bất kì con vi xử lý nào nữa.
Hiện tại có hai ngôn ngữ có thể lập trình cho ESP8266, sử dụng trực tiếp
phần mềm IDE của Arduino để lập trình với bộ thư viện riêng hoặc sử dụng
phần mềm node MCU.

b. Thông số kỹ thuật
- IC chính: ESP8266 Wifi SoC.
- Phiên bản firmware: NodeMCU Lua.
- Chip nạp và giao tiếp UART: CH340.
- GPIO tương thích hoàn toàn với firmware Node MCU.
- Cấp nguồn: 5VDC MicroUSB hoặc Vin.
- GIPO giao tiếp mức 3.3VDC.
- Tích hợp Led báo trạng thái, nút Reset, Flash.
- Tương thích hoàn toàn với trình biên dịch Arduino.
- Kích thước: 59 x 32mm.

36
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
c. Các chân kết nối

Hình 2.12: Sơ đồ các chân kết nối của Module ESP 8266

Nhãn GPIO Đầu vào Đầu ra Ghi chú


D0 GPIO16 Không gián đoạn Không hỗ trợ MỨC CAO khi khởi động

PWM hoặc 12c Sử dụng để đánh thức khi


ngủ sâu
D1 GPIO5 OK OK Thường được sử dụng
như SCL (I2C)
D2 GPIO4 OK OK Thường được sử dụng
như SDA (I2C)
D3 GPIO0 Kéo lên OK Kết nối với nút FLASH,
khởi động không thành
công nếu kéo MỨC
THẤP
D4 GPIO2 Kéo lên OK MỨC CAO khi khởi động

kết nối với đèn LED trên


bo mạch, khởi động
không thành công nếu kéo
MỨC THẤP
D5 GPIO14 OK OK SPI (SCLK)

37
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
D6 GPIO12 OK OK SPI (MISO)
D7 GPIO13 OK OK SPI (MOSI)
D8 GPIO15 Kéo đến GND OK SPI (CS)
Khởi động không thành
công nếu kéo MỨC CAO
RX GPIO3 OK Chân RX MỨC CAO khi khởi động

TX GPIO1 Chân TX OK MỨC CAO khi khởi động

đầu ra gỡ lỗi khi khởi


động, khởi động không
thành công nếu kéo MỨC
THẤP
A0 ADC0 Đầu vào analog X
Bảng 2.3: Bảng thông tin các chân kết nối của Module ESP 8266

- GPIO được kết nối với Chip Flash


 GPIO6 đến GPIO11 thường được kết nối với chip flash trong bo mạch
ESP8266. Vì vậy, những chân này không được khuyến khích sử dụng.

- Chân được sử dụng trong khi khởi động


 ESP8266 có thể bị ngăn không cho khởi động nếu một số chân được kéo
MỨC THẤP hoặc MỨC CAO. Danh sách sau đây cho thấy trạng thái của
các chân khi khởi động:
 GPIO16: chân ở mức cao khi khởi động
 GPIO0: lỗi khởi động nếu kéo mức thấp
 GPIO2: chân ở mức cao khi khởi động, không khởi động được nếu kéo
mức thấp
 GPIO15: lỗi khởi động nếu kéo mức cao
 GPIO3: chân ở mức cao khi khởi động
 GPIO1: chân ở mức cao khi khởi động, không khởi động được nếu kéo
mức thấp
 GPIO10: chân ở mức cao khi khởi động
 GPIO9: chân ở mức cao khi khởi động
38
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT

- Chân mức cao khi khởi động


 Có một số chân xuất ra tín hiệu 3.3V khi ESP8266 khởi động. Điều này sẽ
là vấn đề cần phải quan tâm nếu bạn có relay hoặc thiết bị ngoại vi khác
được kết nối với các GPIO đó. Các GPIO sau xuất tín hiệu mức cao khi khởi
động:
 GPIO16
 GPIO3
 GPIO1
 GPIO10
 GPIO9
 Ngoài ra, các GPIO khác, ngoại trừ GPIO5 và GPIO4, có thể xuất ra tín hiệu
điện áp thấp khi khởi động, có thể có vấn đề nếu chúng được kết nối với
transistor hoặc relay.

- Đầu vào analog


 ESP8266 chỉ hỗ trợ đọc analog trong một GPIO. GPIO đó được gọi là
ADC0 và nó thường được đánh dấu trên màn lụa là A0.
 Điện áp đầu vào tối đa của chân ADC0 là 0 đến 1V nếu bạn đang sử dụng
chip trần ESP8266. Nếu bạn đang sử dụng bo phát triển như bộ ESP8266
12-E NodeMCU, thì dải điện áp đầu vào là 0 đến 3,3V vì bo này có bộ chia
điện áp bên trong.

- Đèn LED trên bo mạch


 Hầu hết các bo phát triển ESP8266 đều có đèn LED tích hợp. Đèn LED này
thường được kết nối với GPIO2.
 Đèn LED hoạt động với logic ngược. Gửi tín hiệu CAO để tắt và tín hiệu
THẤP để bật.

- Chân RST
39
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
 Khi chân RST được kéo THẤP, ESP8266 sẽ reset. Thao tác này cũng giống
như nhấn nút reset trên bo mạch.

- GPIO0
 Khi GPIO0 được kéo THẤP, nó sẽ đặt ESP8266 vào chế độ bộ nạp khởi
động. Thao tác này cũng giống như nhấn nút FLASH / BOOT trên bo mạch.

- GPIO16
 GPIO16 có thể sử dụng để đánh thức ESP8266 khỏi chế độ ngủ sâu. Để
đánh thức ESP8266 khỏi chế độ ngủ sâu, GPIO16 phải được kết nối với
chân RST.

- I2C
 ESP8266 không có chân I2C phần cứng, nhưng nó có thể được triển khai
trong phần mềm. Vì vậy, bạn có thể sử dụng bất kỳ GPIO nào làm I2C.
Thông thường, các GPIO sau được sử dụng làm chân I2C:
 GPIO5: SCL
 GPIO4: SDA
- SPI
 Các chân được sử dụng làm SPI trong ESP8266 là:
 GPIO12: MISO
 GPIO13: MOSI
 GPIO14: SCLK
 GPIO15: CS

- Các chân PWM


 ESP8266 cho phép phần mềm PWM ở tất cả các chân I / O:
GPIO0 đến GPIO16. Tín hiệu PWM trên ESP8266 có độ phân
giải 10-bit.

- Chân ngắt

40
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
 ESP8266 hỗ trợ chân ngắt trong bất kỳ GPIO nào, ngoại trừ GPIO16.
2.3.7. Mạch hạ áp LM2596
a. Giới thiệu

Hình 2.13: Mạch hạ áp LM2596

- Bộ điều chỉnh LM2596 là mạch tích hợp nguyên khối rất phù hợp lý tưởng
cho thiết kế dễ dàng và thuận tiện của bộ điều chỉnh điện áp một chiều điện
áp giảm (bộ chuyển đổi buck). Nó có khả năng cung cấp cho tải một dòng
điện có giá trị lên đến 3.0 A. Nó được bù nội bộ để giảm thiểu số lượng các
thành phần bên ngoài để đơn giản hóa thiết kế nguồn cung cấp điện.
- Do bộ chuyển đổi LM2596 là nguồn cung cấp năng lượng chuyển đổi, hiệu
suất của nó cao hơn đáng kể so với các bộ điều chỉnh tuyến tính ba chân phổ
biến, đặc biệt là với điện áp đầu vào cao hơn. LM2596 hoạt động ở tần số
chuyển đổi 150 kHz, do đó cho phép các thành phần bộ lọc có kích thước
nhỏ hơn mức cần thiết với các bộ điều chỉnh chuyển đổi tần số thấp hơn.

b. Sơ đồ chân và chức năng

41
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
Hình 2.14: Sơ đồ chân kết nối của mạch hạ áp LM2596

Chân Tên Chức năng

1 VIN Đây là đầu vào điện áp áp dương cho IC. Chân này phải được
nối với một tụ điện có giá trị thích hợp để giảm thiểu quá độ
điện áp và để cung cấp dòng chuyển mạch cần thiết bởi bộ
điều chỉnh.

2 GND Chân nối đất.

3 OUTPUT Công tắc bên trong. Điện áp ở chân này chuyển đổi giữa (+
VIN – VSAT) và khoảng -0,5V, với chu kỳ làm việc xấp xỉ
VOUT/VIN.

4 FEEDBACK Cảm biến điện áp đã điều chỉnh ở ngõ ra để hoàn tất vòng
phản hồi

5 ON/OFF Cho phép tắt mạch điều chỉnh chuyển mạch bằng cách sử
dụng tín hiệu mức logic, do đó giảm dòng tổng cung cấp đầu
vào xuống khoảng 80. Kéo chân này xuống dưới mức điện áp
ngưỡng khoảng 1,3V, bật bộ điều chỉnh và kéo chân này lên
trên 1,3V (tối đa 25V) để tắt bộ điều chỉnh.
Bảng 2.4: Bảng thông tin chân kết nối của mạch hạ áp LM2596

c. Thông số cơ bản
- Điện áp đầu ra cố định: 5V
- Phạm vi điện áp đầu vào rộng, lên đến 40V
- Kích thước PCB: 2,5 x 5,0 cm
- Dòng điện ra tối đa 3.0 A
- Bộ dao động nội tần số cố định 150 kHz
- Chế độ chờ công suất thấp
- Tắt máy nhiệt và bảo vệ giới hạn dòng điện
- Mức độ nhạy cảm độ ẩm (MSL) bằng 1
- Hiệu suất chuyển đổi lên đến 92%

42
CHƯƠNG 3: TÍNH TOÁN VÀ THIẾT KẾ

CHƯƠNG 3: TÍNH TOÁN VÀ THIẾT KẾ


3.1. GIỚI THIỆU
 Đề tài “Quản lý và cảnh báo sinh viên qua hệ thống quét vân tay” bao gồm:
- Hệ thống có chức năng chính như sau: hệ thống chính là hệ thống quét vân tay.
Sau đó, thông tin quét vân tay sẽ được gửi lên wed để hiển thị giờ vào của sinh
viên. Sau đó sẽ nhập liệu thông tin qua Exel và tính toán số lần đi trễ, thời gian
đi trễ, số ngày vắng học. Khi sinh viên đi trễ hoặc vắng học hệ thống sẽ gửi
cảnh báo về gmail của sinh viên. Thêm nữa là hệ thống sẽ them vân tay, xóa
vân tay, và quản lí dữ liệu.
3.2. TÍNH TOÁN VÀ THIẾT KẾ HỆ THỐNG
3.2.1. Thiết kế sơ đồ khối hệ thống
- Hệ thống gồm 6 khối ghép lại với nhau theo nhiều hướng tạo nên một hệ thống
hoạt động ổn định được trình bày trong sơ đồ khối hình 3.1 như sau:

KHỐI KHỐI CẢM


MODULE BIẾN VÂN
ESP8266 TAY

KHỐI XỬ
LÝ TRUNG
TÂM

KHỐI HIỂN KHỐI CHẤP


THỊ HÀNH

KHỐI NGUỒN
Hình 3.1: Sơ đồ khối hệ thống
43
CHƯƠNG 3: TÍNH TOÁN VÀ THIẾT KẾ
- Chức năng của từng khối:
 Khối nguồn: nguồn 12V 3A cung cấp nguồn cho toàn bộ hệ thống.
 Khối xử lý trung tâm: thu thập dữ liệu từ các thiết bị sau đó xử lý và điều
khiển khối chấp hành và khối hiển thị. Khối này do Arduino Mega 2560
thực hiện.
 Khối cảm biến vân tay: tiến hành quét dấu vân tay để đóng mở cửa và nơi
lưu trữ dấu vân tay. Khối này do module cảm biến vân tay R307 thực hiện.
 Khối Module ESP8266: dùng để gửi dữ liệu vân tay người dùng lên mạng
Internet.
 Khối hiển thị: hiển thị thông tin chế độ hoạt động khi người dùng thao tác.
 Khối chấp hành: ma trận phím bấm điều khiển.

3.2.2. Tính toán và thiết kế mạch


a. Khối xử lý trung tâm
- Arduino Mega 2560 sử dụng chip ATmega2560. Nó có 54 chân digital I/O
16 chân đầu vào tương tự (Analog Inputs), 4 UARTs (cổng nối tiếp phần
cứng), một thạch anh dao động 16 MHz, kết nối USB, một jack cắm điện,
một đầu ICSP và một nút reset như trong hình 3.2. Nó chứa tất cả mọi thứ
cần thiết để tạo thành khối xử lý trung tâm với đầy đủ các port.

- Ý tưởng thiết kế của nhóm là kết hợp nhiều module lại với nhau, do vậy sẽ
có nhiều chân kết nối nên việc lựa chọn Arduino Mega 2560 là rất phù hợp.

Hình 3.2: Khối xử lý trung tâm sử dụng board Arduino Mega 2560

44
CHƯƠNG 3: TÍNH TOÁN VÀ THIẾT KẾ
- Trong quá trình kết nối các module và lập trình cho hệ thống:
- Bộ nhớ sử dụng hết 2958 bytes vào khoảng 36% bộ nhớ
- Tổng số chân I/O sử dụng là 20 chân, công thức tính dòng tiêu thụ
- Dòng tiêu thụ = 20 x 40ma = 800ma

b. Khối cảm biến vân tay


- Khối cảm biến vân tay sẽ gửi tín hiệu về khối xử lý, khối xử lý sẽ nhận tín
hiệu và chuyển đến khối khác để chuyển tín hiệu đó đi. Đồng thời, khối cảm
biến vân tay chỉ hoạt động khi khối xử lý trung tâm yêu cầu.

- Trên thị trường có rất nhiều loại cảm biến vân tay như đầu đọc vân tay
R303S có khả năng lưu trữ 1000 mẫu vân tay, đầu đọc vân tay R101 có khả
năng lưu trữ 1000 mẫu, module R301 có khả năng lưu trữ 500 mẫu vân tay,
module R307 có khả năng lưu trữ 120 vân tay,… Do đề tài của nhóm thực
hiện quét vân tay cho một lớp học, mà số lượng sinh viên một lớp đại trà chỉ
khoảng 100 sinh viên nên nhóm lựa chọn module cảm biến vân tay R307 để
thực hiện trong đề tài này.

- Cảm biến vân tay R307 tích hợp xử lý hình ảnh và thuật toán xử lý trên
cùng một chip. Khả năng xử lý ảnh chụp tốt với độ phân giải lên đến
500dpi. Chuẩn giao tiếp: USB - UART (TTL logical logic) từ 9600 –
115200bps, sử dụng tốc độ mặc định là 57600 bps đảm bảo truyền nhận
chính xác dữ liệu. Bên cạnh đó là các thông số khác như:
 Điện áp cung cấp: 3.6V ~ 6V DC.
 Dòng điện tiêu thụ: < 120mA.

- Cách nối dây cho cảm biến vân tay R305 vào Arduino Mega 2560 theo thứ
tự chân:
 Dây số 1 nối vào nguồn 5V và dây số 2 nối vào chân GND của arduino.
 Dây số 3 nối vào chân số 19 RX1 và dây số 4 nối chân 18 TX1 của
Arduino Mega.

45
CHƯƠNG 3: TÍNH TOÁN VÀ THIẾT KẾ

Hình 3.3: Sơ đồ nguyên lý Cảm biến vân tay kết nối Arduino Mega

c. Khối Module ESP8266


- Đề tài cần một phương tiện để gửi dữ liệu người dùng khi quét vân tay lên
mạng Internet. Với cách kết nối đơn giản cũng như thao tác lập trình dễ
dàng nên nhóm quyết định chọn module ESP8266 để gửi dữ liệu lên
Internet. Tuy tính kinh tế khi chọn module này là không cao nhưng module
vẫn có những ưu điểm. Nếu hệ thống mất điện, module vẫn có thể gửi dữ
liệu khi sử dụng nguồn dự phòng, hệ thống mạng GPRS được phủ sống liên
tục. Nếu ta chuyển hệ thống đến nơi khác vẫn có thể cập nhật dữ liệu dễ
dàng mà không cần phải cấu hình lại hệ thống.

d. Khối hiển thị


- Hiển thị trạng thái làm việc của hệ thống lên màng hình LCD 20X4, với 4
hàng ta có thể dễ dàng thao tác giữa người dùng với mô hình hệ thống.

Hình 3.4: LCD 12x6


46
CHƯƠNG 3: TÍNH TOÁN VÀ THIẾT KẾ
- Vì ta sử dụng mạch chuyển giao tiếp LCD 20x4 sang I2C, chỉ cần 2 chân
SDA và SCL của Arduino Mega 2560 kết nối với 2 chân SDA và SCL của
module là đã có thể hiển thị thông tin lên LCD.
- Hình ảnh thực tế của mạch chuyển giao tiếp được thể hiện ở hình 3.7:

Hình 3.5: Mạch chuyển giao tiếp LCD sang I2C

 Hai chân nguồn VCC và GND được kết nối với Adapter 5V 2A để dòng
điện cho sim hoạt động ổn định lâu dài.
 SDA được nối vào chân số 20 SDA và SCL nối vào chân số 21 SCL của
Arduino Mega để truyền nhận dữ liệu theo chuẩn I2C.

e. Khối nguồn
- Sử dụng nguồn Adapter 12V 3A sau đó sử dụng Module hạ áp LM2596 để
hạ áp 12V xuống 5V.

Hình 3.6: Hình ảnh thực tế của Adapter 12V 3A


47
CHƯƠNG 3: TÍNH TOÁN VÀ THIẾT KẾ
- Thông số kỹ thuật của Adapter 12V 3A:
 Điện áp đầu vào: 100-240V 50/60Hz
 Điện áp đầu ra: 12V 3A
 Kích thước đầu chân cắm: 5.5mm *2.5mm

Hình 3.7: Module hạ áp LM2596

- Thông số kỹ thuật của LM2596:


 Điện áp đầu vào: Từ 3V đến 30V.
 Điện áp đầu ra: Điều chỉnh được trong khoảng 1.5V đến 30V.
 Dòng đáp ứng tối đa là 3A.
 Hiệu suất: 92%
 Công suất: 15W

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


- Dưới đây là hình 3.10 là sơ đồ nguyên lý toàn mạch thể hiện tất cả các khối và
kết nối các thiệt bị lại với nhau rồi cắm vào Arduino Mega.

48
CHƯƠNG 3: TÍNH TOÁN VÀ THIẾT KẾ

Hình 3.8: Sơ đồ chuyên lý toàn mạch

49
CHƯƠNG 4: THI CÔNG HỆ THỐNG

CHƯƠNG 4: THI CÔNG HỆ THỐNG


4.1. ĐÓNG GÓI VÀ THI CÔNG MÔ HÌNH
4.1.1. Đóng gói bộ điều khiển
- Sau khi kiểm tra mạch hoạt động tốt ta tiến hành đóng hộp thành mô hình hoàn
chỉnh. Hình 4.1 là sơ đồ bố trí linh kiện hiển thị ra bên ngoài mặt trước.

Hình 4.1: Sơ đồ bố trí linh kiện mặt trước mô hình

4.1.2. Thi công mô hình

Hình 4.2: Hình dạng bên ngoài mô hình

50
CHƯƠNG 4: THI CÔNG HỆ THỐNG

Hình 4.3: Hình dạng bên trong mô hình

4.2. LẬP TRÌNH HỆ THỐNG


4.2.1. Lưu đồ giải thuật
- Hệ thống thực hiện được ba chức năng đó là quét vân tay điểm danh,quản lí
admin và thêm vân tay để quản lý sinh viên trong một lớp học. Điểm danh để
quản lý thời gian ra vào lớp của sinh viên được thực hiện bằng cách quét vân
tay. Sau khi quét vân tay, dữ liệu ID của người quét sẽ được gửi lên mạng
Internet để hiện thông tin:Thời gian ra vào, số lần đi trễ, thời gian đi trễ, số
ngày vắng, thông tin sinh viên,…. Hệ thống còn cho phép thêm vân tay, xóa
vân tay một cách dễ dàng.
- Khi cấp điện vào hệ thống, khởi động Arduino, module ESP 8266, cảm biến
vân tay, LCD, ….. Kết nối wifi: (chỉ làm 1 lần khi muốn đổi mạng wifi)
- Ngay sau khi cấp nguồn, bấm giữ nút reset màu vàng trong 5 giây (đèn wifi
nhấp nháy rồi sáng luôn) thì sẽ xóa toàn bộ cấu hình wifi đã lưu.
- Sau đó module sẽ phát 1 wifi có tên FINGERPRINT_SERVER. Dùng điện
thoại kết nối tới wifi này pass: 12345678. Sau đó mở trình duyệt chrom nhập IP
192.168.4.1 để vào trang cấu hình wifi cho hệ thống.
- Sau hi chọn mạng wifi kết nối cho hệ thống xong bấm nút save để lưu lại.
- Sử dụng hệ thống.
 Hệ thống sau khi khởi động và kết nối wifi đèn wifi sẽ chớp 3 cái rồi tắt.
Màn hình LCD sẽ hiện địa chỉ IP Web của hệ thống để truy cập xem dữ liệu.

51
CHƯƠNG 4: THI CÔNG HỆ THỐNG
 Sauk hi hệ thống khởi động xong, Sẽ vào màn hình chính.
 Bấm nút * để hiện lại IP Web.
 Bấm nút # đề vào menu
 Các chức năng gồm có: Thêm vân tay, xóa vân tay, xóa hết dữ liệu vân
tay hệ thống và đồi pass. Các chức năng thực hiện theo hướng dẫn trên
màn hình LCD

 Lưu đồ hệ thống menu tự chọn

Bắt đầu

Khởi động
Arduino, module
ESP 8266, cảm
biến vân tay, LCD

Vào chế độ 0
(hiển thị menu tự
chọn)

Quét ma trận phím

Đ
Thêm hoặc
Chế độ 1
xóa vân tay
S

Đ Đ
Nhập đúng Quản lí
Chế độ 2
mật khẩu Admin

Bắt đầu

52
CHƯƠNG 4: THI CÔNG HỆ THỐNG
Hình 4.4: Lưu đồ menu
- Giải thích lưu đồ:
 Quy trình làm việc của hệ thống như thể hiện trong sơ đồ hình 4.4.. Chương
trình bắt đầu vào khởi động ESP8266, LCD, khởi tạo các biến. Sau đó kiểm
tra có cảm biến vân tay kết nối chưa. Nếu chưa kết nối thì chương trình sẽ
dừng đợi đến khi nào có kết nối. Vòng lặp chương trình được thực hiện.
Mặc định chương trình sẽ vào chế độ 0. Ở chế độ 0 thì cho phép hiển thị
menu lựa chọn bao gồm: 1.Quét vân tay, 2.Xóa vân tay. Sau đó nhấn nút #
để qua phần quản lí Admin. Cùng lúc đó, kiểm tra bàn phím ma trận, nếu
phím 1 được nhấn thì sẽ vào chế độ 1, nếu phím 2 được nhấn thì sẽ vào chế
độ 2.
 Ở chế độ 1 thì cho phép quét dấu vân tay. Sau đó, dữ liệu ID của người sử
dụng (tương ứng với vân tay của người đó đã được lưu trữ trước đó) được
cập nhật lên website thông qua Wifi trên ModuleESP8266. Khi việc gửi dữ
liệu hoàn tất thì trở về menu lựa chọn.
 Ở chế độ 2 cho phép quản trị Admin. Trước khi vào menu quản trị Admin,
người dùng phải nhập đúng mật khẩu Admin thì hệ thống mới cho phép
thêm vân tay, xóa vân tay.

53
CHƯƠNG 4: THI CÔNG HỆ THỐNG

 Lưu đồ quét vân tay

Hình 4.5: Lưu đồ quét vân tay

- Giải thích lưu đồ:


 Quá trình quét vân tay bằng dấu vân tay thực hiện theo lưu đồ hình 4.5 phía
trên. Chương trình kiểm tra nếu đang ở chế độ 1 thì ta đưa vân tay vào. Nếu
vân tay được quét so sánh trùng với vân tay đã được lưu trước đó thì màn
hình LCD sẽ thông báo đã quét vân tay.

54
CHƯƠNG 4: THI CÔNG HỆ THỐNG

 Lưu đồ truyền dữ liệu Wed

Hình 4.6: Lưu đồ truyền dữ liệu lên wed

- Giải thích Lưu đồ truyền dữ liệu Wed


 Quy trình chuyển dữ liệu ID người dùng lên web như lưu đồ hình 4.6.
Chương trình kiểm tra nếu có dữ liệu từ serial 12 thì kết nối wifi. Sau khi
kết nối thành công thì tiến hành gửi dữ liệu ID người dùng lên web. Sau khi
quá trình hoàn tất thì kết nối sẽ được ngắt.

55
CHƯƠNG 4: THI CÔNG HỆ THỐNG

 Lưu đồ quản lý admin

Hình 4.7: Lưu đồ quản trị

- Giải thích Lưu đồ


 Quy trình quản trị admin thực hiện theo lưu đồ hình 4.7. Chương trình kiểm
tra có đang ở chế độ bằng 3 không. Nếu đúng thì nhập mật khẩu để vào
menu hiển thị tùy chọn quản trị admin. Menu tùy chọn này gồm 2 chế độ:
 Ở chế độ 1 cho phép thêm vân tay. Sau khi hoàn tất quay về menu quản
trị admin.

56
CHƯƠNG 4: THI CÔNG HỆ THỐNG
 Ở chế độ 2 cho phép xóa vân tay. Sau khi hoàn tất quay về menu quản trị
admin
4.2.2. Phần mềm lập trình cho vi điều khiển
 Giới thiệu phần mềm lập trình Arduino IDE
- Arduino IDE là phần mềm giúp ta lập trình cho các dòng sản phẩm của
Arduino như Arduino Uno, Arduino Mega, nano, ,.. Lập trình trên Arduino
IDE là cách tiếp cận đơn giản cho những người đam mê điện tử và muốn tạo
ra những sản phẩm nhúng ấn tượng mà không cần quá nhiều kiến thức
chuyên sâu về điện tử. Môi trường phát triển tích hợp Arduino IDE là một
ứng dụng đa nền tảng được viết bằng Java.
- Arduino IDE hình 4.8 là nơi để soạn thảo code, kiểm ra lỗi và upload code.

Hình 4.8: Giao diện lập trình arduino

- Arduino Toolbar có một số button và chức năng của chúng như sau:

Hình 4.9: Arduino Toolbar

 Verify (1): kiểm tra code có lỗi hay không.


 Upload (2): nạp code đang soạn thảo vào Arduino.
57
CHƯƠNG 4: THI CÔNG HỆ THỐNG
 New, Open, Save (3): Tạo mới, mở và lưu sketch.
 Serial Monitor (4): Đây là màn hình hiển thị dữ liệu từ Arduino gửi lên
máy tính.
- Để viết chương trình cho ESP8266 Espressif hiện đã hỗ trợ 3 nền tảng SDK
(Software Development Kit – Gói phát triển phần mềm) độc lập là: NONOS
SDK, RTOS SDK và Arduino. Cả 3 đều có những ưu điểm riêng phù hợp
với từng ứng dụng nhất định. Hiện nay Arduino đang đƣợc sử dụng rộng rãi
bởi tính dễ sử dụng, kiến trúc phần mềm tốt và tận dụng được nhiều thư viện
cộng đồng.

- Arduino là một IDE tích hợp sẵn editor, compiler, programmer và đi kèm
với nó là các firmware có bootloader, các bộ thư viện được xây dựng sẵn và
dễ dàng tích hợp.

- Ngôn ngữ sử dụng là C/C++. Tất cả đều opensource và được đóng góp, phát
triển hàng ngày bởi cộng đồng. Triết lý thiết kế và sử dụng của Arduino
giúp cho người mới, không chuyên rất dễ tiếp cận, các công ty, hardware dễ
dàng tích hợp. Tuy nhiên, với trình biên dịch C/C++ và các thư viện chất
lượng được xây dựng bên dưới thì mức độ phổ biến ngày càng tăng và hiệu
năng thì không hề thua kém các trình biên dịch chuyên nghiệp cho chip
khác.

- Đại diện cho Arduino ban đầu là chip AVR, nhưng sau này có rất nhiều nhà
sản xuất sử dụng các chip khác nhau nhƣ ARM, PIC, STM32 gần đây nhất
là ESP8266, ESP32, và RISCV với năng lực phần cứng và phần mềm đi
kèm mạnh mẽ hơn nhiều.
- Đặc điểm của Arduino:

- Arduino che dấu đi sự phức tạp của điện tử bằng các khái niệm đơn giản,
che đi sự phức tạp của phần mềm bằng các thủ tục ngắn gọn. Việc setup
output cho 1 MCU bằng cách setup thanh ghi rõ ràng phức tạp đến độ người

58
CHƯƠNG 4: THI CÔNG HỆ THỐNG
chuyên củng phải lật datasheet ra xem, nhƣng với Arduino thì chỉ cần gọi 1
hàm.

- Bởi vì tính phổ biến và dễ dùng, với các thư viện được tích hợp sẵn. Ta chỉ
cần quan tâm đến tính năng sản phẩm mà bỏ qua các tiểu tiết (protocol,
datasheet …) Nên giúp người không chuyên dễ dàng tiếp cận và làm ra các
sản phẩm tuyệt vời mà không cần phải biết nhiều về điện tử.

- Chính vì không quan tâm nhiều đến cách thức hoạt động của các Module đi
kèm, nên đa phần người dùng sẽ khó xử lý được khi có các vấn đề phát sinh
ngoài tầm của thư viện.
- Các module prototype làm sẵn cho Arduino có độ bền không cao, mục tiêu
đơn giản hóa quá trình làm sản phẩm.

 Các lợi ích khi sử dụng Arduino


- Thiết kế IDE tốt, có thể dễ dàng tích hợp nhiều loại compiler, nhiều loại
hardware mà không hề giảm hiệu năng. Ví dụ: Arduino gốc cho AVR,
nhưng có nhiều phiên bản cho STM32, PIC32, ESP8266, ESP32… tận dụng
tối đa các thư viện sẵn có.

- Các thư viện được viết dựa trên lớp API trên cùng, nên đa số các thư viện
cho Arduino có thể dùng được cho tất cả các chip. Điển hình là Arduino cho
ESP8266 có thể tận dụng trên 90% các thư viện cho Arduino khác.

- Trình biên dịch cho Arudino là C/C++, khi biên dịch ESP8266 non-os SDK
và ESP8266 Arduino cùng dùng chung trình biên dịch, hiệu năng không hề
thua kém.

- Cách tơ chức các thư viện C/C++ theo dạng OOP giúp phân lớp, kế thừa và
quản lý cực kỳ tốt cho các ứng dụng lớn. Các MCU ngày càng mạnh mẽ và
ứng dụng cho nó sẽ ngày càng lớn. Các mô hình quản lý code đơn giản
trƣớc đây (thuần C) sẽ khó.

59
CHƯƠNG 4: THI CÔNG HỆ THỐNG

- Các project cho Arduino đều opensource, ta dễ dàng lấy nó và đưa vào sản
phẩm với chất lượng tốt và học hỏi được nhiều từ cách thức thiết kế chương
trình.
- Arduino chú trọng tính đa nền tảng, module hóa cao, phù hợp với các ứng
dụng từ phức tạp tới cực kỳ phức tạp. Các ứng dụng kiểu này rất ph biến
trong thực tế. Nếu không dùng C++, hoặc arduino mà gặp vấn đề về
overcontrol thì nên thử qua Arduino. Tiết kiệm đựợc rất rất nhiều thời gian
cho việc tập trung vào tính năng sản phẩm.

 Arduino cho ESP8266


- Với Arduino ta có thể viết 1 Sketch sử dụng các thư viện và hàm tương tự
của Arduino cho ESP8266.

- ESP8266 Arduino core đi kèm với thư viện kết nối Wifi hỗ trợ TCP, UDP
và các ứng dụng HTTP, mDNS, SSDP, DNS Servers. Ngoài ra còn có thể
thực hiện cập nhật OTA, sử dụng Filesystem dùng bộ nhớ Flash hay SD-
card, điều khiển servo, ngoại vi SPI, I2C, …

 Giao diện hệ thống wedserver

Hình 4.10: Giao diện Web


60
CHƯƠNG 4: THI CÔNG HỆ THỐNG

4.2.3. Phần mềm Exel


- Sử dụng phần mềm exel để thống kê số lần đi trễ để cảnh báo sinh viên qua
gmail,

Hình 4.11: Excel

4.3. VIẾT TÀI LIỆU HƯỚNG DẪN SỬ DỤNG, THAO TÁC


 Viết tài liệu hướng dẫn sử dụng hệ thống quét vân tay
- Bước 1: Cấp nguồn cho hệ thống, hệ thống sử dụng nguồn là 12V 3A. Hệ
thống khởi động, sau đó kết nối wifi: (chỉ làm 1 lần khi muốn đổi mạng
wifi)
 Ngay sau khi cấp nguồn, bấm giữ nút reset màu vàng trong 5 giây (đèn
wifi nhấp nháy rồi sáng luôn) thì sẽ xóa toàn bộ cấu hình wifi đã lưu.
 Sau đó module sẽ phát 1 wifi có tên FINGERPRINT_SERVER. Dùng
điện thoại kết nối tới wifi này pass: 12345678. Sau đó mở trình duyệt
google nhập IP 192.168.4.1 để vào trang cấu hình wifi cho hệ thống. Sau
khi chọn mạng wifi kết nối cho hệ thống xong bấm nút save để lưu lại.
Hệ thống sau khi khởi động và kết nối wifi đèn wifi sẽ chớp 3 cái rồi tắt.
Màn hình LCD sẽ hiện địa chỉ IP Web của hệ thống để truy cập xem dữ

61
CHƯƠNG 4: THI CÔNG HỆ THỐNG
liệu. Sau khi hệ thống khởi động, màn hình LCD sẽ hiển thị chế độ quét
vân tay. Bấm nút * để hiện lại IP Web, bấm nút # đề vào menu.
- Bước 2: Nếu muốn quét vân tay thì đưa vân tay người dùng đã được lưu trữ
trước đó vào cảm biến cho đến khi màn hình LCD thông báo đã xác nhận.
Dữ liệu ID người dùng khi quét vân tay sẽ được gửi lên trang web. Sau khi
dữ liệu được gửi thành công thì màn hình LCD sẽ quay về menu lựa chọn.
- Bước 3: Bấm # 1 lần có 2 chế độ: Thêm vân tay và xóa vân tay, bấm phím 1
để vào chế độ thêm vân tay, màn hình sẽ hiển thị nhập mật mã, nhập mật mã
xong nhấn # để xác nhận, màn hình hiển thị đặt ngón tay vào, đưa tay ngón
tay người thêm vân tay vào, màn hình hiển thị lưu tên, sau đó nhấn # để lưu,
hệ thống sẽ quay về chế độ quét vân tay. Bấm phím 2 để xóa vân tay, màn
hình hiển thị nhậo mật mã, lựa chọn tên người cần xóa vân tay bằng phím 0,
sau đó nhấn phím # để xóa.

- Bước 4: Muốn vào chế độ quản lý Admin bấm phím # 2 lần có 2 chế độ là:
Đổi pass Admin và xóa hết tất cả dữ liệu. Bấm phím 1 để đổi pass Admin,
màn hình hiển thị nhập mật mã, nhập mật mã cũ vào sau đó nhấn phím # để
xác nhận, màn hình hiển thị nhập mật mã mới, nhập mật mã mới vào rồi
nhấn # để lưu. Muốn chọn chế độ xóa hết tất cả dữ liệu nhấn phím 2, màn
hình hiển thị nhập mật mã, nhập mật mã đúng màn hình hiển thị 2 chế độ
hủy và xác nhận, nhấn * để hủy và nhấn # để xác nhận xóa.

- Bước 5: Nếu admin muốn kiểm tra thông tin người dùng về thời gian ra vào,
thông tin người dung. Bấm phím * để màn hình hiển thị IP Wed, sử dụng
điện vào đã kết nối wifi với hệ thống lên google để vào IP Wed.

- Bước 6: Sau một khoảng thời gian sẽ tổng hợp lại những sinh viên vắng học
và trễ học sau đó vào ứng dụng exel để thực hiện cảnh báo sinh viên.

 Lưu ý: Khi đang sử dụng hệ thống muốn quay về chế độ quét vân tay thì nhấn *

62
CHƯƠNG 5: KẾT QUẢ, NHẬN XÉT, ĐÁNH GIÁ

CHƯƠNG 5: KẾT QUẢ, NHẬN XÉT, ĐÁNH GIÁ


5.1. KẾT QUẢ
- Sau quãng thời gian tìm hiểu, nghiên cứu song song giữa các tài liệu chuyên
ngành tiếng Việt và tiếng Anh, quá trình tổng hợp lại các kiến thức đã học trong
suốt 4 năm học và tìm hiểu qua mạng Internet cũng như được sự hướng dẫn tận
tình của GVHD Nguyễn Đăng Khoa. Nhóm chúng em cũng đã hoàn thành được
đồ án tốt nghiệp với đề tài “QUẢN LÍ VÀ CẢNH BÁO SINH VIÊN THÔNG
QUA HỆ THỐNG QUÉT VÂN TAY”.

- Sau quá trình thực hiện đồ án này, nhóm em đã tích lũy được thêm nhiều kiến
thức mới, bổ sung thêm hành trang kiến thức phục vụ cho công việc sau này.
 Biết cách sử dụng và khai thác các tính năng của Arduino như giao tiếp giữa
Arduino với các module mở rộng như: cảm biến vân tay R307, module ESP
8266, ma trận phím, màn hình LCD.
 Tìm hiểu và tiến hành kết nối Arduino với các module mở rộng như cảm
biến vân tay R375, module ESP 8266, ma trận phím, màn hình LCD.
 Cách sử dụng module ESP 8266, nguyên lý hoạt động, các thông số kỹ
thuật, tính năng của ESP 8266. Thiết lập cho module ESP 8266, gửi dữ liệu
lên website nhờ WIFI.
 Biết được nguyên lý hoạt động của cảm biến, các thông số kỹ thuật, các tính
năng cũng như cách sử dụng của cảm biến vân tay R307. Biết được quy
trình lấy mẫu dấu vân tay cũng như lịch sử hình thành và phát triển của
ngành sinh trắc học vân tay.
 Lập trình được một website với giao diện trực quan, thao tác đơn giản.

- Sau quá trình nghiên cứu, thi công đề tài “QUẢN LÝ VÀ CẢNH BÁO SINH
VIÊN THÔNG QUA HỆ THỐNG QUÉT VÂN TAY” của nhóm đã hoàn thành
và thực hiện được tính năng sau:

 Hiển thị trên màn hình LCD


- Khi khởi động hệ thống, màn hình LCD sẽ hiển thị phần check vân tay
63
CHƯƠNG 5: KẾT QUẢ, NHẬN XÉT, ĐÁNH GIÁ

Hình 5.1: Phần check vân tay

- Nếu người dùng muốn thêm vân tay hay xóa vân tay cũng như thay quản lí
Admin chỉ cần ấn chọn phím # từ ma trận phím. Khi đó menu quản trị
admin sẽ hiện trên mà hình LCD.

Hình 5.2: Phần thêm vân tay và xóa vân tay

Hình 5.3: Phần quản lí Admin


64
CHƯƠNG 5: KẾT QUẢ, NHẬN XÉT, ĐÁNH GIÁ
 Thao tác quét vân tay
- Sau khi hệ thống khởi động xong đưa ngón tay của người cần quét vân tay
vào để quét vân tay

Hình 5.4: Đưa ngón tay vào cảm biến Hình 5.5: Hệ thống xác nhận vân tay

- Khi hệ thống xác nhận quét vân tay thành công thì dữ liệu sẽ được chuyển
từ Arduino mega thông qua Module ESP8266 để gửi dữ liệu lên Wedserver

 Thao tác thêm vân tay và xóa vân tay


- Sau khi hệ thống khởi động bấm phím # để vào phần thêm vân tay và xóa
vân tay.

Hình 5.6: Phần thêm vân tay và xóa vân tay Hình 5.7: Phần nhập mật mã

65
CHƯƠNG 5: KẾT QUẢ, NHẬN XÉT, ĐÁNH GIÁ
- Sau đó bấm phím 1 để thêm vân tay và bấm phím 2 để xóa vân tay, khi
muốn vào phần thêm vân tay hoặc xóa vân tay sẽ phải nhập mật mã.
- Khi đăng nhập đúng mật mã sẽ vào phần thêm vân tay hoặc vào phần xóa
vân tay, thao tác thêm vân tay như sau:

Hình 5.8: Phần thêm vân tay Hình 5.9: Thao tác thêm vân tay

Hình 5.10: Phần xóa vân tay

 Giao diện wedserver


- Người dung truy cập vào ip hiển thị trên màn hình led qua phím bấm *.

Hình 5.11: Phần hiển thị thông tin quét vân tay trên wed server
66
CHƯƠNG 5: KẾT QUẢ, NHẬN XÉT, ĐÁNH GIÁ
 Giao diện exel cảnh báo sinh viên
- Sử dụng Exel để thống kể và gửi cảnh báo về gmail của sinh viên.

Hình 5.12: Hệ thống cảnh báo sinh viên

5.2. Nhận xét và đánh giá


- Tuy vấp phải nhiều khó khăn trong quá trình thực hiện nhưng cuối cùng nhóm
đã hoàn thiện được đề tài: “QUẢN LÝ VÀ CẢNH BÁO THÔNG TIN SINH
VIÊN BẰNG MÁY QUÉT VÂN TAY”.

- Mô hình hoạt động ổn định, có thể làm việc liên tục và đáp ứng được các yêu
cầu đã đề ra. Người dùng thao tác một cách đơn giản, dễ sử dụng. Hê thống
đảm bảo an toàn và bảo mật cho người dùng.

- Việc sử dụng nguồn cấp từ 12V trở xuống nên an toàn cho người sử dụng.

- Như chúng ta đã biết, công nghệ nhận dạng vân tay có tính bảo mật rất cao nên
tính bảo mật của mô hình là khá cao.

- Wedserver hiển thị thông tin sinh viên và phần mềm Exel cảnh báo sinh viên dễ
sử dụng, tiết kiệm thời gian cho giản viên có thể quản lí được sinh viên.

67
CHƯƠNG 5: KẾT QUẢ, NHẬN XÉT, ĐÁNH GIÁ
- Cảnh báo sinh viên bằng cách gửi mail thông báo về việc đi trễ, số ngày vắng
của sinh viên bằng mail.

- Thời gian đáp ứng khi cập nhật dữ liệu vân tay lên website liên tục mỗi khi có
vân tay được quét.

- Song song với mặt đặt được vẫn còn tồn động một số hạn chế do thời gian thực
hiện có hạn, lượng kiến thức cũng như nguồn tài liệu tham khảo còn hạn chế,
chủ yếu thông qua mạng internet nên đề tài không thể tránh khỏi sai sót:
 Không tạo được một wedserver sử dụng ngôn ngữ Mysql để quản lí dữ liệu
sinh viên.
 Việc gửi mail cảnh báo sinh viên chưa tự động.
 Thống kê dữ liệu sinh viên chưa tự động được.

68
CHƯƠNG 6: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN

CHƯƠNG 6: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN


6.1. Kết luận
- Sau thời gian tìm hiểu, nghiên cứu và thực hiện, nhóm đã hoàn thành đề tài
“QUẢN LÝ VÀ CẢNH BÁO THÔNG TIN SINH VIÊN BẰNG MÁY QUÉT
VÂN TAY” Hệ thống đáp ứng đầy đủ các tính năng, nội dung và mục tiêu ban
đầu đã đề ra:
 Giao tiếp và truyền dữ liệu thành công giữa Arduino Mega 2560 với các
module cảm biến vân tay R307, module ESP 8266, màn hình LCD, ma trận
phím.
 Điểm danh thành công thông qua việc quét nhận dạng dấu vân tay.
 Có thể thêm hoặc xóa vân tay khi quản trị viên cần lấy mẫu vân tay một lớp.
 Cập nhật dữ liệu vân tay lên webserver thành công.
 Quản lý người dùng trên website bao gồm thời gian vào, số lần trễ, số ngày
vắng, thông tin người dùng.
 Cảnh báo sinh viên đi trễ hoặc vắng để sinh viên có hướng khắc phục.
 Gửi về mail sinh viên thông tin trễ học hoặc vắng thông qua giao diện trên
website.

- Nhóm đã cố gắng thực hiện nhưng vẫn còn tồn động một số hạn chế về mặt
kiến thức cũng như thời gian thực hiện nên đề tài khó tránh khỏi sai sót và hạn
chế:
 Thay thể phần tự động cảnh báo sinh viên bằng phần mềm Exel để cảnh báo
sinh viên
 Sử dụng Wedserver có sẵn trển module ESP 8266 để thay thế

- Tuy còn tồn động những mặt hạn chế nhưng nhìn chung mô hình hoạt động tốt
so với những yêu cầu đã đề ra:
 Hệ thống chạy tương đối ổn định, dữ liệu vân tay được cập nhật liên tục.
 Module cảm biến vân tay R307 hoạt động tốt, ổn định, độ chính xác rất cao.
Module ESP 8266 hoạt động khá ổn định.

69
CHƯƠNG 6: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
 Hệ thống website quản lý thời gian ra vào của người dùng dễ sử dụng, nhiều
tính năng đáp ứng nhu cầu thực tiễn.
 Gửi email thông báo về thời gian ra vào cũng như số lần đi trễ đến mail.

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


- Có thể gửi dữ liệu người dùng lên website quản lý thời gian thông qua Wifi.
- Mở rộng khả năng lấy nhiều mẫu vân tay hơn để nâng cao khả năng ứng dụng
của đề tài không chỉ dừng lại ở việc quản lý lớp học mà có thể quản lý nhà máy,
xí nghiệp,… Thiết kế giao diện website sinh động hơn, giao diện dễ dàng tương
tác với người dùng. Tự động gửi email đến những sinh viên đã đi trễ, vắng.

70
TÀI LIỆU THAM KHẢO

TÀI LIỆU THAM KHẢO


Sách tham khảo
http://arduino.vn/bai-viet/1226-web-server-voi-arduino-va-esp8266
https://dientu24h.com/bai-viet/cach-gui-du-lieu-nhiet-do-len-webserver-bang-arduino-
nhanh-nhat-100-thanh-cong-3.html
https://arduinokit.vn/giao-tiep-i2c-lcd-arduino/
https://nshopvn.com/product/ban-phim-ma-tran-mem-3x4/
http://arduino.vn/bai-viet/1172-lap-trinh-esp8266-bang-arduino-ide
https://vietmachine.com.vn/mo-dun-cam-bien-van-tay-voi-arduino-fpm10a.html
https://blog.hocexcel.online/gui-email-tu-excel.html
http://arduino.vn/tutorial/1446-huong-dan-lap-trinh-arduino-bang-javascript-trong-
moi-truong-nodejs

71
PHỤ LỤC

PHỤ LỤC
 Source code
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Fingerprint.h>
#define FGPSerial Serial1
#define ESPSerial Serial2
#define KEY0 0
#define KEY1 1
#define KEY2 2
#define KEY3 3
#define KEY4 4
#define KEY5 5
#define KEY6 6
#define KEY7 7
#define KEY8 8
#define KEY9 9
#define KEYSTAR 10
#define KEYHASH 11
#define NOKEY 12
#define Keycol1 30
#define Keycol2 32
#define Keycol3 34
#define KeyrowA 22
#define KeyrowB 24
#define KeyrowC 26
#define KeyrowD 28
#define STAMAIN 0
#define STAMENU1 1
#define STAMENU2 2
#define STACHANGEPASS 3
#define STACHECKPASS 4
#define STAADDFINGER 5
#define STADELETEFINGER 6
#define STADELETEALLFINGER 7
#define STAINPUTNAME 8
72
PHỤ LỤC
#define STAINPUTID 9
#define STARTINDEXDATA 20
#define STARTEEPROMFORDATA 300
#define MAXDATANUMBER 120

Adafruit_Fingerprint finger = Adafruit_Fingerprint( & FGPSerial);


LiquidCrystal_I2C MyLCD(0x27, 16, 2);
byte NumberOfID;
byte LastID;
bool IncheckFingerPrint = false;
byte CurrentState;
byte NextState;
byte CurrentPass[6];
byte PassWord[6];
byte CurrentPassIndex;
String NameData = "";
byte NameLengh = 0;
byte PressCount = 0;
byte LastKey = NOKEY;
char CurrentCharacter;
byte DataRecordArray[MAXDATANUMBER];
byte CurrentID;
byte IDToSave;
String ReceiveESPData;

void InitFingerPrint() {
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) {
delay(1);
}
}
Serial.println(F("Reading sensor parameters"));
finger.getParameters();
Serial.print(F("Status: 0x"));
73
PHỤ LỤC
Serial.println(finger.status_reg, HEX);
Serial.print(F("Sys ID: 0x"));
Serial.println(finger.system_id, HEX);
Serial.print(F("Capacity: "));
Serial.println(finger.capacity);
Serial.print(F("Security level: "));
Serial.println(finger.security_level);
Serial.print(F("Device address: "));
Serial.println(finger.device_addr, HEX);
Serial.print(F("Packet len: "));
Serial.println(finger.packet_len);
Serial.print(F("Baud rate: "));
Serial.println(finger.baud_rate);
finger.getTemplateCount();
NumberOfID = finger.templateCount;
if (NumberOfID == 0) {
Serial.print("Sensor doesn't contain any fingerprint data. Please run the 'enroll'
example.");
} else {
Serial.print("Sensor contains ");
Serial.print(finger.templateCount);
Serial.println(" templates");
}
}

uint8_t getFingerprintEnroll(byte ID) // Ham nhap dau van tay vao vi tri ID
{
int p = -1;
byte KeyCode = NOKEY;
Serial.print("Waiting for valid finger to enroll as #");
Serial.println(ID);
MyLCD.setCursor(0, 1);
MyLCD.print("DAT NGON TAY VAO");
while (p != FINGERPRINT_OK && KeyCode != KEYSTAR) {
KeyCode = ScanKeyboard();
p = finger.getImage();
switch (p) {
74
PHỤ LỤC
case FINGERPRINT_OK:
Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.println(".");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
break;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
break;
default:
Serial.println("Unknown error");
break;
}
}

if (KeyCode == KEYSTAR) return 255;


MyLCD.setCursor(0, 1);
MyLCD.print("DANG XU LY... ");
// OK success!
p = finger.image2Tz(1);
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return p;
case FINGERPRINT_INVALIDIMAGE:
75
PHỤ LỤC
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error");
return p;
}
MyLCD.setCursor(0, 1);
MyLCD.print("HAY BO TAY RA ");
Serial.println("Remove finger");
delay(2000);
p = 0;
while (p != FINGERPRINT_NOFINGER) {
p = finger.getImage();
}
Serial.print("ID ");
Serial.println(ID);
p = -1;
Serial.println("Place same finger again");
MyLCD.setCursor(0, 1);
MyLCD.print("DAT LAI NGON TAY");
while (p != FINGERPRINT_OK) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.print(".");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
break;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
break;
default:
Serial.println("Unknown error");
76
PHỤ LỤC
break;
}
}
// OK success!
MyLCD.setCursor(0, 1);
MyLCD.print("DANG XU LY... ");
p = finger.image2Tz(2);
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error");
return p;
}
// OK converted!
Serial.print("Creating model for #");
Serial.println(ID);
p = finger.createModel();
if (p == FINGERPRINT_OK) {
Serial.println("Prints matched!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_ENROLLMISMATCH) {
77
PHỤ LỤC
Serial.println("Fingerprints did not match");
return p;
} else {
Serial.println("Unknown error");
return p;
}
MyLCD.setCursor(0, 1);
MyLCD.print("DANG LUU... ");

Serial.print("ID ");
Serial.println(ID);
p = finger.storeModel(ID);
if (p == FINGERPRINT_OK) {
Serial.println("Stored!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_BADLOCATION) {
Serial.println("Could not store in that location");
return p;
} else if (p == FINGERPRINT_FLASHERR) {
Serial.println("Error writing to flash");
return p;
} else {
Serial.println("Unknown error");
return p;
}

return true;
}

int getFingerprintID() // ham check dau van tay


{
uint8_t p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");
78
PHỤ LỤC
MyLCD.setCursor(0, 1);
MyLCD.print("DANG QUET VT... ");
IncheckFingerPrint = true;
break;
case FINGERPRINT_NOFINGER:
Serial.println("No finger detected");
return -1;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return -1;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
return -1;
default:
Serial.println("Unknown error");
return -1;
}
// OK success!
p = finger.image2Tz();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
MyLCD.setCursor(0, 1);
MyLCD.print("DANG KIEM TRA VT");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return -1;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return -1;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return -1;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return -1;
79
PHỤ LỤC
default:
Serial.println("Unknown error");
return -1;
}
// OK converted!
p = finger.fingerSearch();
if (p == FINGERPRINT_OK) {
Serial.println("Found a print match!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return -1;
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println("Did not find a match");
return 0;
} else {
Serial.println("Unknown error");
return -1;
}
// found a match!
Serial.print("Found ID #");
Serial.print(finger.fingerID);
Serial.print(" with confidence of ");
Serial.println(finger.confidence);
return finger.fingerID;
}

uint8_t deleteFingerprint(uint8_t ID) {


uint8_t p = -1;
p = finger.deleteModel(ID);
if (p == FINGERPRINT_OK) {
Serial.println("Deleted!");
return p;
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_BADLOCATION) {
Serial.println("Could not delete in that location");
80
PHỤ LỤC
return p;
} else if (p == FINGERPRINT_FLASHERR) {
Serial.println("Error writing to flash");
return p;
} else {
Serial.print("Unknown error: 0x");
Serial.println(p, HEX);
return p;
}
}

void SavePasswordToEEPROM() {
EEPROM.write(0x00, PassWord[0]);
EEPROM.write(0x01, PassWord[1]);
EEPROM.write(0x02, PassWord[2]);
EEPROM.write(0x03, PassWord[3]);
EEPROM.write(0x04, PassWord[4]);
EEPROM.write(0x05, PassWord[5]);
}

void GetPasswordFromEEPROM() {
char i;
byte CurrentValue; {
for (i = 0; i < 6; i++) {
CurrentValue = EEPROM.read(i);
if (CurrentValue == 0xFF) // blank eeprom save default pass
{
PassWord[0] = 0;
PassWord[1] = 2;
PassWord[2] = 4;
PassWord[3] = 6;
PassWord[4] = 8;
PassWord[5] = 1;
SavePasswordToEEPROM();
return;
} else {
PassWord[i] = CurrentValue;
81
PHỤ LỤC
}
}
}
}

void SaveInforToEEPROM(byte ID, String Name) {


char NameCharacter[16] = {
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
};
byte Index;
Name.toCharArray(NameCharacter, 16);
for (Index = 0; Index < 16; Index++) {
EEPROM.write(STARTEEPROMFORDATA + (ID - 1) * 25 + Index,
NameCharacter[Index]);
}
}

String GetInforFromEEPROM(byte ID) {


String Name = "";
byte Index;
char Character;
for (Index = 0; Index < 16; Index++) {
82
PHỤ LỤC
Character = EEPROM.read(STARTEEPROMFORDATA + (ID - 1) * 25 +
Index);
if (Character == 0) break;
Name += Character;
}
return Name;
}

void WriteIndextoEEPROM(byte Index, byte Status) {


EEPROM.write(STARTINDEXDATA + Index - 1, Status);
}

void ReadIndexDatafromEEPROM() {
byte Status;
byte Index;
Status = EEPROM.read(STARTINDEXDATA);
if (Status == 0xFF) ResetDataRecordArray(); // empty EEPROM
else {
for (Index = 0; Index < MAXDATANUMBER; Index++) {
DataRecordArray[Index] = EEPROM.read(STARTINDEXDATA + Index);
}
}
}

byte ScanKeyboard(void) {
digitalWrite(Keycol1, HIGH);
digitalWrite(Keycol2, HIGH);
digitalWrite(Keycol3, HIGH);
digitalWrite(Keycol1, LOW);
if (!digitalRead(KeyrowA)) {
while (!digitalRead(KeyrowA));
delay(10);
return KEY1;
}
if (!digitalRead(KeyrowB)) {
while (!digitalRead(KeyrowB));
delay(10);
83
PHỤ LỤC
return KEY4;
}
if (!digitalRead(KeyrowC)) {
while (!digitalRead(KeyrowC));
delay(10);
return KEY7;
}

if (!digitalRead(KeyrowD)) {
while (!digitalRead(KeyrowD));
delay(10);
return KEYSTAR;
}
digitalWrite(Keycol1, HIGH);
digitalWrite(Keycol2, LOW);

if (!digitalRead(KeyrowA)) {
while (!digitalRead(KeyrowA));
delay(10);
return KEY2;
}
if (!digitalRead(KeyrowB)) {
while (!digitalRead(KeyrowB));
delay(10);
return KEY5;
}
if (!digitalRead(KeyrowC)) {
while (!digitalRead(KeyrowC));
delay(10);
return KEY8;
}

if (!digitalRead(KeyrowD)) {
while (!digitalRead(KeyrowD));
delay(10);
return KEY0;
}
84
PHỤ LỤC
digitalWrite(Keycol2, HIGH);
digitalWrite(Keycol3, LOW);
if (!digitalRead(KeyrowA)) {
while (!digitalRead(KeyrowA));
delay(10);
return KEY3;
}
if (!digitalRead(KeyrowB)) {
while (!digitalRead(KeyrowB));
delay(10);
return KEY6;
}
if (!digitalRead(KeyrowC)) {
while (!digitalRead(KeyrowC));
delay(10);
return KEY9;
}
if (!digitalRead(KeyrowD)) {
while (!digitalRead(KeyrowD));
delay(10);
return KEYHASH;
}
digitalWrite(Keycol3, HIGH);
return NOKEY;
}

void ResetDataRecordArray() {
byte Index;
for (Index = 0; Index < MAXDATANUMBER; Index++) {
DataRecordArray[Index] = 0;
WriteIndextoEEPROM(Index, 0);
SaveInforToEEPROM(Index + 1, "");
}
}

byte CheckNextIDAvailable() {
byte Index;
85
PHỤ LỤC
for (Index = 0; Index < MAXDATANUMBER; Index++) {
if (DataRecordArray[Index] == 0) return Index + 1;
}
return MAXDATANUMBER + 1; // no record found;
}

byte CheckNextIDInUse(byte StartID) {


byte Index;
for (Index = StartID; Index < MAXDATANUMBER; Index++) {
if (DataRecordArray[Index] == 1) return Index + 1;
}
return MAXDATANUMBER + 1; // no record found;
}

byte DeleteIDArray(byte ID) {


DataRecordArray[ID - 1] = 0;
WriteIndextoEEPROM(ID, 0);
}

byte AddIDArray(byte ID) {


DataRecordArray[ID - 1] = 1;
WriteIndextoEEPROM(ID, 1);
}

byte SetupNewFingerPrint(byte IDSave) {


byte Result;
Result = getFingerprintEnroll(IDSave);
switch (Result) {
case true: {
MyLCD.setCursor(0, 1);
MyLCD.print("DA LUU VAN TAY! ");
break;
}
case FINGERPRINT_ENROLLMISMATCH: {
MyLCD.setCursor(0, 1);
MyLCD.print("2 VAN TAY KHAC ");
86
PHỤ LỤC
break;
}
case 255: {
return 255;
break;
}
default: {
MyLCD.setCursor(0, 1);
MyLCD.print("CO LOI XAY RA! ");
}
}
delay(1000);
return Result;
}

int CheckFingerPrint() {
int CheckID;
CheckID = getFingerprintID();
if (CheckID != -1) {
if (CheckID == 0) {
MyLCD.setCursor(0, 1);
MyLCD.print("VT KHONG KHOP! ");
delay(1000);
DisplayMain();
} else {
return CheckID;
}
} else {
if (IncheckFingerPrint == true) {
IncheckFingerPrint = false;
}
}
return 1500;
}

void DeleteFingerPrint(byte ID) {


byte Result;
87
PHỤ LỤC
Result = deleteFingerprint(ID);
if (Result == FINGERPRINT_OK) {
MyLCD.setCursor(0, 1);
MyLCD.print("DA XOA VAN TAY ");
} else {
MyLCD.setCursor(0, 1);
MyLCD.print("CO LOI XAY RA! ");
}
}

void DeleteAllFinger() {
MyLCD.setCursor(0, 1);
MyLCD.print("DANG XOA... ");
finger.emptyDatabase();
ResetDataRecordArray();
MyLCD.setCursor(0, 1);
MyLCD.print("DA XOA HET DATA ");
}

void DisplayMenu1() {
MyLCD.clear();
MyLCD.setCursor(0, 0);
MyLCD.print("1: THEM VAN TAY");
MyLCD.setCursor(0, 1);
MyLCD.print("2: XOA VAN TAY");
}

void DisplayMenu2() {
MyLCD.clear();
MyLCD.setCursor(0, 0);
MyLCD.print("1:DOI PASS ADMIN");
MyLCD.setCursor(0, 1);
MyLCD.print("2:XOA HET DULIEU");
}

void DisplayMain() {
MyLCD.clear();
88
PHỤ LỤC
MyLCD.noBlink();
MyLCD.noCursor();
MyLCD.setCursor(0, 0);
MyLCD.print("HT DIEM DANH VT");
MyLCD.setCursor(0, 1);
MyLCD.print("BAM # CAI DAT");
}

void ActionFunction(byte State) {


MyLCD.clear();
byte Result;
switch (State) {
case STACHANGEPASS: {
MyLCD.setCursor(3, 0);
MyLCD.print("NHAP MA MOI");
MyLCD.setCursor(3, 1);
CurrentPassIndex = 0;
break;
}
case STAADDFINGER: {
MyLCD.setCursor(0, 0);
MyLCD.print("THEM VAN TAY");
delay(100);
IDToSave = CheckNextIDAvailable();
Result = SetupNewFingerPrint(IDToSave);
while (Result != true && Result != 255) {
Result = SetupNewFingerPrint(IDToSave);
}
if (Result == true) {
CurrentState = STAINPUTNAME;
DisplayInputName();
} else {
CurrentState = STAMAIN;
DisplayMain();
}
break;
}
89
PHỤ LỤC
case STADELETEFINGER: {
MyLCD.setCursor(0, 0);
MyLCD.print("XOA VAN TAY");
CurrentID = 0;
CurrentID = CheckNextIDInUse(CurrentID);
if (CurrentID == MAXDATANUMBER + 1) {
MyLCD.setCursor(0, 1);
MyLCD.print("KHONG CO DU LIEU");
} else {
DisplayInformation(CurrentID);
}
break;
}
case STADELETEALLFINGER: {
MyLCD.setCursor(0, 0);
MyLCD.print("XOA HET DU LIEU");
MyLCD.setCursor(0, 1);
MyLCD.print("*:HUY #:XAC NHAN");
break;
}
}
}

void DisPlayCheckPass() {
MyLCD.clear();
MyLCD.setCursor(3, 0);
MyLCD.print("NHAP MAT MA:");
MyLCD.setCursor(3, 1);
CurrentPassIndex = 0;
CurrentPass[0] = 0;
CurrentPass[1] = 0;
CurrentPass[2] = 0;
CurrentPass[3] = 0;
CurrentPass[4] = 0;
CurrentPass[5] = 0;
}

90
PHỤ LỤC
bool VerifyPass() {
char i;
for (i = 0; i < 6; i++) {
if (CurrentPass[i] != PassWord[i]) return false;
}
return true;
}

void DisplayInputName() {
NameData = "";
PressCount = 0;
NameLengh = 0;
CurrentCharacter = ' ';
MyLCD.clear();
MyLCD.setCursor(5, 0);
MyLCD.print("NHAP TEN");
MyLCD.setCursor(NameLengh, 1);
MyLCD.blink();
MyLCD.cursor();
}

void InputCharacter(byte Key) {


if (Key != LastKey) {
PressCount = 0;
CurrentCharacter = Key + 48; // convert to ascii number
LastKey = Key;
} else {
PressCount++;
if (Key == KEY0) {
if (PressCount == 1) {
CurrentCharacter = 32; //space
} else {
CurrentCharacter = Key + 48; // convert to ascii
PressCount = 0;
}

} else {
91
PHỤ LỤC
if (Key == KEY9) {
if (PressCount == 3) PressCount = 0;
} else {
if (PressCount == 4) PressCount = 0;
}
if (PressCount == 0) {
CurrentCharacter = Key + 48;
} else {
CurrentCharacter = 65 + (Key - 1) * 3 + PressCount - 1; // to Ascii
character
}
}
}
MyLCD.write(CurrentCharacter);
MyLCD.setCursor(NameLengh, 1);
}

void NextCharacter() {
if (NameLengh < 16) // only 16 character for name
{
NameData += CurrentCharacter;
NameLengh++;
MyLCD.setCursor(NameLengh, 1);
}
}

void SaveNewFinger() {
SaveInforToEEPROM(IDToSave, NameData);
AddIDArray(IDToSave);
MyLCD.setCursor(0, 1);
MyLCD.print("DA LUU DU LIEU ");
delay(500);
CurrentState = STAMAIN;
DisplayMain();
}
void DisplayInformation(byte ID) {
String Name;
92
PHỤ LỤC
Name = GetInforFromEEPROM(ID);
MyLCD.setCursor(0, 1);
MyLCD.print(" ");
MyLCD.setCursor(0, 1);
MyLCD.print(Name);
}

void DisplayNextIDInfo() {
CurrentID = CheckNextIDInUse(CurrentID);
if (CurrentID == MAXDATANUMBER + 1) {
MyLCD.setCursor(0, 1);
MyLCD.print("DA HET DU LIEU ");
} else {
DisplayInformation(CurrentID);
}
}

void DeleteIDInfor() {
DeleteIDArray(CurrentID);
DeleteFingerPrint(CurrentID);
SaveInforToEEPROM(CurrentID, "");
MyLCD.setCursor(0, 1);
MyLCD.print("DA XOA THONG TIN");
delay(1000);
ActionFunction(CurrentState);
}

void setup() {
pinMode(Keycol1, OUTPUT);
pinMode(Keycol2, OUTPUT);
pinMode(Keycol3, OUTPUT);
pinMode(KeyrowA, INPUT_PULLUP);
pinMode(KeyrowB, INPUT_PULLUP);
pinMode(KeyrowC, INPUT_PULLUP);
pinMode(KeyrowD, INPUT_PULLUP);
Serial.begin(9600);
ESPSerial.begin(9600);
93
PHỤ LỤC
delay(100);
Serial.println("\n\nAdafruit Fingerprint sensor enrollment");
// set the data rate for the sensor serial port
finger.begin(57600);
MyLCD.init();
MyLCD.backlight();
MyLCD.setCursor(0, 0);
MyLCD.print(" HT DIEM DANH ");
MyLCD.setCursor(0, 1);
MyLCD.print(" VAN TAY ");
//InitFingerPrint();
ReadIndexDatafromEEPROM();
delay(1000);
GetPasswordFromEEPROM();
DisplayMain();
CurrentState = STAMAIN;
}
void loop() // run over and over again
{
byte KeyCode;
int FoundID;
if (CurrentState == STAMAIN) {
FoundID = CheckFingerPrint();
if (FoundID != 1500) {
MyLCD.setCursor(0, 0);
MyLCD.print(" DA XAC NHAN ");
DisplayInformation((byte) FoundID);
ESPSerial.write(0xFE);
delay(1);
ESPSerial.print(GetInforFromEEPROM(FoundID));
delay(1);
ESPSerial.write(0xFD);
delay(1000);
DisplayMain();
}
if (ESPSerial.available()) {
ReceiveESPData = ESPSerial.readString();
94
PHỤ LỤC
MyLCD.setCursor(0, 1);
MyLCD.print(" ");
MyLCD.setCursor(0, 1);
MyLCD.print(ReceiveESPData);
delay(3000);
DisplayMain();
}
}
KeyCode = ScanKeyboard();
if (KeyCode != NOKEY) {
switch (CurrentState) {
case STAMAIN: {
if (KeyCode == KEYHASH) {
CurrentState = STAMENU1;
DisplayMenu1();
} else if (KeyCode == KEYSTAR) {
MyLCD.setCursor(0, 1);
MyLCD.print(" ");
MyLCD.setCursor(0, 1);
MyLCD.print(ReceiveESPData); // display IP again
delay(3000);
DisplayMain();
}
break;
}
case STAMENU1: {
if (KeyCode == KEYSTAR) {
CurrentState = STAMAIN;
DisplayMain();
} else if (KeyCode == KEYHASH) {
CurrentState = STAMENU2;
DisplayMenu2();
} else if (KeyCode == KEY1) {
CurrentState = STACHECKPASS;
NextState = STAADDFINGER;
DisPlayCheckPass();
} else if (KeyCode == KEY2) {
95
PHỤ LỤC
CurrentState = STACHECKPASS;
NextState = STADELETEFINGER;
DisPlayCheckPass();
}
break;
}
case STAMENU2: {

if (KeyCode == KEYSTAR) {
CurrentState = STAMAIN;
DisplayMain();
} else if (KeyCode == KEY1) {
CurrentState = STACHECKPASS;
NextState = STACHANGEPASS;
DisPlayCheckPass();
} else if (KeyCode == KEY2) {
CurrentState = STACHECKPASS;
NextState = STADELETEALLFINGER;
DisPlayCheckPass();
}
break;
}
case STACHECKPASS: {
switch (KeyCode) {
case KEY0:
case KEY1:
case KEY2:
case KEY3:
case KEY4:
case KEY5:
case KEY6:
case KEY7:
case KEY8:
case KEY9: {
if (CurrentPassIndex < 6) // max is 6 digit
{
CurrentPass[CurrentPassIndex] = KeyCode;
96
PHỤ LỤC
//MyLCD.write(CurrentPass[CurrentPassIndex]+48);
MyLCD.print("*");
CurrentPassIndex++;
}

break;
}
case KEYHASH: {

if (VerifyPass() == true) {
CurrentState = NextState;
ActionFunction(CurrentState);
} else {
MyLCD.setCursor(3, 1);
MyLCD.print("SAI MAT MA! ");
delay(1000);
CurrentPassIndex = 0;
CurrentPass[0] = 0;
CurrentPass[1] = 0;
CurrentPass[2] = 0;
CurrentPass[3] = 0;
CurrentPass[4] = 0;
CurrentPass[5] = 0;
MyLCD.setCursor(3, 1);
MyLCD.print(" ");
MyLCD.setCursor(3, 1);
}
break;
}
case KEYSTAR: {
CurrentPassIndex = 0;
CurrentPass[0] = 0;
CurrentPass[1] = 0;
CurrentPass[2] = 0;
CurrentPass[3] = 0;
CurrentPass[4] = 0;
CurrentPass[5] = 0;
97
PHỤ LỤC
CurrentState = STAMAIN;
DisplayMain();
}
}
break;
}
case STACHANGEPASS: {
switch (KeyCode) {
case KEY0:
case KEY1:
case KEY2:
case KEY3:
case KEY4:
case KEY5:
case KEY6:
case KEY7:
case KEY8:
case KEY9: {
if (CurrentPassIndex < 6) // max is 6 digit
{
CurrentPass[CurrentPassIndex] = KeyCode;
//MyLCD.write(CurrentPass[CurrentPassIndex]+48);
MyLCD.print("*");
CurrentPassIndex++;
}
break;
}
case KEYHASH: {
if (CurrentPassIndex < 6) {
MyLCD.setCursor(3, 1);
MyLCD.print("CHUA DU 6 KT");
delay(1000);
CurrentPassIndex = 0;
CurrentPass[0] = 0;
CurrentPass[1] = 0;
CurrentPass[2] = 0;
CurrentPass[3] = 0;
98
PHỤ LỤC
CurrentPass[4] = 0;
CurrentPass[5] = 0;
MyLCD.setCursor(3, 1);
MyLCD.print(" ");
MyLCD.setCursor(3, 1);
} else {
PassWord[0] = CurrentPass[0];
PassWord[1] = CurrentPass[1];
PassWord[2] = CurrentPass[2];
PassWord[3] = CurrentPass[3];
PassWord[4] = CurrentPass[4];
PassWord[5] = CurrentPass[5];
SavePasswordToEEPROM();
MyLCD.setCursor(3, 1);
MyLCD.print("DA LUU MA MOI");
delay(1000);
CurrentPassIndex = 0;
CurrentPass[0] = 0;
CurrentPass[1] = 0;
CurrentPass[2] = 0;
CurrentPass[3] = 0;
CurrentPass[4] = 0;
CurrentPass[5] = 0;
CurrentState = STAMAIN;
DisplayMain();
}
break;
}
case KEYSTAR: {
CurrentPassIndex = 0;
CurrentPass[0] = 0;
CurrentPass[1] = 0;
CurrentPass[2] = 0;
CurrentPass[3] = 0;
CurrentPass[4] = 0;
CurrentPass[5] = 0;
CurrentState = STAMAIN;
99
PHỤ LỤC
DisplayMain();
break;
}
}
break;
}
case STADELETEALLFINGER: {
if (KeyCode == KEYSTAR) {

CurrentState = STAMAIN;
DisplayMain();
} else if (KeyCode == KEYHASH) {
DeleteAllFinger();
delay(1000);
CurrentState = STAMAIN;
DisplayMain();
}
break;
}
case STAINPUTNAME: {
switch (KeyCode) {
case KEY0:
case KEY1:
case KEY2:
case KEY3:
case KEY4:
case KEY5:
case KEY6:
case KEY7:
case KEY8:
case KEY9: {
InputCharacter(KeyCode);
break;
}
case KEYSTAR: {
NextCharacter();
break;
100
PHỤ LỤC
}
case KEYHASH: {
SaveNewFinger();
break;
}
}
break;
}
case STADELETEFINGER: {
switch (KeyCode) {
case KEYSTAR: {
CurrentState = STAMAIN;
DisplayMain();
break;
}
case KEY0: {
DisplayNextIDInfo();
break;
}
case KEYHASH: {
DeleteIDInfor();
break;
}
}
break;
}
}
}
}

101

You might also like