Professional Documents
Culture Documents
ĐỀ TÀI:
ĐỀ TÀI:
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
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 đó.
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.
6
MỤC LỤC
TÓM TẮT..................................................................................................................12
1.4. Bố cục.............................................................................................................15
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT........................................................................16
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.2. Module cảm biến vân tay R307 (Finger print R307)...................................24
7
3.1. GIỚI THIỆU..................................................................................................43
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.4: Sơ đồ các chân kết nối trên Arduino Mega 2560.........................................22
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.12: Sơ đồ các chân kết nối của Module ESP 8266...........................................37
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
9
Hình 4.2: Hình dạng bên ngoài mô hình......................................................................50
Hình 5.11: Phần hiển thị thông tin quét vân tay trên wed server..................................66
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.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
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.
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.
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.
15
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
2.1. TỔNG QUAN VỀ ARDUINO
- 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
- 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.
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
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.
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.
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
- 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
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
- 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:
- 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).
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.
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ự.
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.
- 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
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).
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.
Hình 2.10: Màn hình LCD 1602 và các chân kết nốt
- 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.
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
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
- 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
- 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
- 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.
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
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.
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Ế
KHỐI XỬ
LÝ TRUNG
TÂM
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.
- Ý 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
- 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
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.
48
CHƯƠNG 3: TÍNH TOÁN VÀ THIẾT KẾ
49
CHƯƠNG 4: THI CÔNG HỆ THỐNG
50
CHƯƠNG 4: THI CÔNG HỆ THỐNG
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
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)
Đ
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
54
CHƯƠNG 4: THI CÔNG HỆ THỐNG
55
CHƯƠNG 4: THI CÔNG HỆ THỐNG
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.
- Arduino Toolbar có một số button và chức năng của chúng như sau:
- 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 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.
- 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, …
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Á
- 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:
- 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.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
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.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.
- 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
- 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.
70
TÀI LIỆU THAM KHẢO
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
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;
}
}
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;
}
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 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;
}
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 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 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();
}
} 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