TIỂU LUẬN tốt NGHIỆP đề tài QUẢN lý và CẢNH báo THÔNG TIN SINH VIÊN BẰNG máy QUÉT vân TAY

101 3 0
TIỂU LUẬN tốt NGHIỆP đề tài QUẢN lý và CẢNH báo THÔNG TIN SINH VIÊN BẰNG máy QUÉT vân TAY

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC NÔNG LÂM TP.HỒ CHÍ MINH KHOA CƠ KHÍ VÀ CƠNG NGHỆ TIỂU LUẬN TỐT NGHIỆP ĐỀ TÀI: QUẢN LÝ VÀ CẢNH BÁO THÔNG TIN SINH VIÊN BẰNG MÁY QUÉT VÂN TAY GVHD: NGUYỄN ĐĂNG KHOA SVTH: NGUYỄN HÙNG DUY MSSV: 17153023 TP.HỒ CHÍ MINH-5/2021 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC NƠNG LÂM TP.HỒ CHÍ MINH KHOA CƠ KHÍ VÀ CÔNG NGHỆ TIỂU LUẬN TỐT NGHIỆP NGÀNH CÔNG NGHỆ KĨ THUẬT CƠ ĐIỆN TỬ ĐỀ TÀI: QUẢN LÝ VÀ CẢNH BÁO THÔNG TIN SINH VIÊN BẰNG MÁY QUÉT VÂN TAY GVHD: NGUYỄN ĐĂNG KHOA SVTH: NGUYỄN HÙNG DUY MSSV: 17153023 TP.HỒ CHÍ MINH-5/2021 TRƯỜNG ĐẠI HỌC NƠNG LÂM TP.HỒ CHÍ MINH CỘNG HỊA XÃ HỘI CHỦ NGHĨA VIỆT NAM KHOA CƠ KHÍ VÀ CƠNG NGHỆ ĐỘC LẬP-TỰ DO- HẠNH PHÚC Tp.Hồ Chí Minh, ngày 11 tháng năm 2021 NHIỆM VỤ TIỂU LUẬN TỐT NGHIỆP Họ tên sinh viên: Nguyễn Hùng Duy MSSV: 17152023 Chuyên ngành: Công nghệ kĩ thuật điện tử Hệ đào tạo: Chính quy Khóa :2017 Lớp: DH17CD I TÊN ĐỀ TÀI: QUẢN LÝ VÀ CẢNH BÁO THÔNG TIN SINH VIÊN BẰNG MÁY QUÉT VÂN TAY II NHIỆM VỤ: - Tìm hiểu nghiên cứu cấu tạo, nguyên lý hoạt động, chứ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 nghiên cứu cách lập trình Web Server, Exel , tìm hiểu ngơn ngữ HTML, CSS, PHP, sở liệu MySQL để tạo nên trang Web hoàn chỉnh - Cách thiết kế thi cơng mơ hình hồn thiện - Thiết kế hệ thống điều khiển, lưu đồ giải thuật chương trình điều khiển mơ hình - Thiết kế hồ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 TRƯỜNG ĐẠI HỌC NƠNG LÂM TP.HỒ CHÍ MINH CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM KHOA CƠ KHÍ VÀ CƠNG NGHỆ ĐỘC LẬP-TỰ DO- HẠNH PHÚC Tp.Hồ Chí Minh, ngày 11 tháng năm 2021 LỊCH TRÌNH THỰC HIỆN ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên:…………………………………………………………………… Lớp: …………………………………………… MSVV: ………………………… Tên đề tài: ………………………………………………………………………………………… ………………………………………………………………………………………… Tuần/ngày Nội dung Xác nhận GVHD GV HƯỚNG DẪN (Ký ghi rỏ họ tên ) LỜI CAM ĐOAN Đề tài sinh viên Nguyễn Hùng Duy tự thực hiện, dựa vào số tài liệu trước khơng chép từ tài liệu hay cơng trình có trước Người thực đề tài Nguyễn Hùng Duy LỜI CẢM ƠN Sau trình tìm hiểu, nghiên cứu thực đề tài đồ án tốt nghiệp hoàn thành tiến độ, chúng em xin chân thành gửi lời cảm ơn sâu sắc đến q thầy cơ, gia đình người anh, người bạn giúp đỡ, đưa lời khuyên, lời động viên 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 tạo điều kiện điều kiện để nhóm thực tốt đề tài Và chúng em xin gửi lời tri ân đến thầy cô khoa Điện tử-Cơng nghệ Đại Học Nơng Lâm TP.Hồ Chí Minh tận tình dạy dỗ giảng dạy cho chúng em kiến thức đến nâng cao tạo cho chúng em sở kiến thức vững vàng để hồn thành đề tài Gia đình ln nguồn động lực nguồn cảm hứng để chúng em liên tục phấn đấu hoàn thành đề tài, xin cảm ơn đấng sinh thành động viên chúng em lúc bế tắc chán nản Và cuối chúng em xin cảm ơn anh, chị trước bạn bè có lời khuyên, lời góp ý chân thành để đề tài chúng em hồn thiện Một lần nữa, chúng em xin cảm ơn tất người bên cạnh giúp đỡ chúng em, tạo động lực để chúng em hoàn thành tốt đề tài Xin chân thành cảm ơn TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY MỤC LỤC TÓM TẮT 12 CHƯƠNG 1: TỔNG QUAN .13 1.1 Đặt vấn đề .13 1.2 Mục tiêu 14 1.3 Nội dung thực 14 1.4 Bố cục .15 CHƯƠNG 2: CƠ SỞ LÝ THUYẾT 16 2.1 TỔNG QUAN VỀ ARDUINO .16 2.1.1 Giới thiệu 16 2.1.2 Phần cứng 17 2.2 NHẬN DẠNG VÂN TAY .17 2.2.1 Giới thiệu sơ lược dấu vân tay 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 18 2.2.3 Nguyên lý hoạt động nhận dạng vân tay 18 2.2.4 Các bước xử lý trình nhận dạng vân tay .19 2.3 GIỚI THIỆU VỀ PHẦN CỨNG 21 2.3.1 Arduino Mega 2560 21 2.3.2 Module cảm biến vân tay R307 (Finger print R307) 24 2.3.3 Bàn phím ma trận 3x4 (Keypad 3x4) 32 2.3.4 Màn hình LCD 1602 .34 2.3.5 Mạch chuyển giao tiếp LCD 1602 35 2.3.6 Module ESP 8266 MCU V3 36 2.3.7 Mạch hạ áp LM2596 .41 CHƯƠNG 3: TÍNH TỐN VÀ THIẾT KẾ .43 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY 3.1 GIỚI THIỆU 43 3.2 TÍNH TỐN VÀ THIẾT KẾ HỆ THỐNG 43 3.2.1 Thiết kế sơ đồ khối hệ thống .43 3.2.2 Tính tốn thiết kế mạch 44 3.2.3 Sơ đồ nguyên lý toàn mạch 48 CHƯƠNG 4: THI CÔNG HỆ THỐNG 50 4.1 ĐÓNG GĨI VÀ THI CƠNG MƠ HÌNH 50 4.1.1 Đóng gói điều khiển 50 4.1.2 Thi cơng mơ hình 50 4.2 LẬP TRÌNH HỆ THỐNG 51 4.2.1 Lưu đồ giải thuật 51 4.2.2 Phần mềm lập trình cho vi điều khiển 57 4.2.3 Phần mềm Exel .61 4.3 VIẾT TÀI LIỆU HƯỚNG DẪN SỬ DỤNG, THAO TÁC 61 CHƯƠNG 5: KẾT QUẢ, NHẬN XÉT, ĐÁNH GIÁ 63 5.1 KẾT QUẢ 63 5.2 Nhận xét đánh giá 67 CHƯƠNG 6: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 69 6.1 Kết luận 69 6.2 HƯỚNG PHÁT TRIỂN 70 TÀI LIỆU THAM KHẢO 71 PHỤ LỤC .72 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY DANH SÁCH CÁC HÌNH Hình 2.1: Các loại Arduino 16 Hình 2.2: Sơ đồ trình xử lý ảnh 19 Hình 2.3: Sơ đồ trình so sánh vân tay .20 Hình 2.4: Sơ đồ chân kết nối Arduino Mega 2560 22 Hình 2.5: Mạch Arduino Mega .23 Hình 2.6: Module cảm biến vân tay R305 .25 Hình 2.7: Giao thức truyền thông R307 28 Hình 2.8: Định dạng gói liệu 30 Hình 2.91: Sơ đồ nối dây hình ảnh thực tế bàn phím ma trận 3x4 32 Hình 2.10: Màn hình LCD 1602 chân kết nốt 34 Hình 2.11: Mạch chuyển giao tiếp LCD 1602 35 Hình 2.12: Sơ đồ chân kết nối Module ESP 8266 37 Hình 2.13: Mạch hạ áp LM2596 41 Hình 2.14: Sơ đồ chân kết nối mạch hạ áp LM2596 41 Hình 3.1: Sơ đồ khối hệ thống .43 Hình 3.2: Khối xử lý trung tâm sử dụng board Arduino Mega 2560 44 Hình 3.3: Sơ đồ nguyên lý Cảm biến vân tay kết nối Arduino Mega 46 Hình 3.4: LCD 12x6 46 Hình 3.5: Mạch chuyển giao tiếp LCD sang I2C 47 Hình 3.6: Hình ảnh thực tế Adapter 12V 3A 47 Hình 3.7: Module hạ áp LM2596 48 Hình 3.8: Sơ đồ chun lý tồn mạch 49 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY Hình 4.1: Sơ đồ bố trí linh kiện mặt trước mơ hình 50 Hình 4.2: Hình dạng bên ngồi mơ hình .50 Hình 4.3: Hình dạng bên mơ hình 51 Hình 4.4: Lưu đồ menu 52 Hình 4.5: Lưu đồ quét vân tay .54 Hình 4.6: Lưu đồ truyền liệu lên wed 55 Hình 4.7: Lưu đồ quản trị 56 Hình 4.8: Giao diện lập trình arduino 57 Hình 4.9: Arduino Toolbar 57 Hình 4.10: Giao diện Web .60 Hình 4.11: Excel 61 Hình 5.1: Phần check vân tay 64 Hình 5.2: Phần thêm vân tay xóa vân tay 64 Hình 5.3: Phần quản lí Admin .64 Hình 5.4: Đưa ngón tay vào cảm biến 65 Hình 5.5: Hệ thống xác nhận vân tay 65 Hình 5.6: Phần thêm vân tay xóa vân tay 65 Hình 5.7: Phần nhập mật mã 65 Hình 5.8: Phần thêm vân tay 66 Hình 5.9: Thao tác thêm vân tay 66 Hình 5.10: Phần xóa vân tay 66 Hình 5.11: Phần hiển thị thông tin quét vân tay wed server 66 Hình 5.12: Hệ thống cảnh báo sinh viên .67 10 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY PHỤ LỤC MyLCD.print("2 VAN TAY KHAC "); break; } case 255: { return 255; break; } default: { MyLCD.setCursor(0, 1); MyLCD.print("CO LOI XAY RA! "); } } delay(1000); return Result; } int CheckFingerPrint() { int CheckID; CheckID = getFingerprintID(); if (CheckID != -1) { if (CheckID == 0) { MyLCD.setCursor(0, 1); MyLCD.print("VT KHONG KHOP! "); delay(1000); DisplayMain(); } else { return CheckID; } } else { if (IncheckFingerPrint == true) { IncheckFingerPrint = false; } } return 1500; } void DeleteFingerPrint(byte ID) { 87 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY PHỤ LỤC byte Result; Result = deleteFingerprint(ID); if (Result == FINGERPRINT_OK) { MyLCD.setCursor(0, 1); MyLCD.print("DA XOA VAN TAY "); } else { MyLCD.setCursor(0, 1); MyLCD.print("CO LOI XAY RA! "); } } void DeleteAllFinger() { MyLCD.setCursor(0, 1); MyLCD.print("DANG XOA finger.emptyDatabase(); ResetDataRecordArray(); MyLCD.setCursor(0, 1); "); MyLCD.print("DA XOA HET DATA "); } void DisplayMenu1() { MyLCD.clear(); MyLCD.setCursor(0, 0); MyLCD.print("1: THEM VAN TAY"); MyLCD.setCursor(0, 1); MyLCD.print("2: XOA VAN TAY"); } void DisplayMenu2() { MyLCD.clear(); MyLCD.setCursor(0, 0); MyLCD.print("1:DOI PASS ADMIN"); MyLCD.setCursor(0, 1); MyLCD.print("2:XOA HET DULIEU"); } void DisplayMain() { 88 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY 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 ActionFunction(byte State) { MyLCD.clear(); byte Result; switch (State) { case STACHANGEPASS: { MyLCD.setCursor(3, 0); MyLCD.print("NHAP MA MOI"); MyLCD.setCursor(3, 1); CurrentPassIndex = 0; break; } case STAADDFINGER: { MyLCD.setCursor(0, 0); MyLCD.print("THEM VAN TAY"); delay(100); IDToSave = CheckNextIDAvailable(); Result = SetupNewFingerPrint(IDToSave); while (Result != true && Result != 255) { Result = SetupNewFingerPrint(IDToSave); } if (Result == true) { CurrentState = STAINPUTNAME; DisplayInputName(); } else { CurrentState = STAMAIN; DisplayMain(); } break; 89 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY PHỤ LỤC } case STADELETEFINGER: { MyLCD.setCursor(0, 0); MyLCD.print("XOA VAN TAY"); CurrentID = 0; CurrentID = CheckNextIDInUse(CurrentID); if (CurrentID == MAXDATANUMBER + 1) { MyLCD.setCursor(0, 1); MyLCD.print("KHONG CO DU LIEU"); } else { DisplayInformation(CurrentID); } break; } case STADELETEALLFINGER: { MyLCD.setCursor(0, 0); MyLCD.print("XOA HET DU LIEU"); MyLCD.setCursor(0, 1); MyLCD.print("*:HUY #:XAC NHAN"); break; } } } void DisPlayCheckPass() { MyLCD.clear(); MyLCD.setCursor(3, 0); MyLCD.print("NHAP MAT MA:"); MyLCD.setCursor(3, 1); CurrentPassIndex = 0; CurrentPass[0] = 0; CurrentPass[1] = 0; CurrentPass[2] = 0; CurrentPass[3] = 0; CurrentPass[4] = 0; CurrentPass[5] = 0; } 90 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY PHỤ LỤC bool VerifyPass() { char i; for (i = 0; i < 6; i++) { if (CurrentPass[i] != PassWord[i]) return false; } return true; } void DisplayInputName() { NameData = ""; PressCount = 0; NameLengh = 0; CurrentCharacter = ' '; MyLCD.clear(); MyLCD.setCursor(5, 0); MyLCD.print("NHAP TEN"); MyLCD.setCursor(NameLengh, 1); MyLCD.blink(); MyLCD.cursor(); } void InputCharacter(byte Key) { if (Key != LastKey) { PressCount = 0; CurrentCharacter = Key + 48; // convert to ascii number LastKey = Key; } else { PressCount++; if (Key == KEY0) { if (PressCount == 1) { CurrentCharacter = 32; //space } else { CurrentCharacter = Key + 48; // convert to ascii PressCount = 0; } 91 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY 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) * + 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 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY 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 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY 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 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY 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 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY 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 digit { 96 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY 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 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY 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 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 KT"); delay(1000); CurrentPassIndex = 0; CurrentPass[0] = 0; CurrentPass[1] = 0; CurrentPass[2] = 0; 98 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY 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 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY 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 TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY TIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAYTIEU.LUAN.tot.NGHIEP.de.tai.QUAN.ly.va.CANH.bao.THONG.TIN.SINH.VIEN.BANG.may.QUET.van.TAY

Ngày đăng: 24/12/2023, 11:53

Tài liệu cùng người dùng

Tài liệu liên quan