Professional Documents
Culture Documents
Arduino Mo Hinh Quet Van Tayco Giao Dien Web
Arduino Mo Hinh Quet Van Tayco Giao Dien Web
ĐỀ 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
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
4.3. VIẾT TÀI LIỆU HƯỚNG DẪN SỬ DỤNG, THAO TÁC .........................61
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
Hình 3.5: Mạch chuyển giao tiếp LCD sang I2C ..........................................................47
9
Hình 4.1: Sơ đồ bố trí linh kiện mặt trước mô hình ......................................................50
Hình 5.2: Phần thêm vân tay và xóa vân tay .................................................................64
Hình 5.6: Phần thêm vân tay và xóa vân tay .................................................................65
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ẢNG
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à 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
13
CHƯƠNG 1: TỔNG QUAN
ứ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.
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.
- 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 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.
18
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
- 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 đủ.
+ 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.
19
CHƯƠNG 2: CƠ SỞ LÝ THUYẾ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.
- Điện áp đầu vào (giới hạn): 6-20V.
21
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
- 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 được
23
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
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
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:
- 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’) để 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.
27
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
- 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 độ 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
28
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
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
+ 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
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.
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
D5 GPIO14 OK OK SPI (SCLK)
D6 GPIO12 OK OK SPI (MISO)
D7 GPIO13 OK OK SPI (MOSI)
D8 GPIO15 Kéo đến GND OK SPI (CS)
39
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
- Chân RST
+ 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
+ ESP8266 hỗ trợ chân ngắt trong bất kỳ GPIO nào, ngoại trừ GPIO16.
40
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
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.
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.15: 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.16: 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.17: 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
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
53
CHƯƠNG 4: THI CÔNG HỆ THỐNG
❖ Lưu đồ quét vân tay
54
CHƯƠNG 4: THI CÔNG HỆ THỐNG
❖ Lưu đồ truyền dữ liệu Wed
55
CHƯƠNG 4: THI CÔNG HỆ THỐNG
❖ Lưu đồ quản lý admin
- Arduino Toolbar có một số button và chức năng của chúng như sau:
57
CHƯƠNG 4: THI CÔNG HỆ THỐNG
+ 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 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.
58
CHƯƠNG 4: THI CÔNG HỆ THỐNG
- 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, …
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,
61
CHƯƠNG 4: THI CÔNG HỆ THỐNG
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
72
PHỤ LỤC
#define STAINPUTNAME 8
#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();
73
PHỤ LỤC
Serial.print(F("Status: 0x"));
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();
74
PHỤ LỤC
switch (p) {
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 {
81
PHỤ LỤC
PassWord[i] = CurrentValue;
}
}
}
}
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));
83
PHỤ LỤC
delay(10);
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() {
85
PHỤ LỤC
byte Index;
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() {
88
PHỤ LỤC
MyLCD.clear();
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();
}
91
PHỤ LỤC
} else {
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) {
92
PHỤ LỤC
String Name;
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);
93
PHỤ LỤC
ESPSerial.begin(9600);
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()) {
94
PHỤ LỤC
ReceiveESPData = ESPSerial.readString();
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();
95
PHỤ LỤC
} else if (KeyCode == KEY2) {
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
{
96
PHỤ LỤC
CurrentPass[CurrentPassIndex] = KeyCode;
//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;
97
PHỤ LỤC
CurrentPass[5] = 0;
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;
98
PHỤ LỤC
CurrentPass[3] = 0;
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;
99
PHỤ LỤC
CurrentState = STAMAIN;
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();
100
PHỤ LỤC
break;
}
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