TRƯỜNG ĐH SPKT TP. HỒ CHÍ MINH CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
KHOA ĐIỆN-ĐIỆN TỬ ĐỘC LẬP - TỰ DO - HẠNH PHÚC
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH ----o0o----
Tp. HCM, ngày 18 tháng 12 năm 2019
NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP
Họ tên sinh viên: Hoàng Bảo Phúc MSSV: 15142283
Nguyễn Chí Thương MSSV: 15141299
Chuyên ngành: Kỹ thuật Điện - Điện tử Mã ngành: 41
Hệ đào tạo: Đại học chính quy Mã hệ: 1
Khóa: 2015 Lớp: 15141DT
I. TÊN ĐỀ TÀI: THIẾT KẾ VÀ THI CÔNG HỆ THỐNG QUẢN LÝ MÔ HÌNH
164 trang |
Chia sẻ: huong20 | Ngày: 13/01/2022 | Lượt xem: 352 | Lượt tải: 0
Tóm tắt tài liệu Đồ án Thiết kế và thi công hệ thống quản lý mô hình airbnb, homestay, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
H
AIRBNB, HOMESTAY
II. NHIỆM VỤ
1. Các số liệu ban đầu:
Hệ thống quản lý mô hình Airbnb, HomeStay được thực hiện với các số liệu ban đầu như
sau:
− Hệ thống nhận thông tin của khách cần thuê phòng. Sau đó sẽ kiểm tra thông tin của
khách hàng được gửi đến, nếu hợp lệ thì hệ thống sẽ gửi thông tin lại cho khách hàng
thông qua địa chỉ mail và số điện thoại (mật khẩu vào phòng, ngày vào phòng, ngày trả
phòng, )
− Hệ thống kiểm soát thông tin vào/ra của từng phòng, lưu lại thông tin trên hệ thống và
truy xuất ra file excel.
− LCD hiển thị một vài thông tin khi khách hàng nhập mật khẩu vào phòng.
− Đến thời hạn trả phòng, hệ thống sẽ tự động vô hiệu hóa mật khẩu vào phòng.
− Có sử dụng cảm biến vân tay dành riêng cho chủ nhà và nhân viên để mở cửa trong
những trường hợp cần thiết.
2. Nội dung thực hiện:
− Lên ý tưởng đồ án
− Tìm hiểu về linh kiện sử dụng
− Thiết kế và thi công hệ thống web server, web app. Truyền nhận thông tin giữa các hệ
thống.
− Thiết kế khối giao tiếp ngoại vi, lấy cơ sở dữ liệu trực tuyến thông qua Internet, truyền
nhận thông tin giữa trạm phụ và trạm trung tâm.
− Thiết kế và thi công hệ thống quản lý ra/vào của mô hình AirBNB, Homestay.
− Vẽ lưu đồ giải thuật
− Lắp ráp các khối vào mô hình.
− Chạy thử nghiệm hệ thống.
− Cân chỉnh hệ thống.
− Viết luận văn.
− Báo cáo đề tài tốt nghiệp.
i
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: KS. Hà A Thồi
CÁN BỘ HƯỚNG DẪN BM. ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
ii
TRƯỜNG ĐH SPKT TP. HỒ CHÍ MINH CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
KHOA ĐIỆN-ĐIỆN TỬ ĐỘC LẬP - TỰ DO - HẠNH PHÚC
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH ----o0o----
Tp. HCM, ngày 18 tháng 12 năm 2019
LỊCH TRÌNH THỰC HIỆN ĐỒ ÁN TỐT NGHIỆP
Họ tên sinh viên 1: Hoàng Bảo Phúc
Lớp: 15141DT2A MSSV: 15142283
Họ tên sinh viên 2: Nguyễn Chí Thương
Lớp: 15141DT2B MSSV: 15141299
Tên đề tài: Thiết kế và thi công hệ thống quản lý mô hình airbnb, homestay
Xác nhận
Tuần/ngày Nội dung
GVHD
GV HƯỚNG DẪN
(Ký và ghi rõ họ và tên)
iii
LỜI CAM ĐOAN
Nhóm sinh viên – Hoàng Bảo Phúc và Nguyễn Chí Thương xin cam đoan đây là đồ án
do nhóm tự thực hiện dưới sự hướng dẫn của thầy Hà A Thồi. Nhóm chỉ tham khảo các tài
liệu trước đó và các nghiên cứu trên mạng online. Kết quả công bố trong khóa luận tốt
nghiệp là trung thực không sao chép từ tài liệu hay công trình đã có trước đó.
Tp.HCM, ngày 18 tháng 12 năm 2019
SV thực hiện đồ án
( Ký và ghi rõ họ tên)
Nguyễn Chí Thương Hoàng Bảo Phúc
iv
LỜI CẢM ƠN
Nhóm thực hiện đồ án xin được gửi lời cảm ơn đặc biệt đến giảng viên hướng dẫn thầy
Hà A Thồi vì đã giúp đỡ nhóm trong quá trình thực hiện đồ án, người đã đưa ra hướng
nghiên cứu, giải đáp thắc mắc, cũng như tận tình quan sát nhóm làm việc. Trong quá trình
thực hiện nhóm đã tiếp thu được những kiến thức thực tế và cách làm việc nghiêm túc, hiệu
quả từ thầy.
Nhóm em xin gửi lời tri ân thành nhất đến các quý thầy cô trong khoa Điện - điện tử đã
hỗ trợ chúng em về những kiến thức nền tảng vững vàng, tạo điều kiện tốt nhất cho sinh
viên trong quá trình học tập và nghiên cứu.
Sự hỗ trợ thầm lặng và vô cùng quan trọng từ gia đình và bạn bè luôn là động lực để
nhóm có thể làm việc hết khả năng và hoàn thành đồ án một cách tốt nhất. Một lần nữa
nhóm vô cùng hân hạnh khi được làm sinh viên tại trường ĐH Sư Phạm Kỹ Thuật TPHCM,
là học trò của những giảng viên đầy tâm huyết, lời cảm ơn này cũng là sự ghi nhận sâu sắc
mà nhóm muốn gửi đến thầy cô, gia đình và bạn bè.
Người thực hiện đề tài
Nguyễn Chí Thương Hoàng Bảo phúc
v
MỤC LỤC
NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP ....................................................................... i
LỊCH TRÌNH THỰC HIỆN ĐỒ ÁN TỐT NGHIỆP ......................................... iii
LỜI CAM ĐOAN ................................................................................................... iv
LỜI CẢM ƠN .......................................................................................................... v
MỤC LỤC ............................................................................................................... vi
DANH SÁCH HÌNH ẢNH .................................................................................... ix
DANH SÁCH BẢN VẼ ......................................................................................... xii
TÓM TẮT ............................................................................................................. xiii
CHƯƠNG 1. TỔNG QUAN ................................................................................... 1
1.1 ĐẶT VẤN ĐỀ ........................................................................................................... 1
1.2 MỤC TIÊU ................................................................................................................ 1
1.3 NỘI DUNG NGHIÊN CỨU ...................................................................................... 2
1.4 GIỚI HẠN ................................................................................................................. 2
1.5 BỐ CỤC ..................................................................................................................... 2
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT ...................................................................... 4
2.1 GIỚI THIỆU VỀ MÔ HÌNH HOMESTAY VÀ AIRBNB ....................................... 4
2.1.1 Homestay ........................................................................................................................ 4
2.1.2 AirBNB ........................................................................................................................... 5
2.2 GIỚI THIỆU VỀ ARDUINO. ................................................................................... 6
2.2.1 Phần cứng ....................................................................................................................... 6
2.2.2 Arduino Uno R3 ............................................................................................................. 7
2.2.3 Phần mềm ..................................................................................................................... 12
2.3 CẢM BIẾN VÂN TAY ........................................................................................... 14
2.3.1 Máy quét quang học ..................................................................................................... 14
2.3.2 Máy quét điện dung ...................................................................................................... 15
2.3.3 Máy quét siêu âm .......................................................................................................... 15
2.3.4 Cảm biến vân tay R305. ............................................................................................... 16
2.4 GIỚI THIỆU HỆ THỐNG INTERNET .................................................................. 18
2.4.1 Cấu trúc của mạng Internet ........................................................................................... 19
2.4.2 Các mạng truy nhập không dây .................................................................................... 19
vi
2.5 MODULE WIFI ESP8266 ....................................................................................... 20
2.5.1 Các chế độ boot up của ESP8266 ................................................................................. 20
2.5.2 Các loại module cho ESP8266 trên thị trường ............................................................. 21
2.6 BÀN PHÍM MA TRẬN 4x4. ................................................................................... 23
2.7 NGUỒN CUNG CẤP .............................................................................................. 25
2.7.1 Bộ chuyển đổi adapter .................................................................................................. 25
2.7.2 Bộ chuyển đổi nguồn DC- DC ..................................................................................... 26
2.8 MODULE LCD 16x2 .............................................................................................. 27
2.9 MODULE I2C ......................................................................................................... 28
2.10 CÁC CHUẨN GIAO TIẾP ................................................................................... 29
2.10.1 Giao tiếp uart .............................................................................................................. 29
2.10.2 Giao tiếp I2C .............................................................................................................. 34
2.11 IoT .......................................................................................................................... 37
2.11.1 Giới thiệu về IoT ........................................................................................................ 37
2.11.2 IoT hoạt động như thế nào ........................................................................................ 38
2.11.3. Một số ứng dụng của IoT ........................................................................................ 38
2.11.4 Web socket ................................................................................................................. 39
2.12. SERVER ............................................................................................................... 41
2.12.1. Node JS ...................................................................................................................... 41
2.12.2. Postgresql .................................................................................................................. 42
2.12.3. Heroku ....................................................................................................................... 45
CHƯƠNG 3: TÍNH TOÁN VÀ THIẾT KẾ HỆ THỐNG ................................ 49
3.1 GIỚI THIỆU VỀ MÔ HÌNH HỆ THỐNG .............................................................. 49
3.2 TÍNH TOÁN VÀ THIẾT KẾ CHI TIẾT HỆ THỐNG ........................................... 49
3.2.1 Thiết kế sơ đồ khối hệ thống ........................................................................................ 49
3.2.2 Tính toán và thiết kế mạch ........................................................................................... 51
3.2.2.1 Cảm biến vân tay ................................................................................................................. 51
3.2.2.2 Bàn phím ma trận 4x4 ......................................................................................................... 54
3.2.2.3 Khối hiển thị ........................................................................................................................ 56
3.2.2.4 Kit Wifi ESP8266 ............................................................................................................... 58
3.2.2.5 Khối xử lý trung tâm Arduino ............................................................................................. 59
3.2.3 Sơ đồ nguyên lý của hệ thống ...................................................................................... 63
CHƯƠNG 4. THI CÔNG HỆ THỐNG .............................................................. 66
4.1 GIỚI THIỆU ............................................................................................................ 66
vii
4.2 THI CÔNG MÔ HÌNH ............................................................................................ 66
4.3 LƯU ĐỒ GIẢI THUẬT .......................................................................................... 69
4.4 PHẦN MỀM LẬP TRÌNH ...................................................................................... 75
4.4.1. Lập trình giao diện Web .............................................................................................. 81
4.4.1.1. Lập trình giao tiếp Web socket .......................................................................................... 81
4.4.1.2. Giao diện HTML ................................................................................................................ 83
CHƯƠNG 5. KẾT QUẢ_NHẬN XÉT_ĐÁNH GIÁ.......................................... 87
5.1 GIỚI THIỆU ............................................................................................................ 87
5.2 KẾT QUẢ ĐẠT ĐƯỢC .......................................................................................... 87
5.2.1 Sử dụng cảm biến ......................................................................................................... 87
5.2.2 Sử dụng Arduino Uno R3 ............................................................................................. 87
5.2.3 Đưa dữ liệu lên Server dùng ESP8266 NodeMCU. ..................................................... 87
5.3 KẾT QUẢ THỰC NGHIỆM ................................................................................... 87
5.4 NHẬN XÉT_ĐÁNH GIÁ ....................................................................................... 93
5.4.1 Nhận xét ........................................................................................................................ 93
5.4.2 Đánh giá ........................................................................................................................ 93
CHƯƠNG 6. KẾT LUẬN VÀ HƯỚNG PHÁT TRIẾN ................................... 94
6.1 KẾT LUẬN.............................................................................................................. 94
6.2 HƯỚNG PHÁT TRIỂN .......................................................................................... 94
TÀI LIỆU THAM KHẢO .................................................................................... 95
PHỤ LỤC ............................................................................................................... 96
viii
DANH SÁCH HÌNH ẢNH
Chương 2
Hình 2. 1: Căn hộ HomeStay .............................................................................................. 4
Hình 2. 2: Arduino Uno R3 ................................................................................................. 8
Hình 2. 3: Các khối cơ bản trên Arduino ............................................................................ 9
Hình 2. 4: Các chân tín hiệu của Arduino ......................................................................... 11
Hình 2. 5: Các chức năng cơ bản của IDE ........................................................................ 13
Hình 2. 6: Quá trình chụp ảnh của máy quét quang học ................................................... 14
Hình 2. 7: Máy quét điện dung sử dụng các tụ điện ......................................................... 15
Hình 2. 8: Quét siêu âm ..................................................................................................... 16
Hình 2. 9: Cảm biến vân tay R305 .................................................................................... 16
Hình 2. 10: Các chân giao tiếp .......................................................................................... 17
Hình 2. 11: Mạng LAN không dây ................................................................................... 19
Hình 2. 12: Mạng không dây diện rộng ............................................................................ 20
Hình 2. 13: Kit RF thu phát WIFI ESP8266 NodeMCU LUA CP2102 ........................... 21
Hình 2. 14: Kit RF thu phát WIFI ESP8266 NodeMCU LUA V3 CH340 ...................... 21
Hình 2. 15: Mạch thu phát Wifi ESP8266 UART ESP-01 ............................................... 22
Hình 2. 16: Sơ đồ chân ESP8266 ...................................................................................... 23
Hình 2.17: : Bàn phím ma trận 4x4 ................................................................................... 24
Hình 2. 18: Adapter 12V-1.5A .......................................................................................... 25
Hình 2. 19: : Sơ đồ nguyên lý hoạt động mạch hạ áp ....................................................... 26
Hình 2. 20: Mạch hạ áp DC-DC ASM1117 ...................................................................... 26
Hình 2. 21: Module LCD 16x2 ......................................................................................... 27
Hình 2. 22: Module I2C .................................................................................................... 28
Hình 2. 23: Định dạng chuỗi dữ liệu ................................................................................. 30
Hình 2. 24: Truyền đơn công ............................................................................................ 30
Hình 2. 25: Truyền bán song công .................................................................................... 31
Hình 2. 26: Truyền song công ........................................................................................... 31
Hình 2. 27: Khung truyền dữ liệu bất đồng bộ ................................................................. 32
Hình 2. 28: Khung truyền dữ liệu đồng bộ ....................................................................... 33
Hình 2. 29: Bus I2C và các thiết bị ngoại vi ..................................................................... 34
Hình 2. 30: Hướng đi của xung Clock và hướng đi của đường dữ liệu ............................ 35
Hình 2. 31: Trình tự truyền bit .......................................................................................... 36
Hình 2. 32: Start bit và Stop bit......................................................................................... 36
Hình 2. 33: Giới thiệu về IoT ............................................................................................ 37
Hình 2. 34: Hoạt động của mô hình IoT ........................................................................... 38
Hình 2. 35: Biểu tượng của PostgreSQL........................................................................... 43
Hình 2. 36: Logo của Heroku ............................................................................................ 47
ix
Chương 3
Hình 3. 1: Sơ đồ khối thu .................................................................................................. 49
Hình 3. 2: Sơ đồ khối phát ................................................................................................ 50
Hình 3. 3: Hình ảnh thực tế của cảm biến R305 ............................................................... 51
Hình 3. 4: Sơ đồ nối chân của cảm biến R305 .................................................................. 52
Hình 3. 5: Hình ảnh thực tế của bàn phím ma trận 4x4 .................................................... 54
Hình 3. 6: Hình ảnh thực tế của bàn phím ma trận 4x4 .................................................... 55
Hình 3. 7: Hình ảnh LCD 16x2 ......................................................................................... 56
Hình 3. 8: Module ESP8266 NodeMCU Lua CP2102 ..................................................... 58
Hình 3. 9: Sơ đồ chân Module ESP8266 NodeMCU Lua CP2102 .................................. 59
Hình 3. 10: Arduino Uno R3 ............................................................................................. 60
Hình 3. 11: Sơ đồ kết nối chân của Arduino Uno R3 ....................................................... 62
Hình 3. 12: Sơ đồ nguyên lý khối thu thập dữ liệu ........................................................... 63
Hình 3. 13: Mô hình giao tiếp của hệ thống ...................................................................... 65
Chương 4
Hình 4. 1: Giấy Foam ........................................................................................................ 66
Hình 4. 2: Bên ngoài mô hình ........................................................................................... 67
Hình 4. 3: Bên trong mô hình............................................................................................ 67
Hình 4. 4: Mặt trước của mô hình ..................................................................................... 68
Hình 4. 5: Lưu đồ chương trình của toàn hệ thống ........................................................... 69
Hình 4. 6: Lưu đồ giải thuật của Arduino ......................................................................... 70
Hình 4. 7: Lưu đồ chương trình của ESP8266 .................................................................. 71
Hình 4. 8: Lưu đồ chương trình của Server ...................................................................... 74
Hình 4. 9: Download Arduino IDE ................................................................................... 76
Hình 4. 10: Giải nén gói Arduino IDE .............................................................................. 77
Hình 4. 11: Màn hình khởi động Arduino IDE ................................................................. 78
Hình 4. 12: Cài đặt Driver cho Arduino IDE .................................................................... 79
Hình 4. 13: Quá trình đợi install ....................................................................................... 79
Hình 4. 14: Cài đặt thành công và kết thúc ....................................................................... 80
Hình 4. 15: Giao diện lập trình Arduino IDE ................................................................... 80
Hình 4. 16: Cài đặt Web socket ........................................................................................ 82
Hình 4. 17: Tạo kết nối với Web Socket ........................................................................... 82
Hình 4. 18: Tạo kết nối với Web Socket ........................................................................... 83
Hình 4. 19: Giao diện để đăng nhập vào đặt phòng .......................................................... 83
Hình 4. 20: Đăng nhập thành công.................................................................................... 84
Hình 4. 21: Nhập thông tin để cấp mã .............................................................................. 84
Hình 4. 22: Thông báo cấp mã thành công ....................................................................... 85
Hình 4. 23: Kiểm tra danh sách mã đã cấp ....................................................................... 85
Hình 4. 24: Kiểm tra trạng thái các phòng ........................................................................ 86
x
Chương 5
Hình 5. 1: Hệ thống đang hoạt động ................................................................................. 88
Hình 5. 2: Nhập dữ liệu để cấp mã .................................................................................... 89
Hình 5. 3: Nhận được mã cung cấp ................................................................................... 89
Hình 5. 4: Yêu cầu nhập mã ban đầu ................................................................................ 90
Hình 5. 5: Sau khi nhập mã thành công ............................................................................ 90
Hình 5. 6: Dữ liệu được lưu trên Server............................................................................ 91
Hình 5. 7: Kiểm tra dữ liệu ở webserver ........................................................................... 91
Hình 5. 8: Kiểm tra dữ liệu ở webapp ............................................................................... 92
Hình 5. 9: Xuất dữ liệu ra file excel .................................................................................. 92
xi
DANH SÁCH BẢN VẼ
Chương 2
Bảng 2. 1: Các chế độ boot up của ESP ............................................................................ 20
Chương 3
Bảng 3. 1: Thông số kỹ thuật của cảm biến R305 ............................................................ 52
Bảng 3. 2: Các chân giao tiếp của cảm biến R305 ............................................................ 53
Bảng 3. 3: Chức năng các chân của LCD 16x2 ................................................................ 57
Bảng 3. 4: Danh sách linh kiện sử dụng nguồn 5v ........................................................... 64
Bảng 3. 5: Danh sách linh kiện sử dụng nguồn 3.3v ........................................................ 64
Chương 4
Bảng 4.1: Danh sách nút lệnh của Arduino IDE
xii
TÓM TẮT
Cuộc sống ngày càng hiện đại, mức sống ngày càng tăng cao khiến cho nhu cầu du lịch,
nghỉ ngơi cũng theo đó mà được chú trọng. Nhu cầu của du khách ngày một đa dạng khiến
lĩnh vực du lịch phải không ngừng đổi mới, tạo ra nhiều loại hình, lưu trú mới để đáp ứng
nhu cầu của khách và tăng sức cạnh tranh. Trong đó, du lịch Homestay, AirBNB là loại
hình khá mới mẻ và đang là xu thế được nhiều người lựa chọn hiện nay.
Đối với loại hình du lịch mới này, việc quản lý mô hình vẫn còn gặp khó khăn (giờ
ra/vào của khách, cân bằng giữa ngân sách và nhân sự, cạnh tranh trên thị trường, ). Với
mục tiêu là hệ thống sẽ hỗ trợ các nhà đầu tư về công việc quản lý thông tin ra/vào của
khách dễ dàng hơn, quản lý mô hình hoạt động đơn giản hơn, có thể giảm bớt nhân công
để cân bằng tài chính hơn.
Nhóm sẽ thực hiện hệ thống thông qua việc tích lũy kiến thức được học tại trường cũng
như quan sát và nghiên cứu thực tiễn. Tất cả vì mục đích hoàn thành được mô hình dễ lắp
đặt, dễ sử dụng, tiết kiệm điện, mang lại cho người dùng cảm giác tin cậy và an toàn.
xiii
CHƯƠNG 1. TỔNG QUAN
CHƯƠNG 1. TỔNG QUAN
1.1 ĐẶT VẤN ĐỀ
Cuộc sống ngày càng hiện đại, mức sống ngày càng tăng cao khiến cho nhu cầu du lịch,
nghỉ ngơi cũng theo đó mà được chú trọng. Nhu cầu của du khách ngày một đa dạng khiến
lĩnh vực du lịch phải không ngừng đổi mới, tạo ra nhiều loại hình, lưu trú mới để đáp ứng
nhu cầu của khách và tăng sức cạnh tranh. Trong đó, du lịch Homestay, AirBNB là loại
hình khá mới mẻ và đang là xu thế được nhiều người lựa chọn hiện nay. Không những vậy,
xu hướng này còn dần được áp dụng phổ biến trong ngành Nhà hàng – Khách sạn. Đây
cũng là tiền đề để Airbnb, Homestay ra đời.
Airbnb, Homestay là những loại hình lưu trú phổ biến hiện nay. Sự khác biệt trong kiến
trúc, dịch vụ cung cấp, trải nghiệm ở từng loại hình giúp du khách dễ dàng lựa chọn nơi
nghỉ dưỡng phù hợp với nhu cầu.
Tuy nhiên, đây là mô hình mới, vì vậy người chủ nhà cho thuê có thể gặp một số khó
khăn trong việc quản lý căn hộ, tình hình an ninh của căn hộ và sự an toàn của khách hàng.
Một số vấn đề khó khăn khi quản lý mô hình này:
• Có airbnb, homestay tại nhiều tỉnh thành và chúng ta gặp vấn đề về việc kiểm soát
khách ra vào.
• Cảm thấy bất tiện mỗi khi khách yêu cầu giao chìa khóa vào ban đêm
• Tốn quá nhiều thời gian, công sức để quản lý hệ thống kinh doanh Airbnb,
Homestay.
• Hệ thống Airbnb, Homestay rải khắp tại các thành phố lớn mà không quản lý được
chặt chẽ, thất thoát doanh thu.
Giải pháp giúp thay đổi cách thức quản lý Airbnb, Homestay đó chính là sử dụng hệ
thống khóa cửa IoT. Với giải pháp này, khách hàng chỉ có thể vào được phòng khi có key
(mã PIN) do phần mềm tạo ra. Để tạo key cho khách hàng, lễ tân bắt buộc phải nhập thông
tin lên phần mềm. Do đó, rất khó để gian lận. Đây không chỉ là giải pháp giúp chống thất
thoát doanh thu hiệu quả mà nó còn mang lại hình ảnh chuyên nghiệp cho Airbnb,
Homestay của chúng ta trong mắt khách hàng (đặc biệt là những du khách nước ngoài).
Ngoài ra, để quản lý chặt chẽ hơn, có thể sử dụng thêm một ứng dụng di động đã được
kết nối với phần mềm quản lý. Với ứng dụng này, mọi giao dịch từ homestay sẽ được thông
báo về điện thoại di động. Đây là một giải pháp quản lý homestay từ xa rất hiệu quả.
1.2 MỤC TIÊU
• Tạo mã khóa ngẫu nhiên để cung cấp cho khách hàng
1
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 1. TỔNG QUAN
• Gửi cho khách hàng qua email và điện thoại
• Kết nối wi-fi cho hệ thống và đưa dữ liệu lên Server.
• Điều khiển mở khóa bằng mã khóa đã tạo hoặc bằng vân tay.
• Giám sát điều khiển thông qua webapp
• Có thể xuất dữ liệu thành các file .excel để quản lý
1.3 NỘI DUNG NGHIÊN CỨU
• Xác định mục tiêu và giới hạn đề tài.
• Tìm hiểu cơ sở lý thuyết.
• Thiết kế khối cảm biến, khối hiển thị, khối đưa dữ liệu lên server, thiết kế cách hoạt
động mô hình quản lý.
• Thiết kế và thi công bộ xử lí.
• Viết code cho Arduino Uno R3.
• Viết code cho ESP8266 NodeMCU.
• Tạo tài khoản và server để liên kết và đưa dữ liệu lên.
• Lập trình webapp
• Thiết kế mô hình
• Lắp ráp các board mạch, cảm biến vào mô hình.
• Chỉnh sửa các lỗi điều khiển, lỗi lập trình và lỗi của các thiết bị.
• Chạy thử nghiệm hệ thống.
• Cân chỉnh hệ thống
• Viết sách luận văn.
• Báo cáo đề tài tốt nghiệp.
1.4 GIỚI HẠN
• Số lượng phòng mô hình: 3.
• Hệ thống chỉ ở mức độ giám sát và điều khiển từ xa.
• Mô hình được thiết kế vệ với chất liệu: bìa cứng.
1.5 BỐ CỤC
Với đề tài: “Thiết kế và thi công hệ thống quản lý mô hình AirBNB, Homestay” thì bố
cục đồ án như sau:
• Chương 1: Tổng Quan.
Chương này trình bày đặt vấn đề dẫn nhập lý do chọn đề tài, mục tiêu của đề tài, nội
dung nghiên cứu, các giới hạn thông số và bố cục đề tài.
• Chương 2: Cơ Sở Lý Thuyết.
Chương này trình bày giới thiệu phần cứng của hệ thống điều khiển, các chuẩn giao
tiếp trong quá trình truyền – nhận dữ liệu.
2
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯ...1= R2= R3= R4=1: vậy kết luận không có nút được
bấm trên C4.
Quét tương tự đối với những nút bấm khác.
24
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
2.7 NGUỒN CUNG CẤP
2.7.1 Bộ chuyển đổi adapter
❖ Khái niệm
Adapter là bộ phận chuyển đổi điện áp giữa các thiết bị điện tử sử dụng nguồn điện
khác 220V xuống một điện áp thấp hơn. Thiết bị chuyển đổi này được gọi chung là Adapter.
❖ Chức năng chính của Adapter
• Cung cấp nguồn điện thích hợp cho các thiết bị điện tử hoạt động ổn định.
• Ngoài cung cấp nguồn điện Adapter còn có thể sạc pin cho thiết bị điển hình nhất
là pin cho laptop.
Các thiết bị nhỏ hơn như smarphone, camera quan sát thì các adapter có công suất 1,5A,
3,5A là đủ.
❖ Các thông số kỹ thuật của Adapter
• Điện áp
Đây là điện áp là thiết bị cần để sử dụng ổn định. Từ nguồn điện cao áp chuẩn (AC) sẽ
được biến đổi thành điện áp thấp hơn (DV) để nạp vào pin hoặc cung cấp trực tiếp cho thiết
bị hoạt động.
• Cường độ dòng điện
Thông số này được đo bằng đơn vị Ampe(A) thể hiện sức mạnh của dòng điện để thiết
bị hoạt động. Một thiết bị có ghi 4,5A có nghĩa dòng điện đầu vào phải có cường độ đủ
4,5A thì mới đáp ứng được. Cường độ dòng điện chuẩn của nguồn 220V thường là 12A
các thiết bị sử dụng adapter phải có cường độ thấp hơn con số này.
Hình 2. 18: Adapter 12V-1.5A
25
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
2.7.2 Bộ chuyển đổi nguồn DC- DC
Mạch hạ áp ASM1117
Mạch hạ áp ASM1117 là bộ chuyển đổi nguồn DC-DC có điện áp đầu ra nhỏ hơn điện
áp đầu vào.
Hình 2. 19: : Sơ đồ nguyên lý hoạt động mạch hạ áp
Khi khóa ở trên đóng, điện áp trên cuộn dây là VL = Vi - Vo. Dòng chạy trong cuộn dây
tắng tuyến tính. Khi diode có điện áp ngược bởi nguồn V, không có dòng qua nó.
Khi khóa mở, diode bị phân cực ngược. Điện áp cuộn dây là VL = -Vo. Dòng IL giảm.
Hình 2. 20: Mạch hạ áp DC-DC ASM1117
Mạch cấp nguồn 3.3VDC ASM1117 được sử dụng để tạo điện áp 3.3VDC / 800mA
cấp cho mạch điện với đầu vào linh hoạt từ 4.5~9VDC, thường được sử dụng với các mạch
module ESP8266, vi điều khiển sử dụng điện áp 3.3VDC,...
26
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
❖ Thông sô kỹ thuật:
• Điện áp vào : 4.5~9VDC.
• Điện áp ra: 3.3VDC, 800mA (Dòng điện thực tế có thể vượt hơn 800mA).
• Kích thước: 25 x 11 mm.
2.8 MODULE LCD 16x2
Màn hình LCD (Liquid Crystal Display) là một module hiển thị điện tử và tìm thấy một
loạt các ứng dụng. Màn hình LCD 16x2 là module rất cơ bản và thường được sử dụng trong
các thiết bị và mạch khác nhau. Các module này được ưu tiên hơn bảy phân đoạn và các
LED đa phân đoạn khác. Lý do là: LCD là kinh tế; dễ dàng lập trình; không có giới hạn
hiển thị các ký tự đặc biệt và thậm chí tùy chỉnh (không giống như trong bảy phân đoạn),
hoạt ảnh và v.v.
Màn hình LCD 16x2 có nghĩa là nó có thể hiển thị 16 ký tự trên mỗi dòng và có 2 dòng
như vậy. Trong màn hình LCD, mỗi ký tự được hiển thị bằng ma trận pixel 5x7. Màn hình
LCD này có hai thanh ghi, cụ thể là Command và Data.
Thanh ghi lệnh lưu trữ các lệnh chỉ thị cho màn hình LCD. Một lệnh là một lệnh cho
LCD để thực hiện một tác vụ được xác định trước như khởi tạo nó, xóa màn hình, thiết lập
vị trí con trỏ, điều khiển hiển thị, Thanh ghi dữ liệu lưu trữ dữ liệu được hiển thị trên
màn hình LCD. Dữ liệu là giá trị ASCII của ký tự được hiển thị trên màn hình LCD.
Hình 2. 21: Module LCD 16x2
27
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
❖ Thông số kỹ thuật:
• VSS: tương đương với GND - cực âm
• VDD: tương đương với VCC - cực dương (5V)
• Constrast Voltage (Vo): điều khiển độ sáng màn hình
• Register Select (RS): điều khiển địa chỉ nào sẽ được ghi dữ liệu
• Read/Write (RW): đọc (read mode) hay ghi (write mode) dữ liệu, nó sẽ phụ thuộc
vào việc chúng ta gửi giá trị gì vào.
• Enable pin: Cho phép ghi vào LCD
• D0 - D7: 8 chân dư liệu, mỗi chân sẽ có giá trị HIGH hoặc LOW nếu bạn đang ở
chế độ đọc (read mode) và nó sẽ nhận giá trị HIGH hoặc LOW nếu đang ở chế độ
ghi (write mode)
• Backlight (Backlight Anode (+) và Backlight Cathode (-)): Tắt bật đèn màn hình
LCD.
2.9 MODULE I2C
Hình 2. 22: Module I2C
LCD có quá nhiều chân gây khó khăn trong quá trình kết nối và chiếm dụng nhiều chân
của vi điều khiển. Module chuyển đổi I2C cho LCD sẽ giải quyết vấn đề này, thay vì sử
dụng tối thiểu 6 chân của vi điều khiển để kết nối với LCD (RS, EN, D7, D6, D5 và D4)
thì với module chuyển đổi bạn chỉ cần sử dụng 2 chân (SCL, SDA) để kết nối. Module
chuyển đổi I2C hỗ trợ các loại LCD sử dụng driver HD44780(LCD 1602, LCD 2004, ),
kết nối với vi điều khiển thông qua giao tiếp I2C, tương thích với hầu hết các vi điều khiển
hiện nay.
❖ Ưu điểm:
• Tiết kiệm chân cho vi điều khiển
28
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
• Dễ dàng kết nối với LCD
❖ Thông số kỹ thuật:
• Điện áp hoạt động: 2.5-6V DC
• Hỗ trợ màn hình: LCD1602,1604,2004 (driver HD44780)
• Giao tiếp: I2C
• Địa chỉ mặc định: 0X27 (có thể điều chỉnh bằng ngắn mạch chân A0/A1/A2)
• Kích thước: 41.5mm(L)x19mm(W)x15.3mm(H)
• Trọng lượng: 5g
• Tích hợp Jump chốt để cung cấp đèn cho LCD hoặc ngắt
• Tích hợp biến trở xoay điều chỉnh độ tương phản cho LCD
2.10 CÁC CHUẨN GIAO TIẾP
2.10.1 Giao tiếp uart
Các tên đầy đủ UART là “Universal Asynchronous Receiver/Transmitter”, và nó là một
vi mạch sẵn có trong một vi điều khiển nhưng không giống như một giao thức truyền thông
(I2C & SPI). Chức năng chính của UART là truyền dữ liệu nối tiếp. Trong UART, giao
tiếp giữa hai thiết bị có thể được thực hiện theo hai cách là giao tiếp dữ liệu nối tiếp và giao
tiếp dữ liệu song song.
Các máy tính/vi điều khiển thường truyền tín hiệu theo hai cách: Song song và nối tiếp.
Trong kênh truyền song song, khi truyền một gói dữ liệu n-bit thì ta cần n đường truyền,
mỗi bit trong gói dữ liệu sẽ đi trên một đường truyền. Trong kênh truyền nối tiếp, ta chỉ
cần một đường truyền để truyền tuần tự n bit của gói dữ liệu. Như vậy, để truyền một gói
dữ liệu trong kênh truyền song song ta tốn một khoản thời gian tbit, trong kênh truyền nối
tiếp để truyền n bit ta tốn khoản thời gian n*tbit.
29
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
Hình 2. 23: Định dạng chuỗi dữ liệu
❖ Các loại kênh truyền dữ liệu nối tiếp:
Các kênh truyền được gọi là simplex (đơn công), hay half duplex(bán song công), hay
full duplex (song công) tùy thuộc vào kiểu mà mình kết nối.
• Kênh truyền nối tiếp simplex chỉ truyền được theo một hướng duy nhất trên một
đường truyền xác định.
Hình 2. 24: Truyền đơn công
• Kênh truyền nối tiếp half –duplex chỉ có một trường truyền nhưng dữ liệu có thể
truyền theo 2 hướng, tuy nhiên trong một lúc, dữ liệu chỉ đi được theo 1 hướng.
30
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
Hình 2. 25: Truyền bán song công
• Kênh truyền nối tiếp full – duplex có 2 đường truyền dữ liệu riêng biệt, một đường
truyền và một đường nhận, cho phép dữ liệu truyền nhận theo 2 hướng cùng lúc.
Hình 2. 26: Truyền song công
❖ Đồng bộ dữ liệu trong các kênh truyền nối tiếp
• Tất cả các kênh truyền nối tiếp đều yêu cầu tín hiệu clock nhằm thiết lập tốc độ tín
hiệu truyền nhận dữ liệu giữa các bên cho khớp với nhau. Tùy thuộc vào cách sử dụng
tín hiệu clock như thế nào mà chúng ta có định nghĩa về kênh truyền đồng bộ hay kênh
truyền không đồng bộ.
• Kênh truyền không đồng bộ sử dụng bộ tạo tín hiệu clock độc lập ở mỗi thiết bị, dữ
liệu được truyền theo một khung truyền và tốc độ baud được thống nhất bởi bên truyền
và bên nhận. Còn đối với kênh truyền đồng bộ sẽ có những tín hiệu clock được truyền
đồng thời với dữ liệu trên một đường truyền nối giữa hai thiết bị.
❖ Khung truyền và một số khái niệm, thuật ngữ
Khung truyền dữ liệu (data frame)
• Dữ liệu đi vào ở đầu thu của đường dữ liệu trong truyền dữ liệu nối tiếp là một dãy
các số 0 và 1, và rất khó để hiểu được ý nghĩa của các dữ liệu ấy nếu bên phát và
bên thu không cùng thống nhất về một tập các luật, một thủ tục, về cách dữ liệu
được đóng gói, bao nhiêu bit tạo nên một ký tự và khi nào dữ liệu bắt đầu và kết
thúc. Bên cạnh tốc độ baud, khung truyền là một yếu tố quan trọng tạo nên sự thành
công khi truyền và nhận. Khung truyền bao gồm các quy định về số bit trong mỗi
lần truyền, các bit “báo” như bit Start và bit Stop, các bit kiểm tra như Parity, ngoài
ra số lượng các bit trong một data hay thứ tự truyền các bit trên đường truyền cũng
31
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
được quy định bởi khung truyền. Hình ảnh cấu trúc dữ liệu trong truyền thông nối
tiếp bất đồng bộ:
Hình 2. 27: Khung truyền dữ liệu bất đồng bộ
• Start là bit đầu tiên được truyền trong một frame truyền, bit này có chức năng báo
cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền tới. Start là bit bắt
buộc phải có trong khung truyền, và nó là một bit thấp (0).
• Data hay dữ liệu cần truyền là thông tin chính mà chúng ta cần gởi và nhận. Số
lượng bit data tùy thuộc vào các loại vi điều khiển khác nhau, thường thì data có 8
bit. Trong truyền thông nối tiếp UART, bit có trọng số nhỏ nhất (LSB – Least
Significant Bit, bit bên phải) của data sẽ được truyền trước và cuối cùng là bit có
trọng số lớn nhất (MSB – Most Significant Bit, bit bên trái). Tuy nhiên thứ tự truyền
này có thể được cài đặt bởi người dùng.
• Parity là bit dùng để kiểm tra dữ liệu truyền có đúng không (một cách tương đối).
Có 2 loại parity là parity chẵn (even parity) và parity lẻ (odd parity). Parity chẵn
nghĩa là số lượng số “1” trong dữ liệu bao gồm bit parity luôn là số chẵn. Ngược lại
tổng số lượng các số “1” trong parity lẻ luôn là số lẻ.
Thí dụ: nếu dữ liệu của bạn là 10111011 nhị phân, có tất cả 6 bit có giá trị “1” trong
dữ liệu này, nếu quy định parity chẵn được dùng, bit parity sẽ mang giá trị 0 để đảm
bảo tổng các số “1” là số chẵn (6 số 1). Nếu parity lẻ được yêu cầu thì giá trị của parity
bit là 1. Sau khi truyền chuỗi dữ liệu kèm theo cả bit parity trên, bên nhận thu được và
kiểm tra lại tổng số số “1” (bao gồm cả bit parity), nếu vi phạm quy định parity đã đặt
trước thì ta khẳng định là dữ liệu nhận được là sai, còn nếu không vi phạm thì cũng
không khẳng định được điều gì (mang tính tương đối).
Parity bit không phải là bit bắt buộc và vì thế chúng ta có thể loại bit này khỏi
khung truyền.
• Stop bits là 01 hoặc nhiều bit báo cho thiết bị nhận rằng một gói dữ liệu đã được
gởi xong. Sau khi nhận được stop bits, thiết bị nhận sẽ tiến hành kiểm tra khung
truyền để đảm bảo tính chính xác của dữ liệu. Stop bits là các bit bắt buộc xuất hiện
trong khung truyền.
32
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
Ví dụ về gói dữ liệu 0x7B với lựa chọn kiểm tra bít chẵn:
Hình 2. 28: Khung truyền dữ liệu đồng bộ
Tốc độ bit và tốc độ baud
• Có hai thuật ngữ thường dùng trong truyền số liệu là tốc độ bit (bit rate) và tốc độ
baud (baud rate) thường bị nhầm lẫn. Tốc độ bit là số bit được truyền trong một
giây, Tốc độ baud là số đơn vị tín hiệu trong một giây cần có để biểu diễn số bit vừa
nêu. Khi nói về hiệu quả của máy tính, thì tốc độ bit luôn là yếu tố quan trọng. Tuy
nhiên, trong truyền số liệu ta lại cần quan tâm đến hiệu quả truyền dẫn dữ liệu từ
nơi này đến nơi khác, như thế khi dùng ít đơn vị tín hiệu cần có, thì hiệu quả càng
cao, và băng thông truyền càng thấp; như thế thì cần chú ý đến tốc độ baud. Tốc độ
baud xác định băng thông cần thiết để truyền tín hiệu. Tốc độ bit là tốc độ baud nhân
với số bit trong mỗi đơn vị tín hiệu. Tốc độ baud chia cho số bit biểu diễn trong mỗi
đơn vị truyền.
Tốc độ bit là số bit trong mỗi giây.
Tốc độ baud là số đơn vị tín hiệu trong mỗi giây.
Tốc độ baud thường bé hơn hay bằng tốc độ bit.
• Một ý niệm tương đồng có thể giúp hiểu rõ vấn đề này, baud tương tư như xe khách,
còn bit tương tự như số hành khách. Một chuyến xe mang một hoặc nhiều hành
khách. Nếu 1000 xe di chuyển từ điểm này sang điểm khác chỉ mang một hành
khách (thí dụ lái xe) thì mang được 1000 hành khách. Tuy nhiên, với số xe này, mỗi
xe mang 4 người, thì ta vận chuyển được 4000 hành khách. Chú ý là chính số xe,
chứ không phải số hành khách, là đơn vị lưu thông trên đường, tức là tạo nhu cầu
về độ rộng của xa lộ. Nói cách khác, tốc độ baud xác định băng thông cần thiết, chứ
không phải số bit.
Thí dụ 1:
Một tín hiệu analog mang 4 bit trong mỗi phần tử tín hiệu. Nếu 1000 phần tử tín hiệu
được gởi trong một giây, xác định tốc độ baud và tốc độ bit.
33
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
Giải:
Tốc độ baud = số đơn vị tín hiệu = 1000 baud/giây
Tốc độ bit = tốc độ baud x số bit trong một đơn vị tín hiệu =1000 x 4 = 4000 bps.
Thí dụ 2:
Tốc độ bit của tín hiệu là 3000. Nếu mỗi phần tử tín hiệu mang 6 bit, cho biết tốc độ
baud?
Giải:
Tốc độ baud = tốc độ bit/ số bit trong mỗi phần tử tín hiệu = 3000/6 =500 baud/giây
2.10.2 Giao tiếp I2C
I2C là tên viết tắt của cụm từ Inter-Intergrated Circuit. Đây là đường Bus giao tiếp giữa
các IC với nhau.
I2C mặc dù được phát triển bới Philips, nhưng nó đã được rất nhiều nhà sản xuất IC
trên thế giới sử dụng. Bus I2C được sử dụng làm bus giao tiếp ngoại vi cho rất nhiều loại
IC khác nhau như các loại Vi điều khiển 8051, PIC, AVR, ARM... chip nhớ như: RAM
tĩnh (Static Ram), EEPROM, bộ chuyển đổi tương tự số (ADC), số tương tự (DAC), IC
điểu khiển LCD, LED...
Hình 2. 29: Bus I2C và các thiết bị ngoại vi
Đặc điểm giao tiếp của I2C
Một giao tiếp I2C gồm có 2 dây: Serial Data (SDA) và Serial Clock (SCL). SDA là
đường truyền dữ liệu 2 hướng, còn SCL là đường truyền xung đồng hồ để đồng bộ và chỉ
theo một hướng.
Mỗi dây SDA hãy SCL đều được nối với điện áp dương của nguồn cấp thông qua một
điện trở kéo lên (pullup resistor). Sự cần thiết của các điện trở kéo này là vì chân giao tiếp
34
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
I2C của các thiết bị ngoại vi thường là dạng cực máng hở (opendrain hay opencollector).
Giá trị của các điện trở này khác nhau tùy vào từng thiết bị và chuẩn giao tiếp, thường dao
động trong khoảng 1K đến 4.7k.
Một thiết bị hay một IC khi kết nối với bus I2C, ngoài một địa chỉ (duy nhất) để phân
biệt, nó còn được cấu hình là thiết bị đầu hay thiết bị cuối. Thiết bị đầu nắm vai trò tạo
xung đồng hồ cho toàn hệ thống, khi giữa hai thiết bị đầu – cuối giao tiếp thì thiết bị đầu
có nhiệm vụ tạo xung đồng hồ và quản lý địa chỉ của thiết bị cuối trong suốt quá trình giao
tiếp. Thiết bị đầu giữ vai trò chủ động, còn thiết bị cuối giữ vai trò bị động trong việc giao
tiếp.
Hình 2. 30: Hướng đi của xung Clock và hướng đi của đường dữ liệu
Chế độ hoạt động
Các bus I2C có thể hoạt động ở ba chế độ, hay nói cách khác các dữ liệu trên bus I2C
có thể được truyền trong ba chế độ khác nhau:
• Chế độ tiêu chuẩn: tốc độ truyền dữ liệu tối đa là 100Kpbs, sử dụng 7 bit địa chỉ và
112 địa chỉ tớ
• Chế độ nhanh: tốc độ truyền lên đến 400Kpbs
• Chế độ tốc độ cao: Chế độ này đã được tạo ra chủ yếu để tăng tốc độ dữ liệu lên đến
36 lần nhanh hơn so với chế độ tiêu chuẩn. Nó cung cấp 1,7 Mbps (với Cb = 400
pF), và 3.4Mbps (với C> b = 100pF).
Một bus I2C có thể hoạt động ở nhiều chế độ khác nhau:
• Một chủ một tớ (one master - one slave)
• Một chủ nhiều tớ (one master - multi slave)
• Nhiều chủ nhiều tớ (Multi master - Multi slave)
Thiết bị chủ xác định đúng địa chỉ của thiết bị tớ, cùng với việc xác định địa chỉ, thiết
bị chủ sẽ quyết định việc đọc hay ghi vào thiết bị tớ. Thiết bị chủ gửi dữ liệu tới thiết bị tớ.
Thiết bị tớ kết thúc quá trình truyền dữ liệu.
35
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
Trình tự truyền bit trên đường truyền
Hình 2. 31: Trình tự truyền bit
Thiết bị chủ tạo một điều kiện start. Điều kiện này thông báo cho tất cả các thiết bị tớ
lắng nghe dữ liệu trên đường truyền. Thiết bị chủ gởi địa chỉ của thiết bị tớ mà thiết bị chủ
muốn giao tiếp và cờ đọc/ghi dữ liệụ (nếu cờ thiết lập lên 1 byte tiếp theo được truyền từ
thiết bị tớ đến thiết bị chủ, nếu cờ thiết lập xuống 0 thì byte tiếp theo truyền từ thiết bị chủ
đến thiết bị tớ).
Khi thiết bị tớ trên bus I2C có địa chỉ đúng với địa chỉ mà thiết bị chủ gửi sẻ phản hồi
lại bằng một xung ACK.
Giao tiếp giữa thiết bị chủ và tớ trên bus dữ liệu bắt đầu. Cả chủ và tớ đều có thể nhận
hoặc truyền dữ liệu tùy thuộc vào việc truyền thông là đọc hay viết. Bộ truyền gửi 8 bit dữ
liệu tới bộ nhận, bộ nhận trả lời với một bit ACK.
Để kết thúc quá trình giao tiếp, thiết bị chủ tạo ra một điều kiện stop.
Điều kiện START và STOP
START và STOP là những điều kiện bắt buộc phải có khi một thiết bị chủ muốn thiết
lập giao tiếp với một thiết bị nào đó trên bus I2C. START là điều kiện khởi đầu, báo hiệu
bắt đầu của giao tiếp, còn STOP báo hiệu kết thúc một giao tiếp. Hình dưới đây mô tả điều
kiện START và STOP.
Hình 2. 32: Start bit và Stop bit
Ban đầu khi chưa thực hiện quá trình giao tiếp, cả hai đường SDA và SCL đều ở mức
cao (SDA = SCL = HIGH). Lúc này bus I2C được coi là rỗi (“bus free”), sẵn sàng cho một
giao tiếp. Hai điều kiện START và STOP là không thể thiếu trong việc giao tiếp giữa các
thiết bị I2C với nhau.
36
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
Điều kiện START: một sự chuyển đồi trạng thái từ cao xuống thấp trên đường SDA
trong khi đường SCL đang ở mức cao (cao = 1, thấp = 0) báo hiệu một điều kiện START
Đỉều kiện STOP: Một sự chuyển đổi trạng thái từ mức thấp lên cao trên đường SDA
trong khi đường SCL đang ở mức cao. Cả hai điều kiện START và STOP đều được tạo ra
bởi thiết bị chủ. Sau tín hiệu START, bus I2C coi như đang trong trạng thái làm việc (busy).
Bus I2C sẽ rỗi, sẵn sàng cho một giao tiếp mới sau tín hiệu STOP từ phía thiết bị chủ.
Sau khi có một điều kiện START, trong quá trình giao tiếp, khi có một tín hiệu START
được lặp lại thay vì một tín hiệu STOP thì bus I2C vẫn tiếp tục trong trạng thái bận. Tín
hiệu START và lặp lại START (Repeated START) đều có chức năng giống nhau là khởi
tạo một giao tiếp.
2.11 IoT
2.11.1 Giới thiệu về IoT
Hình 2. 33: Giới thiệu về IoT
IoT là khái niệm kết nối các thiết bị với nhau và với Internet. IoT là một mạng lưới
khổng lồ gồm các vật (things) và con người được kết nối - tất cả đều thu thập và chia sẻ dữ
liệu với nhau. Việc kết nối có thể thực hiện qua Wifi, ZigBee, Bluetooth
IoT là một kịch bản của thế giới, khi mà mỗi đồ vật, con người được cung cấp một định
danh của riêng mình, và tất cả có khả năng truyền tải, trao đổi thông tin, dữ liệu qua một
mạng duy nhất mà không cần đến sự tương tác trực tiếp giữa người với người, hay người
với máy tính. IoT đã phát triển từ sự hội tụ của công nghệ không dây, công nghệ vi cơ điện
37
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
tử và Internet. Nói đơn giản là một tập hợp các thiết bị có khả năng kết nối với nhau, với
Internet và với thế giới bên ngoài để thực hiện một công việc nào đó.
2.11.2 IoT hoạt động như thế nào
Hình 2. 34: Hoạt động của mô hình IoT
Các thiết bị được kết nối với nhau và cùng kết nối trong cùng một mạng. Con người có
thể giám sát, điều khiển thiết bị, thu thập dữ liệu ở bất cứ nơi nào và bất cứ thời điểm nào
thông qua IoT Platform.
Một IoT Platform cũng thường được coi là phần mềm trung gian IoT, trong đó nhấn
mạnh vai trò chức năng của nó như là một trung gian (middleware) giữa phần cứng và các
ứng dụng. Các IoT Platform có thể được tích hợp với hầu hết các thiết bị kết nối và các
ứng dụng mà thiết bị sử dụng.
Các cảm biến, các thiết bị đo,... gửi dữ liệu thu thập được lên IoT Platform. Sau đó IoT
platform sẽ thực hiện tích hợp dữ liệu nhận được và phân tích để chia sẻ thông tin với các
ứng dụng để giải quyết vấn đề.
2.11.3. Một số ứng dụng của IoT
IoT có rất nhiều ứng dụng trong các lĩnh vực đời sống khác nhau. Có thể kể ra bao gồm
từ lò vi sóng thông minh, tự động nấu thức ăn trong một khoảng thời gian thích hợp, cho
đến những chiếc xe tự lái, có cảm biến phức tạp phát hiện vật thể trên đường đi, đến các
38
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
thiết bị thể dục có thể đo được nhịp tim của con người và số bước đi đã thực hiện ngày
hôm đó, sau đó sử dụng thông tin đó để đề xuất các kế hoạch tập thể dục phù hợp.
2.11.4 Web socket
WebSocket là công nghệ hỗ trợ giao tiếp hai chiều giữa client và server bằng cách sử
dụng một TCP socket để tạo một kết nối hiệu quả và ít tốn kém. Mặc dù được thiết kế để
chuyên sử dụng cho các ứng dụng web, lập trình viên vẫn có thể đưa chúng vào bất kì loại
ứng dụng nào.
WebSocket mới xuất hiện trong HTML5, là một kỹ thuật Reverse Ajax. WebSockets
cho phép các kênh giao tiếp song song hai chiều và hiện đã được hỗ trợ trong nhiều trình
duyệt (Firefox, Google Chrome và Safari). Kết nối được mở thông qua một HTTP request
(yêu cầu HTTP), được gọi là liên kết WebSockets với những header đặc biệt. Kết nối được
duy trì để bạn có thể viết và nhận dữ liệu bằng JavaScript như khi bạn đang sử dụng một
TCP socket đơn thuần.
Dữ liệu truyền tải thông qua giao thức HTTP (thường dùng với kĩ thuật Ajax) chứa
nhiều dữ liệu không cần thiết trong phần header. Một header request/response của HTTP
có kích thước khoảng 871 byte, trong khi với WebSocket, kích thước này chỉ là 2 byte (sau
khi đã kết nối). Vậy giả sử bạn làm một ứng dụng game có thể tới 10,000 người chơi đăng
nhập cùng lúc, và mỗi giây họ sẽ gửi/nhận dữ liệu từ server. Hãy so sánh lượng dữ liệu
header mà giao thức HTTP và WebSocket trong mỗi giây:
HTTP: 871 x 10,000 = 8,710,000 bytes = 69,680,000 bits per second (66 Mbps)
WebSocket: 2 x 10,000 = 20,000 bytes = 160,000 bits per second (0.153 Kbps) Như
bạn thấy chỉ riêng phần header thôi cũng đã chiếm một phần lưu lượng đáng kể với giao
thức HTTP truyền thống.
❖ Giao thức bắt tay của WebSocket
Để thực hiện kết nối, client phải gửi một WebSocket handshake request đến server.
Server sẽ gửi trả lại WebSocket handshake response như bên dưới:
Client request:
GET /mychat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
39
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
Sec-WebSocket-Version: 13
Origin:
Server response:(Server Architecture)
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Để xác nhận việc kết nối, client sẽ gửi một giá trị Sec-WebSocket-Key được mã hóa
bằng Based64 đến server. Sau đó bên server sẽ thực hiện: – Nối thêm chuỗi cố định là
“258EAFA5-E914-47DA-95CA-C5AB0DC85B11″ vào Sec-WebSocket-Key để được
chuỗi mới là “x3JJHMbDL1EzLkh9GBhXDw==258EAFA5-E914-47DA-95CA-
C5AB0DC85B11″. – Thực hiện mã hóa SHA-1 chuỗi trên để được
“1d29ab734b0c9585240069a6e4e3e91b61da1969″. – Mã hóa kết quả vừa nhận được bằng
Base64 để được “HSmrc0sMlYUkAGmm5OPpG2HaGWk=”. – Gửi response lại client
kèm với giá trị Sec-WebSocket-Accept chính là chuỗi kết quả vừa tạo ra.
Client sẽ kiểm tra status code (phải bằng 101) và Sec-WebSocket-Accept xem có đúng
với kết quả mong đợi không và thực hiện kết nối.
❖ Ưu điểm
• WebSockets cung cấp khả năng giao tiếp hai chiều mạnh mẽ, có độ trễ thấp và dễ
xử lý lỗi. Không cần phải có nhiều kết nối như phương pháp Comet long-polling và
cũng không có những nhược điểm như Comet streaming.
• API cũng rất dễ sử dụng trực tiếp mà không cần bất kỳ các tầng bổ sung nào, so với
Comet, thường đòi hỏi một thư viện tốt để xử lý kết nối lại, thời gian chờ timeout,
các Ajax request (yêu cầu Ajax), các tin báo nhận và các dạng truyền tải tùy chọn
khác nhau (Ajax long-polling và jsonp polling).
❖ Nhược điểm
Những nhược điểm của WebSockets gồm có:
• Nó là một đặc tả mới của HTML5, nên nó vẫn chưa được tất cả các trình duyệt hỗ
trợ.
• Không có phạm vi yêu cầu nào. Do WebSocket là một TCP socket chứ không phải
là HTTP request, nên không dễ sử dụng các dịch vụ có phạm vi-yêu cầu, như
SessionInViewFilter của Hibernate. Hibernate là một framework kinh điển cung cấp
một bộ lọc xung quanh một HTTP request. Khi bắt đầu một request, nó sẽ thiết lập
một contest (chứa các transaction và liên kết JDBC) được ràng buộc với luồng
request. Khi request đó kết thúc, bộ lọc hủy bỏ contest này.
40
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
2.12. SERVER
2.12.1. Node JS
Node.js là một nền tảng chạy trên môi trường V8 JavaScript runtime - một trình thông
dịch JavaScript cực nhanh chạy trên trình duyệt Chrome. Chúng ta có thể tải bộ V8 và
nhúng nó vào bất cứ thứ gì, Node.js làm điều đó đối với các web server.
Trong một môi trường server điển hình LAMP (Linux-Apache-MySQL-PHP), bạn có
một web server là Apache hoặc NGINX nằm dưới, cùng với PHP chạy trên nó. Mỗi một
kết nối tới server sẽ sinh ra một thread mới, và điều này khiến ứng dụng nhanh chóng trở
nên chậm chạp hoặc quá tải - cách duy nhất để hỗ trợ nhiều người dùng hơn là bằng cách
bổ sung thêm nhiều máy chủ. Đơn giản là nó không có khả năng mở rộng tốt. Nhưng với
Node.js thì điều này không phải là vấn đề. Không có một máy chủ Apache lắng nghe các
kết nối tới và trả về mã trạng thái HTTP - bạn sẽ phải tự quản lý kiến trúc lõi của máy chủ
đó. May mắn thay, có một số module giúp thực hiện điều này được dễ dàng hơn, nhưng
công việc này vẫn gây cho chúng ta một chút khó khăn khi mới bắt đầu. Tuy nhiên, kết quả
thu được là một ứng dụng web có tốc độ thực thi cao.
JavaScript là một ngôn ngữ dựa trên sự kiện, vì vậy bất cứ thứ gì xảy ra trên server đều
tạo ra một sự kiện non-blocking. Mỗi kết nối mới sinh ra một sự kiện, dữ liệu nhận được
từ một upload form sinh ra một sự kiện data-received, việc truy vấn dữ liệu từ database
cũng sinh ra một sự kiện. Trong thực tế, điều này có nghĩa là một trang web Node.js sẽ
chẳng bao giờ bị khóa (lock up) và có thể hỗ trợ cho hàng chục nghìn user truy cập cùng
lúc. Node.js đóng vai trò của server - Apache - và thông dịch mã ứng dụng chạy trên nó.
Giống như Apache, có rất nhiều module (thư viện) có thể được cài đặt để bổ sung thêm các
đặc trưng và chức năng - như lưu trữ dữ liệu, hỗ trợ file Zip, đăng nhập bằng Facebook,
hoặc các cổng thanh toán. Dĩ nhiên, nó không có nhiều thư viện như PHP, nhưng Node.js
vẫn đang ở trong giai đoạn ban đầu và có một cộng đồng rất mạnh mẽ ở đằng sau nó.
Một khái niệm cốt lõi của Node.js đó là các function bất đồng bộ (asynchronous
functions) - vì vậy về cơ bản thì mọi thứ chạy trên nền tảng này. Với hầu hết các ngôn ngữ
kịch bản máy chủ, chương trình phải đợi mỗi function thực thi xong trước khi có thể tiếp
tục chạy tiếp. Với Node.js, chúng ta xác định các function sẽ chạy để hoàn thành một tác
vụ nào đó, trong khi phần còn lại của ứng dụng vẫn chạy đồng thời.
❖ Ưu điểm
• Đầu tiên là ưu điểm về tốc độ thực thi và khả năng mở rộng. Node.js có tốc độ rất
nhanh. Đó là một yêu cầu khá quan trọng khi chúng ta là một startup đang cố gắng
tạo ra một sản phẩm lớn và muốn đảm bảo có thể mở rộng nhanh chóng, đáp ứng
được một lượng lớn người dùng khi trang web của bạn phát triển lên.
• Node.js có thể xử lý hàng ngàn kết nối đồng thời.
41
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
❖ Nhược điểm
• Giống như hầu hết các công nghệ mới, việc triển khai Node.js trên host không phải
là điều dễ dàng. Nếu chúng ta có một web hosting xài chung, chúng ta không thể
đơn giản tải lên một ứng dụng Node.js và mong chờ nó hoạt động tốt. VPS và
dedicated server là một sự lựa chọn tốt hơn – chúng ta có thể cài đặt Node.js trên
chúng. Thậm chí dễ hơn là sử dụng một dịch vụ có khả năng mở rộng như là Heroku,
và ta có thể hoàn toàn an tâm để phát triển trang web của mình trên đó – chúng ta
chỉ cần trả tiền khi cần thêm nhiều tài nguyên hơn.
• Mặt khác, chúng ta rất dễ cài đặt Node.js chạy cục bộ trên máy tính của bạn sử dụng
các hệ điều hành như Windows, Mac hoặc Linux và bắt đầu phát triển ứng dụng
ngay lập tức - chỉ việc tải phiên bản Node.js tương ứng tại đây. Một điều quan trọng
nên chú ý là Node.js không chỉ đơn giản là một sự thay thế cho Apache - các ứng
dụng web đang tồn tại sẽ không có khả năng tương thích, và bạn ta làm việc hiệu
quả với những ứng dụng phát triển từ đầu (mặc dù có rất nhiều framework ngoài kia
để giúp đỡ bạn với nhiều đặc trưng phổ biến).
• Một nhược điểm lớn khác của Node.js đó là nó vẫn đang trong giai đoạn phát triển
ban đầu, điều này có nghĩa là một số đặc trưng sẽ thay đổi trong quá trình phát triển
tiếp theo. Trong thực tế, nếu ta đọc các tài liệu đi kèm, thì nó bao gồm một chỉ số
ổn định (stability index), chỉ số này cho thấy mức độ rủi ro khi bạn sử dụng các đặc
trưng hiện có.
2.12.2. Postgresql
PostgreSQL là một hệ thống quản trị cơ sở dữ liệu quan hệ-đối tượng (object-relational
database management system) có mục đích chung, hệ thống cơ sở dữ liệu mã nguồn mở
tiên tiến nhất hiện nay.
PostgreSQL được phát triển dựa trên POSTGRES 4.2 tại phòng khoa học máy tính
Berkeley, Đại học California.
PostgreSQL được thiết kế để chạy trên các nền tảng tương tự UNIX. Tuy nhiên,
PostgreSQL sau đó cũng được điều chỉnh linh động để có thể chạy được trên nhiều nền
tảng khác nhau như Mac OS X, Solaris và Windows.
PostgreSQL là một phầ...me()) {
console.log('Dat fail: ');
status = 0;
clone(socket, "ADD Fail");
break;
}
else if (checkendDay.getTime() >=
startSQL.getTime() && checkendDay.getTime() <= endSQL.getTime()) {
console.log('Dat fail: ');
status = 0;
clone(socket, "ADD Fail");
break;
}
else if (checkstartDay.getTime() <=
startSQL.getTime() && checkendDay.getTime() >= endSQL.getTime()) {
console.log('Dat fail: ');
status = 0;
clone(socket, "ADD Fail");
break;
}
console.log(info);
}
if (status == 1){
console.log('Request add thanh cong');
127
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
newQuery = "INSERT INTO customers
VALUES('name' ,'birth' ,'phone' ,'mail' ,'room' ,'startT14:00:00Z' ,'endT12:00:00Z'
,pass);";
newQuery = newQuery.replace("name",
stringInfo[1]);
newQuery = newQuery.replace("birth",
stringInfo[2]);
newQuery = newQuery.replace("phone",
stringInfo[3]);
newQuery = newQuery.replace("mail",
stringInfo[4]);
newQuery = newQuery.replace("room",
stringInfo[5]);
newQuery = newQuery.replace("start",
stringInfo[6]);
newQuery = newQuery.replace("end",
stringInfo[7]);
newQuery = newQuery.replace("pass",
stringInfo[8]);
client.query(newQuery , (err, res) => {
if (err) throw err;
});
send_Email(stringInfo[1], stringInfo[4],
stringInfo[5], stringInfo[6], stringInfo[7], stringInfo[8]);
send_SMS(stringInfo[1], stringInfo[3],
stringInfo[5], stringInfo[6], stringInfo[7], stringInfo[8]);
clone(socket, "ADD Done");
}
});
}
else{
clone(socket, "ADD Fail");
}
}
/* Request History */
128
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
if (stringInfo[0] == 'GET') {
console.log('Request History');
client.query("SELECT * FROM customers;" , (err, res) => {
if (err) throw err;
for (let row of res.rows) {
infoHistory = JSON.stringify(row);
infoHistory =
infoHistory.replace(/T00:00:00.000Z|name|birthday|phonenumber|{|}|email|room|
password|startdate|enddate|:|"|/g,'');
console.log(infoHistory);
clone(socket,"RES," + infoHistory);
}
});
}
/* Request History Room */
if (stringInfo[0] == 'HIS') {
console.log('Request History Room');
client.query("SELECT * FROM history_room"+ stringInfo[1]
+";" , (err, res) => {
if (err) throw err;
for (let row of res.rows) {
infoHistory = JSON.stringify(row);
infoHistory =
infoHistory.replace(/name|action|time|{|}|:|"|/g,'');
console.log(infoHistory);
clone(socket,"PUSH,"+ stringInfo[1] + "," +
infoHistory);
}
});
}
/* Get Clear Database request from Client */
if (stringInfo[0] == 'CLEAR') {
client.query("DELETE FROM customers;" , (err, res) => {
if (err) throw err;
});
}
/* Get Access password from ESP8266 */
if (stringInfo[0] == 'Access') {
129
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
console.log('Access ESP8266');
var newQuery = "SELECT name, startdate, enddate FROM
customers Where room = 'data1' and password = 'data2';";
newQuery = newQuery.replace('data1', stringInfo[1] );
newQuery = newQuery.replace('data2', stringInfo[2] );
status = 0;
console.log(newQuery);
client.query(newQuery , (err, res) => {
for (let row of res.rows) {
infoHistory = JSON.stringify(row);
infoHistory =
infoHistory.replace(/name|{|}|enddate|startdate|:|"|T140000.000Z|T120000.000Z/g
,'');
infoHistory =
infoHistory.replace('T140000.000Z','');
infoHistory =
infoHistory.replace('T120000.000Z','');
console.log(infoHistory);
var text = infoHistory.split(',');
var day = new Date();
var trueday = new Date(day + ' GMT-07:00');
var text = infoHistory.split(',');
var checkstartDay = new Date(text[1] + '
14:00:00 GMT+07:00');
var checkendDay = new Date(text[2] + '
12:00:00 GMT+07:00');
console.log(day);
console.log(checkstartDay.getTime());
console.log(checkendDay.getTime());
if ( (day.getTime() + 7*3600*1000 ) >
checkstartDay.getTime() && (day.getTime() + 7*3600*1000 ) <
checkendDay.getTime() ) {
clone(socket,"Room Accept");
/*Start to write logs */
newQuery = "INSERT INTO customers
VALUES('name' ,'Open','year-month-dayThour00minute.0secondZ');"
newQuery =
newQuery.replace('customers', 'history_' + stringInfo[1] );
newQuery = newQuery.replace("name",
text[0]);
130
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
newQuery = newQuery.replace("year",
trueday.getFullYear());
newQuery = newQuery.replace("month",
trueday.getMonth() + 1);
newQuery = newQuery.replace("day",
trueday.getDate());
newQuery =
newQuery.replace("hour",('0' + trueday.getHours()).slice(-2)) ;
newQuery =
newQuery.replace("minute",('0' + trueday.getMinutes()).slice(-2) );
newQuery =
newQuery.replace("second",('0' + trueday.getSeconds()).slice(-2) );
client.query(newQuery , (err, res) => {
});
console.log('Room Accept');
status = 1;
break;
}
}
if (status == 0) {
clone(socket,"Room Denied");
}
});
}
/* Get Notify from ESP8266 */
if (stringInfo[0] == 'Door' || stringInfo[0] == 'Finger'){
console.log('Notify ESP8266');
stringInfo = (stringInfo.toString()).replace(/;/g,',');
console.log(stringInfo + ',');
broadcast(socket,stringInfo + ',');
}
if (stringInfo[0] == 'Savefinger'){
console.log('Finger ESP8266');
var day = new Date();
var trueday = new Date(day + ' GMT-07:00');
var newQuery = "INSERT INTO customers VALUES('name'
,'Open by Finger','year-month-dayThour00minute.0secondZ');"
131
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
newQuery = newQuery.replace('customers', 'history_' +
stringInfo[1] );
newQuery = newQuery.replace("name", 'Owner');
newQuery = newQuery.replace("year",
trueday.getFullYear());
newQuery = newQuery.replace("month", trueday.getMonth()
+ 1);
newQuery = newQuery.replace("day", trueday.getDate());
newQuery = newQuery.replace("hour",('0' +
trueday.getHours()).slice(-2)) ;
newQuery = newQuery.replace("minute",('0' +
trueday.getMinutes()).slice(-2) );
newQuery = newQuery.replace("second",('0' +
trueday.getSeconds()).slice(-2) );
console.log(newQuery);
client.query(newQuery , (err, res) => {
});
console.log('Room Open Finger Log');
}
if (stringInfo[0] == 'Saveclose') {
var day = new Date();
var trueday = new Date(day + ' GMT-07:00');
var newQuery = "INSERT INTO customers VALUES('name'
,'Close','year-month-dayThour00minute.0secondZ');"
newQuery = newQuery.replace('customers', 'history_' +
stringInfo[1] );
newQuery = newQuery.replace("name", '');
newQuery = newQuery.replace("year",
trueday.getFullYear());
newQuery = newQuery.replace("month", trueday.getMonth()
+ 1);
newQuery = newQuery.replace("day", trueday.getDate());
newQuery = newQuery.replace("hour",('0' +
trueday.getHours()).slice(-2)) ;
newQuery = newQuery.replace("minute",('0' +
trueday.getMinutes()).slice(-2) );
newQuery = newQuery.replace("second",('0' +
trueday.getSeconds()).slice(-2) );
client.query(newQuery , (err, res) => {
});
132
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
console.log('Room Close Log');
}
/* Moniter response */
if (stringInfo[0] == 'MONITOR') {
newQuery = "Select room ,name, startdate, enddate from
customers;";
client.query(newQuery , (err, res) => {
for (let row of res.rows) {
infoHistory = JSON.stringify(row);
infoHistory =
infoHistory.replace(/T140000.000Z|T120000.000Z|name|{|}|room|enddate|startdat
e|:|"|/g,'');
infoHistory =
infoHistory.replace('T140000.000Z','');
infoHistory =
infoHistory.replace('T120000.000Z','');
console.log(infoHistory);
var text = infoHistory.split(',');
var checkstartDay = new Date(text[2] + '
14:00:00 GMT+07:00');
var checkendDay = new Date(text[3] + '
12:00:00 GMT+07:00');
console.log(checkstartDay.getTime());
console.log(checkendDay.getTime());
if (stringInfo[1] > checkstartDay.getTime() &&
stringInfo[1] < checkendDay.getTime() ) {
clone(socket,"RES_MONITOR," +
infoHistory);
console.log('Phong');
}
}
});
}
133
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
});
socket.on('close', function() {
var index = clients.indexOf(socket);
clients.splice(index, 1);
console.log('disconnected');
});
});
server.listen(process.env.PORT || 5000);
console.log('Server listening on port %d',process.env.PORT || 5000);
❖ Chương trình cho giao diện HTML
<meta charset="UTF-8" name="viewport" content="width=device-width, initial-
scale=1">
<h1 align = center style="font: 20 35px/1.3 'Berkshire Swash', Helvetica, sans-serif;
color: #2b2b2b;
text-shadow: 0.5px 0.5px 0px #ededed, 0px 3px 0px
rgba(0,0,0,0.15);">SMARTHOTEL CONTROL
<div align="center" id = "warning" style="font-size: 25px; background-color:
#FFFFFFFF;color: red;">
<a href="#" onclick='show(1);' class="room" style="position: absolute;left:
10px;top: 120px;">To Book
<a href="#" onclick='show(2);' class="room" style="position: absolute;left:
10px;top: 180px;">Monitor Hotel
<a href="#" onclick='show(3);' class="room" style="position: absolute;left:
10px;top: 240px;">History
134
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
<table style="background-color: #DDDDDDA0;position: absolute;left:
190px;top: 100px; padding: 30px; width:80%; margin: 0px 30px; border-radius:
15px;" >
<th style="background-color: #DDDDDDEE;padding: 30px; font-size:
150%;">RESERVATION PAGE
<td style="background-color: #DDDDDDEE;padding: 30px; font-size:
120%;">Full Name
<input style="position: absolute;left: 220px;line-height:15px; ;top:
135px;width:50%" type="text" placeholder="Type something..." id="fullName">
Birthday <input style="position: absolute;left: 220px;line-height:
30px;top: 190px;width:15%" type="date" id="Birthday" name="trip-start"
value="1996-07-13"
min="1900-01-01" max="2019-12-31">
Phone Number
<input style="position: absolute;left: 220px;line-height: 15px;top:
225px;width:15%" type="text" placeholder="Type something..."
id="phoneNumber">
Your Email
<input style="position: absolute;left: 220px;line-height: 15px;top:
275px;width:20%" type="text" placeholder="Type something..." id="Email">
Choose Your Room<select style="position: absolute;left:
230px;line-height: 30px;top: 330px" name="fruit" id="roomNumber">
ROOM 1
ROOM 2
ROOM 3
Start day <input style="position: absolute;left: 220px;line-height:
30px;top: 365px;width:15%" type="date" id="startDay" name="start"
value="2019-11-22"
135
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
min="1900-01-01" max="2020-12-31">
End day <input style="position: absolute;left: 220px;line-height:
30px;top: 415px;width:15%" type="date" id="endDay" name="end"
value="2019-11-23"
min="1900-01-01" max="2020-12-31">
<td align="center" style="background-color: #DDDDDDEE;padding:
30px; font-size: 100%;"><button onclick="addData()" id="bookButton"
class="button">BOOK NOW
<table style="background-color: #DDDDDDA0;position: absolute;left:
190px;top: 100px; padding: 30px; width:80%; margin: 0px 30px; border-radius:
15px;" >
<th id="room1color" style="background-color:#00ff00;width: 10%;
padding: 20px;font-size: 150%;">ROOM 1
<th id="room2color" style="background-color:#ff0040;width: 10%;
padding: 20px;font-size: 150%;">ROOM 2
<th id="room3color" style="background-color:#ff0040;width: 10%;
padding: 20px;font-size: 150%;">ROOM 3
<p style = 'line-height: 60px;font-family:
Helvetica;color: #fff;font-size: 40px;' id="room1Sta">AVAILABLE
<p style = 'line-height: 60px;font-family:
Helvetica;color: #fff;font-size: 40px;' id="room2Sta">IN USED
<p style = 'line-height: 60px;font-family:
Helvetica;color: #fff;font-size: 40px;' id="room3Sta">IN USED
<p style = 'line-height: 60px;font-family:
Helvetica;color: #fff;font-size: 40px;' id="door1Sta">DOOR: LOCKED
136
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
<p style = 'line-height: 60px;font-family:
Helvetica;color: #fff;font-size: 40px;' id="door2Sta">DOOR: LOCKED
<p style = 'line-height: 60px;font-family:
Helvetica;color: #fff;font-size: 40px;' id="door3Sta">DOOR: LOCKED
<p style = 'line-height: 45px;font-family:
Helvetica;color: #fff;font-size: 20px;' id="room1guest">
<p style = 'line-height: 45px;font-family:
Helvetica;color: #fff;font-size: 20px;' id="room2guest"> Nguyen Chi Thuong
<p style = 'line-height: 45px;font-family:
Helvetica;color: #fff;font-size: 20px;' id="room3guest"> Kha Banh
<p style = 'line-height: 45px;font-family:
Helvetica;color: #fff;font-size: 20px;' id="room1Info"> Until: 10/10/2019
<p style = 'line-height: 45px;font-family:
Helvetica;color: #fff;font-size: 20px;' id="room2Info"> Expiration date:
11/10/2019
<p style = 'line-height: 45px;font-family:
Helvetica;color: #fff;font-size: 20px;' id="room3Info"> Expiration date:
13/10/2019
<button class="history"
onclick="room_history(1)">Show history
<button class="history"
onclick="room_history(2)">Show history
<button class="history"
onclick="room_history(3)">Show history
<table id="history_room1" style="background-color: #ffffcc;position:
absolute;left: 190px;top: 500px; padding: 30px; width:25%; margin: 0px 30px;
border-radius: 15px;" >
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 100%;">Person
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 100%;">Action
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 100%;width:50%">Time
137
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
<table id="history_room2" style="background-color: #ffffcc;position:
absolute;left: 720px;top: 500px; padding: 30px; width:25%; margin: 0px 30px;
border-radius: 15px;" >
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 100%;">Person
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 100%;">Action
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 100%;width:50%">Time
<table id="history_room3" style="background-color: #ffffcc;position:
absolute;left: 1240px;top: 500px; padding: 30px; width:25%; margin: 0px 30px;
border-radius: 15px;" >
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 100%;">Person
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 100%;">Action
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 100%;width:50%">Time
<table id="historyTable" style="background-color: #DDDDDDA0;position:
absolute;left: 190px;top: 100px; padding: 30px; width:80%; margin: 0px 30px;
border-radius: 15px;" >
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 120%;width: 15%">Full Name
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 120%;width: 7%">Birthday
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 120%;width: 10%">Phone number
138
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 120%;width: 10%">Email
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 120%;width: 10%">Room
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 120%;width: 10%">Start Day
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 120%;width: 10%">End Day
<th align="center" style="background-color: powderblue; padding:
10px;font-size: 120%;width: 10%">Password
<button id="btnExport" class="history" style="position: absolute;left:
91%;top: 100px;" onclick="fnExcelReport();"> Export to Excel
<button id="btnclear" class="history" style="position: absolute;left:
91%;top: 140px;" onclick="cleardata()"> Clear Database
<div id="loginTable" style="position: absolute;left: 40%;top: 40%;display: none;"
class="container">
Username
<input id="username" type="text" placeholder="Enter Username"
name="uname" required>
Password
<input id="password" type="password" placeholder="Enter Password"
name="psw" required>
<button onclick="login_func()" class="buttonlogin"
type="submit">Login
<!--
==========================================================
==========================================================
==========================================================
===== -->
139
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
function login_func(){
var username = document.getElementById("username").value;
var password = document.getElementById("password").value;
ws.send('login;' + username + ';' + password);
}
function room_history(n){
delete_table('history_room' + n);
ws.send('HIS;' + n +';');
}
function delete_table(table_name)
{
//Delete history table
var table = document.getElementById(table_name);
var tableLengh = CountRows();
/* Clear Table before get info */
for (var i = 0; i < tableLengh; i++){
table.deleteRow(1);
}
}
function CountRows() {
var rowCount = 0;
var table = document.getElementById("historyTable");
var rows = table.getElementsByTagName("tr")
for (var i = 0; i < rows.length; i++) {
if (rows[i].getElementsByTagName("td").length > 0) {
rowCount++;
}
}
return rowCount;
}
function show(nr) {
document.getElementById("table1").style.display="none";
document.getElementById("table2").style.display="none";
document.getElementById("table3").style.display="none";
document.getElementById("table"+nr).style.display="block";
140
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
document.getElementById('room1color').style.backgroundColor= "#00ff00";
document.getElementById('room1Sta').innerHTML = 'AVAILABLE';
document.getElementById('room1guest').innerHTML = '';
document.getElementById('room1Info').innerHTML ='';
document.getElementById('room2color').style.backgroundColor= "#00ff00";
document.getElementById('room2Sta').innerHTML = 'AVAILABLE';
document.getElementById('room2guest').innerHTML = '';
document.getElementById('room2Info').innerHTML ='';
document.getElementById('room3color').style.backgroundColor= "#00ff00";
document.getElementById('room3Sta').innerHTML = 'AVAILABLE';
document.getElementById('room3guest').innerHTML = '';
document.getElementById('room3Info').innerHTML ='';
delete_table('historyTable');
if (nr == 3 ) {
ws.send('GET;');
}
if (nr == 2) {
var now = new Date();
var querry = 'MONITOR;' + now.getTime();
ws.send(querry);
}
}
function parse_timestamp(str2)
{
str2 = str2.replace("T", " ");
var date = str2.substring(0, 10);
var hour = str2.substring(11, 13);
var minute = str2.substring(15, 17);
var second = str2.substring(19, 21);
return date + ' ' + hour + ':' + minute + ':' + second;
}
141
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
function correct_date(date)
{
var true_day = new Date(date);
return true_day.getDate() + '-' + (true_day.getMonth() + 1) + '-' +
true_day.getFullYear();
}
var url = window.location.host; // hàm trả về url của trang hiện tại kèm theo port
var ws = new WebSocket('ws://' +url + '/ws'); // mở 1 websocket với port 8000
var bookButton = document.getElementById('bookButton');
ws.onopen = function() //khi websocket được mở thì hàm này sẽ được thưc hiện
{
document.getElementById('warning').innerHTML = 'Connected';
console.log('connected...');
};
ws.onmessage = function(evt) // sự kiện xảy ra khi server nhận dữ liệu từ client
{
var dataArray = evt.data.split(",");//split message by delimiter into a string array
if (dataArray == 'LOGIN SUCCESSFULLY') {
alert('LOGIN SUCCESSFULLY');
document.getElementById("loginTable").style.display = "none";
document.getElementById("mainTable").style.display = "block";
}
else if (dataArray == 'LOGIN FAILED') {
alert('LOGIN FAILED. Please check username or password.');
}
/*document.getElementById('warning').innerHTML = dataArray;*/
if (dataArray[0] == "RES") {
/* document.getElementById('warning').innerHTML = 'Show History';*/
var table = document.getElementById("historyTable");
142
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
var row = table.insertRow(1);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
var cell3 = row.insertCell(2);
var cell4 = row.insertCell(3);
var cell5 = row.insertCell(4);
var cell6 = row.insertCell(5);
var cell7 = row.insertCell(6);
var cell8 = row.insertCell(7);
cell1.innerHTML = "" + dataArray[1] + "";
cell2.innerHTML = "" + correct_date(dataArray[2]) +
"";
cell3.innerHTML = "" + dataArray[3] + "";
cell4.innerHTML = "" + dataArray[4] + "";
cell5.innerHTML = "" + dataArray[5] + "";
cell6.innerHTML = "" +
correct_date(dataArray[6].substring(0, 10)) + "";
cell7.innerHTML = "" +
correct_date(dataArray[7].substring(0, 10)) + "";
cell8.innerHTML = "" + dataArray[8] + "";
}
if (dataArray[0] == "PUSH") {
/* document.getElementById('warning').innerHTML = 'Show History';*/
var table = document.getElementById("history_room" + dataArray[1] );
var row = table.insertRow(1);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
var cell3 = row.insertCell(2);
cell1.innerHTML = "" + dataArray[2] + "";
cell2.innerHTML = "" + dataArray[3] + "";
cell3.innerHTML = "" + parse_timestamp(dataArray[4]) +
"";
143
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
}
if (dataArray[0] == "ADD Done") {
alert('Book sucessfully. Please Check your Email and phone to get the access
code.');
}
if (dataArray[0] == "ADD Fail") {
alert('Book Failed. Please Change your check-in time and check-out time.');
}
if (dataArray[0] == 'RES_MONITOR') {
if (dataArray[1] == '1') {
document.getElementById('room1color').style.backgroundColor=
"#ff0040";
document.getElementById('room1Sta').innerHTML = 'INUSED';
document.getElementById('room1guest').innerHTML = dataArray[2];
document.getElementById('room1Info').innerHTML ='Expiration date: ' +
correct_date(dataArray[4].substring(0, 10));
}
else if (dataArray[1] == '2')
{
document.getElementById('room2color').style.backgroundColor=
"#ff0040";
document.getElementById('room2Sta').innerHTML = 'INUSED';
document.getElementById('room2guest').innerHTML = dataArray[2];
document.getElementById('room2Info').innerHTML ='Expiration date: ' +
correct_date(dataArray[4].substring(0, 10));
}
else if (dataArray[1] == '3')
{
document.getElementById('room3color').style.backgroundColor=
"#ff0040";
document.getElementById('room3Sta').innerHTML = 'INUSED';
document.getElementById('room3guest').innerHTML = dataArray[2];
document.getElementById('room3Info').innerHTML ='Expiration date: ' +
correct_date(dataArray[4].substring(0, 10));
}
}
/* Get Door Status */
144
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
if (dataArray[0] == 'Door') {
if (dataArray[1] == 'Room1') {
if (dataArray[2] == '1') {
document.getElementById('door1Sta').innerHTML = 'DOOR: OPEN';
}
else{
document.getElementById('door1Sta').innerHTML = 'DOOR:
LOCKED';
}
}
if (dataArray[1] == 'Room2') {
if (dataArray[2] == '1') {
document.getElementById('door2Sta').innerHTML = 'DOOR: OPEN';
}
else{
document.getElementById('door2Sta').innerHTML = 'DOOR:
LOCKED';
}
}
if (dataArray[1] == 'Room3') {
if (dataArray[2] == '1') {
document.getElementById('door3Sta').innerHTML = 'DOOR: OPEN';
}
else{
document.getElementById('door3Sta').innerHTML = 'DOOR:
LOCKED';
}
}
}
if (dataArray[0] == 'Finger') {
if (dataArray[1] == 'room1') {
document.getElementById('door1Sta').innerHTML = 'DOOR: Open By
Owner';
}
if (dataArray[1] == 'room2') {
document.getElementById('door2Sta').innerHTML = 'DOOR: Open By
Owner';
145
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
}
if (dataArray[1] == 'room3') {
document.getElementById('door3Sta').innerHTML = 'DOOR: Open By
Owner';
}
}
};
ws.onclose = function() { // hàm này sẽ được thực hiện khi đóng websocket
document.getElementById('warning').innerHTML = 'Disconnected';
};
function addData() {
var fullName = document.getElementById('fullName').value;
var Birthday = document.getElementById('Birthday').value;
var phoneNumber = document.getElementById('phoneNumber').value;
var Email = document.getElementById('Email').value;
var roomNumber = document.getElementById('roomNumber').value;
var startDay = document.getElementById('startDay').value;
var endDay = document.getElementById('endDay').value;
var password = 0;
/* Create random password */
var i;
for (i = 0; i < 6; i++) {
password = 10*password + Math.floor(Math.random() * 10);
if (i == 0 && password == 0 ){
password = 1;
}
}
ws.send('ADD' + ";" + fullName + ";" + Birthday + ";" + phoneNumber + ";" +
Email + ";" + roomNumber + ";" + startDay + ";" + endDay + ";" + password);
}
function fnExcelReport()
{
var tab_text="";
146
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
var textRange; var j=0;
tab = document.getElementById('historyTable'); // id of table
for(j = 0 ; j < tab.rows.length ; j++)
{
tab_text=tab_text+tab.rows[j].innerHTML+"";
//tab_text=tab_text+"";
}
tab_text=tab_text+"";
tab_text= tab_text.replace(/]*>|/g, "");//remove if u want links in
your table
tab_text= tab_text.replace(/]*>/gi,""); // remove if u want images in your
table
tab_text= tab_text.replace(/]*>|/gi, ""); // reomves input
params
var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE ");
if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // If Internet
Explorer
{
txtArea1.document.open("txt/html","replace");
txtArea1.document.write(tab_text);
txtArea1.document.close();
txtArea1.focus();
sa=txtArea1.document.execCommand("SaveAs",true,"Say Thanks to
Sumit.xlsx");
}
else //other browser not tested on IE 11
sa = window.open('data:application/vnd.ms-excel,' +
encodeURIComponent(tab_text));
return (sa);
}
function cleardata()
{
ws.send('CLEAR');
alert('Clear Database sucessfully.');
}
147
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
<!--
==========================================================
==========================================================
==========================================================
===== -->
input[type=text], input[type=password] {
width: 100%;
padding: 12px 20px;
margin: 8px 0;
display: inline-block;
border: 1px solid #ccc;
box-sizing: border-box;
}
.container {
padding: 16px;
}
td {
vertical-align: top;
}
#table1, #table2, #table3, #table4, #table5, #table6 {
display: none;
}
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
}
.mode
{
width: 220px;
text-align: center;
padding: 10px;
line-height: 4px;
font-family: Helvetica;
color: black;
font-size: 15px;
border-radius: 15px;
margin: 10px;
}
.button
{
148
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
width: 220px;
height: 70px;
text-align: center;
padding: 10px;
line-height: 4px;
font-family: Helvetica;
color: black;
font-size: 15px;
border-radius: 15px;
margin: 10px;
}
.button:hover {
background-color: green;
}
.history
{
width: 140px;
height: 40px;
text-align: center;
padding: 10px;
line-height: 4px;
font-family: Helvetica;
color: black;
font-size: 15px;
border-radius: 15px;
margin: 10px;
}
.history:hover {
background-color: yellow;
}
.img
{
width:40px;
height:40px;
vertical-align: middle
}
.hero-image {
background-image:
url(https://res.cloudinary.com/hnalbvaa3/image/upload/v1545106433/wall2.jpg);
background-color: #cccccc;
height: 100%;
149
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
width: 100%;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
position: center;
}
.hero-text {
text-align: center;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: white;
}
.room
{
font-size:20px;
color: white;
background-color: #61BAFFB3;
padding: 18px;
margin: 30px 200px 20px 10px;
border-radius: 15px;
width: 7%;
text-align: center;
}
.buttonlogin {
background-color: #4CAF50;
color: white;
padding: 14px 20px;
margin: 8px 0;
border: none;
cursor: pointer;
width: 100%;
}
.buttonlogin:hover {
opacity: 0.8;
}
150
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
PHỤ LỤC
151
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
Các file đính kèm theo tài liệu này:
- do_an_thiet_ke_va_thi_cong_he_thong_quan_ly_mo_hinh_airbnb_h.pdf