Professional Documents
Culture Documents
(123doc) Do An Tot Nghiep Ky Thuat Dien Tu Truyen Thong He Thong Ung Dung Wear Os Trong Viec Ho Tro Nguoi Gia
(123doc) Do An Tot Nghiep Ky Thuat Dien Tu Truyen Thong He Thong Ung Dung Wear Os Trong Viec Ho Tro Nguoi Gia
ĐỒ ÁN TỐT NGHIỆP
NGÀNH KỸ THUẬT ĐIỆN TỬ TRUYỀN THÔNG
ĐỀ TÀI:
II. NHIỆM VỤ
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 27 tháng 03 năm 2018
Xác nhận
Tuần/ngày Nội dung
GVHD
1-2/ 20-03 đến Gặp GVHD trao đổi và xác nhận đề tài
27-03
2-3/ 27-03 đến Hoàn thành đề cương
03-04
3-4/ 03-04 đến Liên kết firebase để điều khiển qua điện thoại
17-04 thông minh và đồng hồ thông minh.
4-6/ 17-04 đến Kết nối module esp và module relay, để điều
02-05 khiển đèn và chuông, thông qua điện thoại và
đồng hồ thông minh.
GV HƯỚNG DẪN
(Ký và ghi rõ họ và tên)
iii
LỜI CAM ĐOAN
Đề tài này là do nhóm tôi tự thực hiện dựa vào một số tài liệu trước đó và không sao
chép từ tài liệu hay công trình đã có trước đó.
iv
LỜI CẢM ƠN
Em xin gởi lời cảm ơn sâu sắc đến Thầy Nguyễn Văn Hiệp _ Giảng viên bộ môn
Điện tử công nghiệp – y sinh đã trực tiếp hướng dẫn và tận tình giúp đỡ tạo điều kiện để
hoàn thành tốt đề tài.
Chúng em xin gởi lời chân thành cảm ơn các thầy cô trong Khoa Điện-Điện Tử đã
tạo những điều kiện tốt nhất cho chúng em hoàn thành đề tài.
Chúng mình cũng gửi lời đồng cảm ơn đến các bạn lớp 14141DT3B đã chia sẻ
trao đổi kiến thức cũng như những kinh nghiệm quý báu trong thời gian thực hiện đề tài.
Cảm ơn đến cha mẹ, là chỗ dựa tinh thần vững chắc cho chúng con, luôn an ủi và
động viên những lúc chúng con khó khăn nhất trong suốt những năm tháng học hành.
Xin chân thành cảm ơn!
v
MỤC LỤC
vi
3.2.3 Thiết kế mạch điều khiển đèn, chuông .......................................................... 22
a/ Vi điều khiển ....................................................................................................... 22
b/ Module 4 Relay 5V ............................................................................................. 24
c/ Nguồn nuôi mạch điều khiển .............................................................................. 25
d/ Các thiết bị khác.................................................................................................. 26
vii
LIỆT KÊ HÌNH VẼ
Hình Trang
Hình 2.1: Các phiên bản của hệ điều hành Android ..................................................... 6
Hình 3.3: Giao diện bắt đầu ứng dụng điện thoại ......................................................... 21
Hình 3.4: Giao diện ứng dụng điện thoại khởi chạy thành công .................................. 21
Hình 4.3: Tiến hành quá trình cài đặt phần mềm Android Studio. .............................. 30
Hình 4.4: Kết thúc quá trình cài đặt phần mềm Android Studio. ................................ 31
viii
Hình 4.8: Màn hình Add an Activity to Wear. ............................................................. 34
Hình 4.17: Điền thông tin package của ứng dụng. ....................................................... 39
Hình 4.22: Lưu đồ ứng dụng khi được khởi động. ...................................................... 43
Hình 4.24: Giao diện nhập số điện thoại khẩn cấp. ..................................................... 49
Hình 4.25: Giao diện xác nhận số điện thoại khẩn cấp. ............................................... 50
Hình 4.26: Giao diện thông báo SOS đang hoạt động. ................................................ 51
Hình 4.30: Lưu đồ hoạt động của chương trình gửi tin nhắn....................................... 55
Hình 4.31: Lưu đồ khởi tạo số điện thoại khẩn cấp. .................................................... 56
Hình 4.32: Lưu đồ hoạt động của chương trình vị trí .................................................. 57
Hình 4.33: Thiết kế bản vẽ PCB và sau khi thi công. .................................................. 58
ix
Hình 4.34: Mạch điều khiển hoàn chỉnh. ..................................................................... 60
Hình 4.36: Cửa sổ tính hành cài đặt Driver Arduino. .................................................. 63
Hình 4.37: Cửa sổ hoàn thành quá trình cài đặt Driver Arduino. ................................ 64
Hình 4.47: Màn hình thứ hai của ứng dụng. ................................................................ 75
Hình 4.48: Màn hình của ứng dụng trên đồng hồ. ....................................................... 76
Hình 5.2: Giao diện khi gửi tin nhắn, nội dung tin nhắn .............................................. 81
Hình 5.4: Điều khiển khi chưa cấp nguồn phần cứng ................................................... 82
Hình 5.5: Điều khiển khi đã cấp nguồn phần cứng ....................................................... 83
x
LIỆT KÊ BẢNG
Bảng Trang
Bảng 2.1: Phạm vi truyền của các loại Bluetooth ........................................................... 12
Bảng 3.1: Dòng tiêu thụ các thiết bị ................................................................................ 25
Bảng 4.1: Danh sách các linh kiện được sử dụng ........................................................... 59
xi
TÓM TẮT
Hiện nay, việc quan tâm sức khỏe cũng như hỗ trợ người cao tuổi đang là một
vấn đề đang được quan tâm rất nhiều trong cuộc sống. Việc sử dụng những công cụ
hỗ trợ người già cũng là một khía cạnh đang được phát triển mạnh, nắm bắt được
những công cụ hỗ trợ sẵn, nhóm chúng tôi sử dụng đồng hồ thông minh và thiết bị
di động cá nhân để hỗ trợ tối ưu nhất cho những vấn đề thiết yếu cho người già. Đề
tài mang tên: HỆ THỐNG ỨNG DỤNG WEAR OS TRONG VIỆC HỖ
TRỢ NGƯỜI GIÀ.
Đề tài sử dụng thiết bị đồng hồ thông minh, điện thoại thông minh, website có
kết nối mạng để điều khiển những thiết bị thiết yếu như đèn, chuông báo thông qua
Esp8266 ở bất cứ đâu, bất cứ lúc nào. Điều khiển các thiết bị chiếu sáng như bật tắt
đèn nhà tắm, đèn phòng ngủ, đèn hành lang; bật tắt chuông báo động khi có vấn đề
quan trọng, thiết lập một cuộc gọi tới số khẩn cấp, gửi tin nhắn khẩn cấp và địa điểm
hiện tại tới số khẩn cấp.
xii
CHƯƠNG 1. TỔNG QUAN
Mục tiêu là thực hiện điều khiển các thiết bị điện từ xa thông qua mạng
không dây, cảnh báo cho người gần đó trong trường hợp cần người giúp đỡ, báo
động cho người thân ở xa qua tin nhắn, cuộc gọi tới điện thoại bằng cách sử dụng
các ứng dụng được viết cho đồng hồ thông minh Asus ZenWatch 2, điện thoại
thông minh sử dụng hệ điều hành Android hoặc máy tính có kết nối Internet, nhằm
hướng đến việc tiện lợi trong các nhu cầu sinh hoạt bình thường đơn giản cho người
già.
NỘI DUNG 1: Tìm hiểu về firebase để cập nhật dữ liệu điều khiển, cũng như
chia sẻ quyền điều khiển cho các thiết bị.
NỘI DUNG 2: Tìm hiểu thiết kế giao diện cho ứng dụng chạy trên các thiết bị
android.
NỘI DUNG 3: Tìm hiểu cách điều khiển module ESP8266 NodeMCU Mini
D1 thông qua firebase.
NỘI DUNG 4: Thi công được mô hình.
NỘI DUNG 5: Cân chỉnh, hoàn thiện được mô hình.
NỘI DUNG 6: Đánh giá kết quả thực hiện.
1.5. BỐ CỤC
Chương 2. CƠ SỞ LÝ THUYẾT
Người cao tuổi thường là những người thuộc độ tuổi từ 60 tuổi trở lên, nhóm
người ở độ tuổi này bắt đầu xuất hiện những vấn đề về sức khỏe, tính nhạy cảm cao,
bị hạn chế trong một số công việc,… Đặc biệt là họ muốn tự chủ trong một số sinh
hoạt cá nhân, muốn chứng tỏ với những người xung quanh – nhất là con cái, rằng
mình vẫn còn sức khỏe, còn khả năng làm những việc cụ thể nào đó, không muốn trở
thành một thứ gánh nặng vô hình cho con cái, muốn con cái yên tâm về họ, như đã
nói ở trên người ở nhóm này rất nhạy cảm nên dễ dàng thấy họ rất muốn làm những
việc nhỏ nhặt nhất trong giới hạn sức khỏe của mình.
Ban đầu, Android được phát triển bởi tổng công ty Android, với sự hỗ trợ tài
chính từ Google và sau này được chính Google mua lại vào năm 2005. Android ra
mắt vào năm 2007 cùng với tuyên bố thành lập liên minh thiết bị cầm tay mở: một
hiệp hội gồm các công ty phần cứng, phần mềm, và viễn thông với mục tiêu đẩy mạnh
các tiêu chuẩn mở cho các thiết bị di động. Chiếc điện thoại đầu tiên chạy Android
được bán vào năm 2008.
Những yếu tố này đã giúp Android trở thành nền tảng điện thoại thông minh
phổ biến nhất thế giới, vượt qua Symbian OS vào quý 4 năm 2010, và được các công
ty công nghệ lựa chọn khi họ cần một hệ điều hành không nặng nề, có khả năng tinh
chỉnh, và giá rẻ chạy trên các thiết bị công nghệ cao thay vì tạo dựng từ đầu. Kết quả
là mặc dù được thiết kế để chạy trên điện thoại và máy tính bảng, Android đã xuất
hiện trên TV, máy chơi game và các thiết bị điện tử khác. Bản chất mở của Android
cũng khích lệ một đội ngũ đông đảo lập trình viên và những người đam mê sử dụng
mã nguồn mở để tạo ra những dự án do cộng đồng quản lý. Những dự án này bổ sung
các tính năng cao cấp cho những người dùng thích tìm tòi hoặc đưa Android vào các
thiết bị ban đầu chạy hệ điều hành khác[8].
Android chiếm 87,7% thị phần điện thoại thông minh trên toàn thế giới vào
thời điểm quý 2 năm 2017, với tổng cộng 2 tỷ thiết bị đã được kích hoạt và 1,3 triệu
lượt kích hoạt mỗi ngày. Sự thành công của hệ điều hành cũng khiến nó trở thành
mục tiêu trong các vụ kiện liên quan đến bằng phát minh, góp mặt trong cái gọi là
"cuộc chiến điện thoại thông minh" giữa các công ty công nghệ.
Android là hệ điều hành điện thoại di động mở nguồn mở miễn phí do Google
phát triển dựa trên nền tảng của Linux. Bất kỳ một hãng sản xuất phần cứng nào cũng
đều có thể tự do sử dụng hệ điều hành Android cho thiết bị của mình, miễn là các
thiết bị ấy đáp ứng được các tiêu chuẩn cơ bản do Google đặt ra (có cảm ứng chạm,
GPS, 3G,...)
Các nhà sản xuất có thể tự do thay đổi phiên bản Android trên máy của mình
một cách tự do mà không cần phải xin phép hay trả bất kì khoản phí nào nhưng phải
đảm bảo tính tương thích ngược (backward compatibility) của phiên bản chế riêng
đó.
Android là nền tảng cho thiết bị di động bao gồm một hệ điều hành, midware
và một số ứng dụng chủ đạo. Bộ công cụ Android SDK cung cấp các công cụ và bộ
thư viên các hàm API cần thiết để phát triển ứng dụng cho nền tảng Android sử dụng
ngôn ngữ lập trình java.
Application framework: Cho phép tái sử dụng và thay thế các thành phần sẳn
có của Android.
Dalvik virtual machine: Máy ảo java được tối ưu hóa cho thiết bị di động.
Intergrated browser: Trình duyệt web tích hợp được xây dựng dựa trên WebKit
engine.
Optimized graphics: Hỗ trợ bộ thư viện 2D và 3D dự vào đặc tả OpenGL ES
1.0.
SQLite: DBMS dùng để lưu trữ dữ liệu có cấu trúc.
Hổ trở các định dạng media phổ biến như: MPEG4, H.264, MP3, AAC, ARM,
JPG, PNG, GIF.
Hổ trợ thoại trên nền tảng GSM (Phụ thuộc vài phần cứng thiết bị).
Bluetooth, EDGE, 3G và WiFi (Phụ thuộc vài phần cứng thiết bị).
Camera, GPS, la bàn và cảm biến (Phụ thuộc vài phần cứng thiết bị).
Bộ công cụ phát triển ứng dụng mạnh mẽ.
Từ tháng 4 năm 2009, phiên bản Android được phát triển dưới tên mã là chủ đề
bánh kẹo và phát hành theo thứ tự bảng chữ cái: Cupcake (1.5), Donut (1.6), Eclair
(2.0–2.1), Froyo (2.2–2.2.3), Gingerbread (2.3–2.3.7), Honeycomb (3.0–3.2.6), Ice
Cream Sandwich (4.0–4.0.4), Jelly Bean (4.1–4.3), KitKat (4.4), Lollipop (5.0-5.1.1),
Marshmallow (6.0), Nougat(7.0), Oreo(8.0)[9] .
động trên hình thức đồng hồ thông minh. Nền tảng đã được công bố vào ngày 18
tháng 3 năm 2014, cùng với việc phát hành một bản phát triển. Các công ty như
Motorola, Samsung, LG, HTC và Asus đã công bố là đối tác chính thức. Trong năm
2014, đã có 720.000 thiết bị Android Wear được bán ra của các hãng LG, Motorola
và Samsung[3].
được nâng cấp thêm nhiều tính nắng khác như: trợ lý ảo, theo dõi các hoạt động thể
dục, lời nhắc,…[4].
2.4 KHÁI NIỆM VỀ WIFI
Wi-Fi (WiFi hoặc Wifi) viết tắt từ Wireless Fidelity hay mạng 802.11 là hệ
thống mạng không dây sử dụng sóng vô tuyến, giống như điện thoại di động, truyền
hình và radio.
Tuy nhiên, sóng WiFi có một số khác biệt so với các sóng vô tuyến khác ở
chỗ:
Chúng truyền và phát tín hiệu ở tần số 2.4 GHz, 5 GHz hoặc 60Ghz. Tần số
này cao hơn so với các tần số sử dụng cho điện thoại di động, các thiết bị cầm
tay và truyền hình. Tần số cao hơn cho phép tín hiệu mang theo nhiều dữ liệu
hơn.
Chúng dùng chuẩn 802.11:
o Chuẩn 802.11b là phiên bản đầu tiên trên thị trường. Đây là chuẩn chậm
nhất và rẻ tiền nhất, và nó trở nên ít phổ biến hơn so với các chuẩn khác.
802.11b phát tín hiệu ở tần số 2.4 GHz, nó có thể xử lý đến 11
megabit/giây, và nó sử dụng mã CCK (complimentary code keying).
o Chuẩn 802.11g cũng phát ở tần số 2.4 GHz, nhưng nhanh hơn so với
chuẩn 802.11b, tốc độ xử lý đạt 54 megabit/giây. Chuẩn 802.11g nhanh
hơn vì nó sử dụng mã OFDM (orthogonal frequency-division
multiplexing), một công nghệ mã hóa hiệu quả hơn.
o Chuẩn 802.11a phát ở tần số 5 GHz và có thể đạt đến 54 megabit/ giây.
Nó cũng sử dụng mã OFDM. Những chuẩn mới hơn sau này như
802.11n còn nhanh hơn chuẩn 802.11a, nhưng 802.11n vẫn chưa phải
là chuẩn cuối cùng.
o Chuẩn 802.11n cũng phát ở tần số 2.4 GHz, nhưng nhanh hơn so với
chuẩn 802.11a, tốc độ xử lý đạt 300 megabit/giây.
o Chuẩn 802.11ac phát ở tần số 5 GHz
o Chuẩn 802.11ad phát ở tần số 60 GHz.
Wifi có thể hoạt động trên cả ba tần số và có thể nhảy qua lại giữa các tần số
khác nhau một cách nhanh chóng. Việc nhảy qua lại giữa các tần số giúp giảm
thiểu sự nhiễu sóng và cho phép nhiều thiết bị kết nối không dây cùng một lúc.
Thiết bị kết nối vào mạng WIFI được gọi là station (trạm). Việc kết nối vào
mạng Wifi được hỗ trợ bởi một access point (AP), một AP có chức năng như một
hub nhưng dùng cho nhiều station. Một access point thông thường được kết nối
vào một mạng dây để phát WIFI (tức là chuyển từ mạng dây sang WIFI). Do đó
access point luôn được tích hợp vào router. Mỗi access point được nhận biết bằng
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 9
CHƯƠNG 2. CƠ SỞ LÝ THUYẾT
một SSID (Service Set IDentifier), SSID cũng là tên của mạng hiển thị khi ta kết
nối vào WIFI.
Một hotspot là một nơi mà các thiết bị có thể kết nối Internet, và thường là
bằng Wifi, thông qua mạng WLAN (wireless local area network: mạng nội bộ
không dây) nối với router.
Các máy tính nằm trong vùng phủ sóng WiFi cần có các bộ thu không dây,
adapter, để có thể kết nối vào mạng. Các bộ này có thể được tích hợp vào các máy
tính xách tay hay để bàn hiện đại. Hoặc được thiết kế ở dạng để cắm vào khe PC card
hoặc cổng USB, hay khe PCI. Khi đã được cài đặt adapter không dây và phần mềm
điều khiển (driver), máy tính có thể tự động nhận diện và hiển thị các mạng không
dây đang tồn tại trong khu vực.
AES (Advanced Encryption Standard). Giao thức AES được dùng trong cả
WPA và WPA 2.
- WPA 2 ( WiFi Protected Access II ) là giao thức và chuẩn bảo mật thay thế
cho WPA từ năm 2006 và được xem là chuẩn bảo mật an toàn nhất đến
thời điểm này. Ngoài việc sử dụng giao thức AES,thì WPA 2 còn sử dụng
thêm giao thức mã hóa CCMP (CTR mode with CBC-MAC Protocol).
Giao thức CCMP là một giao thức truyền dữ liệu và kiểm soát tính truyền
dữ liệu thống nhất để bảo đảm cả tính bảo mật và nguyên vẹn của dữ liệu
được truyền đi. Cho đến nay thì giao thức bảo mật WPA2 dùng AES là
giao thức bảo mật Wifi tốt nhất.
Hầu hết các router có độ phủ sóng trong khoảng bán kính 30,5 m về mọi hướng.
Bluetooth ra đời vào năm 1989 tại công ty Ericsson ở Lund, Thụy Điển. Tên
"bluetooth" là phiên bản ăng-lô hóa của vị vua Harald Bluetooth, người thống nhất
các bộ tộc Đan Mạch thành một vương quốc vùng Scandinavia. Ký hiệu bluetooth
mà các bạn thấy là tên viết tắt (Harald Bluetooth) của vị vua này theo cổ ngữ Rune:
Bluetooth ra đời với mục đích "không dây hóa" chuẩn serial RS-232 thịnh
hành vào những năm 80-90 của thế kỷ trước và chuẩn hóa các giao tiếp serial.
Bluetooth được phát triển đầu tiên bởi Ericsson (hiện nay là Sony Ericsson và
Ericsson Mobile Platforms), và sau đó được chuẩn hoá bởi Bluetooth Special Interest
Group (SIG). Chuẩn được công bố vào ngày 20 tháng 5 năm 1999. Ngày nay được
công nhận bởi hơn 1800 công ty trên toàn thế giới. Được thành lập đầu tiên bởi Sony
Ericsson, IBM, Intel, Toshiba và Nokia, sau đó cùng có sự tham gia của nhiều công
ty khác với tư cách cộng tác hay hỗ trợ. Bluetooth có chuẩn là IEEE 802.15.1.
Theo Bluetooth SIG, hiện có hơn 90% điện thoại smartphone có tính năng
Bluetooth, bao gồm các hệ điều hành IOS, Android và Window. Bluetooth về cơ bản
là một giao tiếp bằng sóng radio ở băng tần 2.4 đến 2.480 GHz, rất gần với chuẩn
Wifi 2.4GHz hiện nay. Tuy nhiên, khác với Wifi hay các sóng radio khác hoạt động
ở 1 băng tầng cố định, Bluetooth triển khai theo khái niệm "nhảy tần trải phổ"
(Frequency Hopping Spread Spectrum), có nghĩa là băng tần hoạt động của Bluetooth
thay đổi liên tục với 79 kênh (từ 2.400 GHz đên 2.480 GHz). Điều này, về mặt lý
thuyết, đảm bảo bluetooth chống lại việc nghe lén rất hiệu quả vì hacker phải biết
chính xác được kênh nào để nghe, mà kênh này lại thay đổi liên tục (khoảng 800 lần
mỗi giây) tùy vào sự đồng ý giữa 2 thiết bị đang giao tiếp với nhau [6].
Bước sóng của bluetooth là khoảng 12cm. Bluetooth là giao tiếp tầm ngắn, khoảng
vài mét đổ lại.
Bluetooth cho phép kết nối và trao đổi thông tin giữa các thiết bị như điện thoại
di động, điện thoại cố định, máy tính xách tay, PC, máy in, thiết bị định vị dùng GPS,
máy ảnh số, và video game console.
Điều khiển và giao tiếp không dây giữa một điện thoại di động và tai nghe
không dây.
Mạng không dây giữa các máy tính cá nhân trong một không gian hẹp đòi hỏi
ít băng thông.
Giao tiếp không dây với các thiết bị vào ra của máy tính, chẳng hạn như chuột,
bàn phím và máy in.
Truyền dữ liệu giữa các thiết bị dùng giao thức OBEX.
Thay thế các giao tiếp nối tiếp dùng dây truyền thống giữa các thiết bị đo, thiết
bị định vị dùng GPS, thiết bị y tế, máy quét mã vạch, và các thiết bị điều khiển
giao thông.
Thay thế các điều khiển dùng tia hồng ngoại.
Gửi các mẫu quảng cáo nhỏ từ các pa-nô quảng cáo tới các thiết bị dùng
Bluetooth khác.
Điều khiển từ xa cho các thiết bị trò chơi điện tử như Wii - Máy chơi trò chơi
điện tử thế hệ 7 của Nintendo[1] và PlayStation 3 của Sony.
Kết nối Internet cho PC hoặc PDA bằng cách dùng điện thoại di động thay
modem.
Về mặt lịch sử, Firebase (tiền thân là Evolve) trước đây là một start up được
thành lập vào năm 2011 bởi Andrew Lee và James Tamplin. Ban đầu, Evolve chỉ
cung cấp cơ sở dữ liệu để các lập trình viên thiết kế các ứng dụng chat (và hiện tại thì
để làm quen với realtime db thì bạn cũng làm ứng dụng chat đó thôi). Tuy nhiên, họ
nhanh chóng nhận ra tiềm năng sản phẩm của mình khi nhận thấy các khách hàng
không sử dụng CSDL để làm ứng dụng chat, mà thay vào đó, để lưu các thông tin
như game progress. Bộ đôi Lee và Tamplin quyết định tách mảng realtime ra để thành
lập một công ty độc lập – chính là Firebase – vào tháng 4 năm 2012. Sau nhiều lần
huy động vốn và gặt hái được những thành công nổi bật, Firebase đã được Google để
ý. Vào tháng 10 năm 2014, Firebase gia nhập gia đình Google. Firebase, theo hướng
đi của Google, chính thức hỗ trợ Android, iOS và Web.
Cloud Firestore
ML Kit
Cloud Functions
Authentication
Hosting
Cloud Storage
Realtime Database
gian thực và vẫn khả dụng khi ứng dụng của bạn ngoại tuyến. Cơ sở dữ
liệu thời gian thực Firebase là cơ sở dữ liệu được lưu trữ trên đám mây. Dữ
liệu được lưu trữ dưới dạng JSON và được đồng bộ hóa theo thời gian thực
cho mọi máy khách được kết nối. Khi bạn tạo các ứng dụng đa nền tảng
với SDK iOS, Android và JavaScript, tất cả máy khách của bạn sẽ chia sẻ
một phiên bản cơ sở dữ liệu thời gian thực và tự động nhận các bản cập
nhật với dữ liệu mới nhất.
- Các khả năng chính [2]:
o Thời gian thực: Thay vì các yêu cầu HTTP điển hình, cơ sở dữ liệu
thời gian thực Firebase sử dụng đồng bộ hóa dữ liệu — mỗi khi dữ
liệu thay đổi, mọi thiết bị được kết nối sẽ nhận được bản cập nhật
đó trong mili giây. Cung cấp trải nghiệm cộng tác và nhập vai mà
không cần suy nghĩ về mã mạng.
o Ngoại tuyến: Ứng dụng Firebase vẫn đáp ứng ngay cả khi ngoại
tuyến vì SDK cơ sở dữ liệu thời gian thực Firebase vẫn lưu dữ liệu
của bạn vào đĩa. Sau khi kết nối được thiết lập lại, thiết bị khách sẽ
nhận được bất kỳ thay đổi nào bị mất, đồng bộ hóa nó với trạng thái
máy chủ hiện tại.
o Có thể truy cập từ các thiết bị máy khách: Cơ sở dữ liệu thời gian
thực Firebase có thể được truy cập trực tiếp từ thiết bị di động hoặc
trình duyệt web; không cần máy chủ ứng dụng. Bảo mật và xác thực
dữ liệu có sẵn thông qua Quy tắc bảo mật cơ sở dữ liệu thời gian
thực Firebase, các quy tắc dựa trên biểu thức được thực thi khi dữ
liệu được đọc hoặc ghi.
o Quy mô trên nhiều cơ sở dữ liệu: Với cơ sở dữ liệu thời gian thực
Firebase trên kế hoạch định giá Blaze, bạn có thể hỗ trợ nhu cầu dữ
liệu của ứng dụng theo quy mô bằng cách chia nhỏ dữ liệu của bạn
trên nhiều phiên bản cơ sở dữ liệu trong cùng một dự án Firebase.
Hợp lý hóa xác thực với xác thực Firebase trên dự án của bạn và xác
thực người dùng trên các phiên bản cơ sở dữ liệu của bạn. Kiểm soát
quyền truy cập vào dữ liệu trong mỗi cơ sở dữ liệu với quy tắc cơ
sở dữ liệu thời gian thực Firebase tùy chỉnh cho từng cá thể cơ sở
dữ liệu.
- Cơ sở dữ liệu thời gian thực Firebase cho phép bạn xây dựng các ứng dụng
phong phú, hợp tác bằng cách cho phép truy cập an toàn vào cơ sở dữ liệu
trực tiếp từ mã phía máy khách. Dữ liệu được duy trì cục bộ và ngay cả khi
ngoại tuyến, các sự kiện thời gian thực vẫn tiếp tục kích hoạt, mang lại cho
người dùng trải nghiệm đáp ứng. Khi thiết bị lấy lại kết nối, cơ sở dữ liệu
thời gian thực đồng bộ hóa các thay đổi dữ liệu cục bộ với các cập nhật từ
xa đã xảy ra trong khi máy khách ngoại tuyến, tự động hợp nhất bất kỳ
xung đột nào.
- Cơ sở dữ liệu thời gian thực cung cấp ngôn ngữ quy tắc dựa trên biểu thức
linh hoạt, được gọi là “Quy tắc bảo mật cơ sở dữ liệu thời gian thực
Firebase”, để xác định cách dữ liệu của bạn nên được cấu trúc và khi dữ
liệu có thể được đọc hoặc ghi vào. Khi được tích hợp với Xác thực
Firebase, nhà phát triển có thể xác định ai có quyền truy cập vào dữ liệu
nào và cách họ có thể truy cập dữ liệu đó.
- Cơ sở dữ liệu thời gian thực là một cơ sở dữ liệu NoSQL và như vậy có
các tối ưu hóa và chức năng khác nhau so với một cơ sở dữ liệu quan hệ.
API (Application Programming Interface) cơ sở dữ liệu thời gian thực được
thiết kế để chỉ cho phép các hoạt động có thể được thực hiện nhanh chóng.
Điều này cho phép bạn xây dựng trải nghiệm thời gian thực tuyệt vời có
thể phục vụ hàng triệu người dùng mà không ảnh hưởng đến phản hồi. Bởi
vì điều này, điều quan trọng là phải suy nghĩ về cách người dùng cần truy
cập dữ liệu của bạn và sau đó cấu trúc nó cho phù hợp.
- Các cách thực hiện:
o Tích hợp SDK cơ sở dữ liệu thời gian thực Firebase: Nhanh chóng
bao gồm các máy khách thông qua Gradle, CocoaPods, hoặc bao
hàm một tập lệnh.
o Tạo tài liệu tham khảo cơ sở dữ liệu thời gian thực: Tham khảo dữ
liệu JSON của bạn, chẳng hạn như "người dùng / người dùng:
1234/phone_number" để đặt dữ liệu hoặc đăng ký thay đổi dữ liệu.
Cùng với sự phát triển của kinh tế, xã hội, y tế đồng thời tỉ lệ người cao tuổi
ngày càng tăng kèm theo nhu cầu được chăm sóc, sinh hoạt tiện nghi cho người cao
tuổi cũng tăng theo.
Để giảm sự di chuyển của người già trong những lúc đêm tối tìm công tắc bật
đèn, tránh trường hợp gặp rủi ro về điện giật hoặc lúc cơ thể đau ốm sức khoẻ bị hạn
chế cho việc di chuyển nhiều. Hỗ trợ người già trong những tình huống khẩn cấp có
thể báo động cho người thân, bằng chuông báo khẩn tại nhà hoặc tin nhắn điện thoại,
và người thân có thể theo dõi vị trí để hỗ trợ trong những tình huống cần thiết.
Nhóm sinh viên thực hiện đề tài nhận thấy việc công nghệ ngày càng phát triển.
Đồng hồ thông minh hệ điều hành Wear OS ngày phổ biến và thiết bị đeo tay có thể
ở bên người già 24/24 hỗ trợ rất tốt. Vì vậy nhóm đã chủ động xây dựng ứng dụng hỗ
trợ người già trên nền tảng Wear OS.
Như sơ đồ trên ta thấy đồng hồ và điện thoại kết nối với nhau dùng để gửi thông
tin điều khiển đèn, chuông qua mạng không dây lên database của firebase. Điện thoại
đọc dữ liệu điều khiển từ firebase về để điều khiển chức năng nhắn tin khẩn cấp.
Esp8266 đọc dữ liệu từ firebase qua mạng wifi, từ dữ liệu đọc về sẽ điều khiển đèn,
chuông thông qua module relay. Ta cũng có thề điểu khiển trực tiếp trên máy tính
bằng cách truy cập firebase.com và đăng nhập vào tài khoản của mình.
Đồng hồ sẽ là nơi hiển thị giao diện điều khiển chính. Thiết bị điều khiển ở
đây sẽ là đèn, chuông và nút nhấn SOS khẩn cấp, đồng thời vẫn xem được giờ khi
chạy ứng dụng. Yêu cầu thiết kế giao diện của ứng dụng sẽ ưu tiên việc đơn giản hóa
giao diện, các biểu tượng của ứng dụng sẽ thiên về việc dễ sử dụng và không cầu kì.
Ứng dụng của nhóm sẽ có giao diện thiết kế như sau:
Giao diện gồm 3 công tắc nằm bên trái màn hình với chức năng điều khiển tắt
bật các bóng đèn. Bên phải gồm 3 nút nhấn, nút nhấn trên cùng dùng bật chuông báo
động khi cần sự trợ giúp của người chăm sóc hoặc người ở gần, nút thứ hai đùng để
tắt chuông báo động. Nút nhấn dưới cùng là nút SOS dùng để báo động trong trường
hợp khẩn cấp tới người thân, khi nhấn nút sẽ gửi tin nhắn khẩn cấp tới một số điện
thoại chọn trước, trong tin nhắn sẽ kèm theo vị trí hiện tại của người sử dụng và tạo
cuộc gọi tới số khẩn cấp này ngay sau đó.
Điện thoại sẽ được kết với đồng hồ, giúp thực hiện cuộc gọi, tin nhắn khẩn cấp
và cung cấp vị trí cho đồng hồ. Để hỗ trợ những chức năng trên ta thiết kế trên ứng
dụng trên điện thoại như sau:
Hình 3.3: Giao diện bắt đầu ứng dụng điện thoại.
Giao diện điện thoại cho phép ta nhập số điện thoại khẩn cấp và sau đó sẽ bấm
nút nhấn để xác nhận số điện thoại đã nhập. Đây sẽ là số điện thoại nhận tin nhắn
khẩn cấp và đổ chuông khi ta nhấn nút SOS trên đồng hồ. Sau khi xác nhận sẽ hiện
ra một giao diện số điện thoại mà ta vừa nhập xác nhận ứng dụng khởi chạy thành
công.
Hình 3.4: Giao diện ứng dụng điện thoại khởi chạy thành công.
Mạch điều khiển giao tiếp với cơ sở dữ liệu firebase thông qua mạng không
dây. Giao tiếp giữa vi điều khiển và các thiết bị điện, phải đảm bảo tính an toàn khi
sử dụng.
a/ Vi điều khiển
Với yêu cầu như trên ta cần một vi điều khiển có khả năng kết nối và xử lý dữ
liệu qua mạng không dây. Để đáp ứng những yêu cầu trên, ngoài ra vì sự tiện lợi, dễ
thay thế khi hư hỏng, kích thước nhỏ gọn, giá thành hợp lý nên nhóm em quyết định
chọn Module wifi ESP8266 NodeMCU Mini D1 để làm khối điều khiển trung tâm.
Module wifi ESP8266 NodeMCU Mini D1 là kit phát triển dựa trên nền chip
Wifi SoC ESP8266EX, được thiết kế dễ dàng sử dụng và có thể dễ dàng nạp chương
trình khi kết nối với máy tính thông qua cáp USB ( Loại cáp dùng cho điện thoại
thông minh và Laptop). Hiện tại, có thể sử dụng trực tiếp phần mềm IDE của Arduino
để lập trình với bộ thư viện riêng hoặc sử dụng phần mềm node MCU.
Thông số kỹ thuật:
TX, chức năng: Ngõ ra phát dữ liệu trong chế độ truyền bất đồng bộ
RX, chức năng: Ngõ vào nhận dữ liệu trong chế độ truyền bất đồng bộ
Chân A0, chức năng: Ngõ vào tương tự, giá trị điện áp vào cực đại là 3,3v
Chân D0, chức năng: Ngõ vào ra số.
Chân D1, chức năng: Ngõ vào ra số, ngõ vào xung clock(SCL).
Chân D2, chức năng: Ngõ vào ra số, xuất, nhập dữ liệu(SDA)
Chân D3, chức năng: Ngõ vào ra số, có điện trở kéo lên 10k.
Chân D4, chức năng: Ngõ vào ra số, có điện trở kéo lên 10k, kết nối với led.
Chân D5, chức năng: Ngõ vào ra số, ngõ vào xung clock(SCK).
Chân D6, chức năng: Ngõ vào ra số, MISO
Chân D7, chức năng: Ngõ vào ra số, MOSI
Chân D8, chức năng: Ngõ vào ra số, có điện trở kéo xuống 10k
Chân G, 5v, 3,3v: Các chân cấp nguồn cho module.
Chân RST, chức năng: Reset
Với yêu cầu bài toán đặt ra phải đảm bảo tính an toàn khi sử dụng các thiết bị
điện, phải cách ly với mạch điều khiển có các giải pháp như: sử dụng Triac và opto,
relay,… đồng thời mạch giao tiếp điều khiển bốn thiết bị, nhóm em quyết định chọn
Module 4 relay 5V với giá thành hợp lý, tiện dụng, dễ thay thế khi hư hỏng.
Module 4 relay 5V với Opto cách ly gồm 4 rơ le hoạt động tại điện áp 5VDC,
chịu được hiệu điện thế lên đến 250VAC 10A. Module 4 relay 5V với Opto cách
ly được thiết kế chắc chắn, khả năng cách điện tốt. Trên module đã có sẵn mạch kích
relay sử dụng transistor và IC cách ly quang giúp cách ly hoàn toàn mạch điều khiển
(vi điều khiển) với rơ le bảo đảm vi điều khiển hoạt động ổn định. Có sẵn header rất
tiện dụng khi kết nối với vi điều khiển.
Module 4 relay 5V với Opto cách ly sử dụng chân kích mức thấp (0V), khi
có tín hiệu 0V vào chân IN thì relay sẽ đổi trạng thái. ứng dụng với relay module
khá nhiều bao gồm cả điện DC hay AC.
Thông số kỹ thuật:
- Tín hiệu kích: High (5V) hoặc Low (0V) chọn bằng Jumper.
ESP8266 tiêu thụ 170mA và module 4 Relay 5V tiêu thụ 200mA/1 Relay, nên
nhóm quyết định sử dụng Adapter 5V/2A làm nguồn cung cấp chính cho toàn mạch.
220V
AC
3.3V 5V
5v DC từ nguồn adapter
Khi cấp điện và khởi chạy ứng dụng trên đồng hồ thì tất cả trạng thái hiện tại
được cập nhật lên cơ sở dữ liệu firebase, trạng thái thiết bị được thiết đặt theo cơ sở dữ
liệu hiện tại.
Vi điều khiển được sử dụng là ESP8266 NodeMCU có chức năng đọc dữ liệu
từ cơ sở dữ liệu Firebase và điều khiển các thiết bị thông qua mạch giao tiếp relay.
4.2 Xây dựng ứng dụng điều khiển đèn, chuông trên smartwatch
Theo như mô hình đã thiết kế, ta sẽ sử dụng phần Android Studio tạo một ứng
dụng trên đồng hồ giải quyết yêu cầu đặt ra.
4.2.1 Giới thiệu phần mềm Android Studio
Được ra mắt vào ngày 16 tháng 5 năm 2013 tại hội nghị Google I/O. Android
Studio được phát hành miễn phí theo giấy phép Apache Licence 2.0. Android Studio ở
giai đoạn truy cập xem trước sớm bắt đầu từ phiên bản 0.1 vào tháng 5 năm 2013, sau
đó bước vào giai đoạn beta từ phiên bản 0.8 được phát hành vào tháng 6 năm 2014.
Phiên bản ổn định đầu tiên được ra mắt vào tháng 12 năm 2014, bắt đầu từ phiên bản
1.0.
Android Studio là môi trường lập trình dành cho các lập trình viên phát triển
ứng dụng cho các thiết bị chạy trên nền tảng Android. Ứng dụng sẽ được viết chủ yếu
bằng ngôn ngữ lập trình Java. Android studio sẽ sử dụng Android SDK (Android
software development kit) và Gradle tooling để convert những file này thành ứng
dụng Android. Nó cho phép biên dịch, đóng gói và deploy và khởi chạy ứng dụng sau
khi đã build xong.
Android SDK bao gồm cả ADB (Android Debug bridge) là 1 công cụ cho phép
ta kết nối tới các thiết bị máy ảo và máy thật để build ứng dụng. Nó cho phép ta quản
lý các thiết bị và hỗ trợ ta debug ứng dụng.
Hầu hết các file cấu hình trong Android đều dưới dạng XML. Android Studio
cung cấp các trình sửa file cho từng file riêng biệt.
Sau khi tải tệp tin cài đặt về, mở file .exe để tiến hành cài đặt. Nhấn Next →
Next → Next → Install để tiến hành cài đặt, quá trình cài đặt diễn ra từ 5 đến 10
phút:
Hình 4.3: Tiến hành quá trình cài đặt phần mềm Android Studio.
Tiếp theo nhấn Next và cuối cùng nhấn Finish. Tới đây quá trình cài đặt phần
mềm đã xong.
Hình 4.4: Kết thúc quá trình cài đặt phần mềm Android Studio.
- Chọn Start a new Android Studio project để tạo một project mới.
Màn hình Target Android Devices: Chọn thiết bị và phiên bản cho thiết bị.
+ Phone and Tablet: Ứng dụng cho điện thoại thông minh và máy tính bảng.
+ Wear: Ứng dụng cho đồng hồ thông minh.
+ Lưu ý:
Chúng ta sẽ phải chọn phiên bản API phù hợp với thiết bị sử dụng.
Add an Activity : Lựa chọn màn hình hiển thị cho ứng dụng. Ở đây, chúng ta
cần một màn hình trắng để thêm các button, switch, textview,...
Configure Activity: Cấu hình cho màn hình Activity mà mình mới lựa chọn:
Sau khi nhấn Finish, phần mềm sẽ tiến hành tạo project, tiến trình sẽ diễn ra từ
30 giây đến 1 phút.
Khi project đã được tạo, cửa sổ lập trình sẽ xuất hiện, thẻ MainActivity.java
sẽ hiện ra đầu tiên.
Thẻ MainActivity.java là nơi để viết chương trình chính cho phần mềm.
Thẻ AndroidManifest.xml nơi hiện các quyền và cấp quyền cho ứng dụng
truy cập phần cứng trên điện thoại.
- Thẻ app nơi khai báo các gói dịch vụ sẽ sử dụng trong ứng dụng :
+ Thẻ con Design cho phép chỉnh sửa trực tiếp ứng dụng bằng cách kéo
thả các biểu tượng, chỉnh sửa thông số của các biểu tượng:
+ Thẻ con Text sẽ cho phép thiết kế giao diện bằng các tập lệnh.
Cơ sở dữ liệu firebase, các bước để thêm firebase vào ứng dụng Android:
Firebase là nền tảng phát triển ứng dụng dành cho thiết bị di động và web
được phát triển bởi Firebase, Inc. Firebase cung cấp cơ sở dữ liệu thời gian thực và
chương trình phụ trợ. Cơ sở dữ liệu thời gian thực Firebase là cơ sở dữ liệu được lưu
trữ trên đám mây. Dữ liệu được lưu trữ dưới dạng JSON và được đồng bộ hóa theo
thời gian thực cho mọi thiết bị được kết nối.
- Trước tiên truy cập vào địa chỉ https://firebase.google.com/ giao diện hiển thị
như hình dưới:
- Tiếp theo ta nhấn vào nút LOG IN bên phải màn hình và đăng bằng tài khoản
Gmail bất kì, sau đó Chọn “GET STARTED” → “Add project” và đặt tên
cho Project trên Firebase, chọn quốc gia “Vietnam” → Chọn “CREATE
PROJECT”.
Android package name ta sẽ lấy tên package trong ứng dụng android qua, nhấn Save
app.
Bạn download file google-services.json và thêm vào chương trình android như hướng
dẫn hình trên.
Thêm các dòng lệnh như hình vào chương trình android của bạn. Nhấn following tới
đây việc add firebase coi như xong.
Vào Database chọn First steps ở Realtime Database → tích chọn Start in test mode để
cho phép đọc ghi → Activate.
Như vậy là database đã sẵn sàng ghi đọc dữ liệu từ ứng dụng android mà ta xây dựng.
BẮT ĐẦU
SAI
SW L1 ĐÓNG
ĐÚNG
SAI
SW L2 ĐÓNG
ĐÚNG
ĐẶT GIÁ TRỊ ĐẶT GIÁ TRỊ
FIREBASE tat FIREBASE sang
SAI
SW L3 ĐÓNG
ĐÚNG
B A
SAI
NHẤN NÚT BELL
ĐÚNG
B ĐÚNG
KẾT THÚC
- Sau khi đã tạo một project như các bước phía trên đã hướng dẫn, ta tiến hành
lập trình cho ứng dụng theo như lưu đồ đã viết và giao diện đã thiết kế:
+ Đầu tiên, ta chuyển tới thẻ activity_main.xml để tiến hành tạo giao diện cho
ứng dụng như đã thiết kế:
Tại thẻ con Text ta tiến hành tạo các switch và button cần thiết:
<Switch
android:id="@+id/switch1"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:layout_marginTop="30dp"
android:text="L1" />
<Switch
android:id="@+id/switch2"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:layout_marginTop="70dp"
android:text="L2" />
<Switch
android:id="@+id/switch3"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:layout_marginTop="110dp"
android:text="L3" />
<ImageButton
android:id="@+id/bell"
android:layout_width="87dp"
android:layout_height="58dp"
android:layout_gravity="right"
android:background="@drawable/button_img"
android:scaleType="fitCenter"
android:src="@drawable/chuong_on"
android:text="Bell" />
<ImageButton
android:id="@+id/off"
android:layout_width="87dp"
android:layout_height="58dp"
android:layout_gravity="right"
android:layout_marginTop="60dp"
android:background="@drawable/button_img"
android:src="@drawable/chuong_off"
android:scaleType="fitCenter"
android:text="OFF" />
<Button
android:id="@+id/sent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginTop="125dp"
android:background="@drawable/sos_img"
android:text="SOS" />
Theo như thiết kế ta sẽ hiện thị thời gian trên ứng dụng bằng các dòng lệnh.
<DigitalClock
android:id="@+id/digitalClock1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="150dp"
android:text="DigitalClock" />
Ta chọn Digitalclock là hiển thi giao diện đồng hồ số giúp dễ dàng quan sát hơn, giao
diện ứng dụng sẽ như sau:
+ Sau khi đã tạo giao diện ứng dụng, ta sẽ chuyển sang thẻ Activity_Main.java
để tiến hành lập trình cho các nút nhấn và switch đã được tạo ở thẻ
activity_main.xml.
myswitch1.setOnCheckedChangeListener(new
CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean
isChecked) {
if(isChecked)
{myfirebase.child("den11").child("trangthai").setValue("sang");}
else {myfirebase.child("den11").child("trangthai").setValue("tat");}
}
});
Do các switch có chức năng tương tự nhau nên nhóm em chỉ trình bày chương
trình của một 1 switch.
Khi các switch được kích hoạt bằng cách gạt qua phải thì hàm isChecked được
gọi, tín hiệu sẽ được gửi lên firebase thông qua mạng wifi, sau đó firebase sẽ tiến hành
thay đổi trạng thái của các “child” tương ứng với các switch đã cài đặt lần lượt là:
den11, den12, den13 từ “tat” sang “sang” và ngược lại.
mysent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myfirebase.child("SENT").setValue("yes");
}
});
mybell.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myfirebase.child("bell").child("trangthai").setValue("sang");
}
});
offbell.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myfirebase.child("bell").child("trangthai").setValue("tat");
}
});
Tương tự như các switch, khi các nút nhấn được kích hoạt bằng cách chạm vào
biểu tượng thì hàm onClick được gọi, tín hiệu sẽ được gửi lên firebase, sau đó
firebase sẽ tiến hành thay đổi trạng thái của các “child” tương ứng với các nút nhấn đã
được cài đặt lần lượt là: bell từ “tat” sang “bat”, SENT từ “no” sang “yes”.
4.3 XÂY DỰNG ỨNG DỤNG KHẨN CẤP SOS TRÊN ĐIỆN THOẠI
Với các yêu cầu đã đặt ra trong thiết kế ta sẽ tiến hành tạo một ứng dụng trên
điện thoại bằng phần mềm Android Studio đã trình bày ở phần thi công trên điện
thoại.
Tạo project Android cho điện thoại tương tự như các bước tạo project trên
đồng hồ, sau đó ta tạo Layout Resource File với tên start_activity.xml:
Ta sẽ sử dụng LinearLayout để cho phép bố trí các view theo chiều dọc và chiều
ngang. Xếp các view theo chiều dọc và căn giữa với lệnh:
android:orientation="vertical"
android:gravity="center"
Và giờ ta sẽ thêm thêm một EditText để nhập số điện thoại khẩn cấp:
<EditText
android:id="@+id/edt_nhap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Enter the emergency number"/>
<Button
android:id="@+id/btnstart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="confirm"
android:layout_gravity="center"
/>
Hình 4.25: Giao diện xác nhận số điện thoại khẩn cấp.
Thẻ activity_main.xml sẽ gồm một TextView hiển thị số điện thoại đã nhập và
một TextView hiển thị báo hiệu ứng dụng đang chạy được tạo bằng code như sau:
<TextView
android:gravity="center"
android:text="SDT:"
android:textSize="20sp"
android:textStyle="bold"
android:id="@+id/tvsdt"
android:layout_width="match_parent"
android:layout_height="50dp"
/>
<TextView
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SOS is running...."
/>
Hình 4.26: Giao diện thông báo SOS đang hoạt động.
Tới đây thì phần giao diện và hiển thị coi như xong, và vì ứng dụng sẽ gửi tin
nhắn, gọi điện và sử dụng định vị nên ta cần phải cấp các quyền này cho ứng dụng
bằng cách mở thẻ Androidmanifest.xml và thêm các dòng sau vào phần khai báo:
Lưu đồ startActivity.java
Tiếp theo ta sẽ chuyển qua MainActivity và truyền chuỗi số điện thoại qua:
Lưu đồ MainActivity.java
Xử lý trong handler:
Khởi tạo một trình xếp lịch chạy mới thời gian delay là 5000 mili giây.
Khi hết thời gian delay thì chạy hai dòng lệnh bên trong là
myfirebase.child(“SENT”).setValue(“no”); có chức năng đặt giá trị nhánh
“SENT” của Firebase thành chuỗi “no”. call(sdt) có chức năng gọi chương
trình gọi điện call và truyền vào chương trình này chuỗi sdt.
Hình 4.30: Lưu đồ hoạt động của chương trình gửi tin nhắn.
Chương trình gửi tin nhắn với phoneNo được gán bằng chuỗi sdt.
try {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, message, null, null);
Toast.makeText(getApplicationContext(), "SMS sent.",
Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "SMS faild, please try again.",
Toast.LENGTH_LONG).
show();
e.printStackTrace();
@Override
public void onProviderEnabled(String provider) {
@Override
public void onProviderDisabled(String provider) {
Intent intent = new
Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
};
if (ActivityCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[]
permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the
documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
locationManager.requestLocationUpdates("gps", 60000, 0, locationListener);
}
Với yêu cầu thiết kế mô hình nhỏ gọn và tiện dụng, nhóm em quyết định thiết
kế và thi công mô hình trên cùng một bảng mạch như sau:
Môi trường phát triển tích hợp (IDE) của Arduino là một ứng dụng đa nền tảng
được viết bằng Java, và từ IDE này sẽ được sử dụng cho Ngôn ngữ lập trình xử lý
(Processing programming language) và project Wiring. Nó được thiết kế để dành cho
những người mới tập làm quen với lĩnh vực phát triển phần mềm. Nó bao gồm một
chương trình code editor với các chức năng như đánh dấu cú pháp, tự động brace
matching, và tự động canh lề, cũng như compile(biên dịch) và upload chương trình lên
board chỉ với 1 cú nhấp chuột. Một chương trình hoặc code viết cho Arduino được gọi
là một sketch.
Các chương trình Arduino được viết bằng C hoặc C++. Arduino IDE đi kèm với một
thư viện phần mềm được gọi là "Wiring", từ project Wiring gốc, có thể giúp các thao
tác input/output được dễ dàng hơn. Người dùng chỉ cần định nghĩa 2 hàm để tạo ra
một chương trình vòng thực thi (cyclic executive) có thể chạy được:
● setup(): hàm này chạy mỗi khi khởi động một chương trình, dùng để thiết
lập các cài đặt
● loop(): hàm này được gọi lặp lại cho đến khi tắt nguồn board mạch
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage
level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage
LOW
delay(1000); // wait for a second
}
- Cách cài đặt và tạo project arduino IDE: Truy cập vào trang web:
https://www.arduino.cc/en/Main/Software tải về chương trình arduino IDE phù hợp
với hệ điều hành của máy tính đang dùng. Giải nén file .rar vừa tải về ta được thư mục
như hình.
Sau đó nhấn vào biểu tượng arduino (Application) để khởi chạy phần
mềm.
● Arduino Toolbar: có một số button và chức năng của chúng như sau :
○ Sketch menu :
■ Verify/ Compile : chức năng kiểm tra lỗi code.
■ Show Sketch Folder : hiển thị nơi code được lưu.
■ Add File : thêm vào một Tab code mới.
■ Include Library : thêm thư viện cho IDE.
- Cài đặt driver:
Để máy tính và boad arduino giao tiếp được với nhau ta phải cài driver, đầu tiên ta
chạy file arduino-1.8.5-windows\arduino-1.8.5\drivers\dpinst-amd64 từ thư mục giải
nén. Cửa sổ “Device Driver Installation Wizard” hiện ra, ta chọn Next để tiếp tục.
Quá trình cài đặt mất khoảng 10s sau đó ta bấm “Finish” để hoàn tất.
Hình 4.37: Cửa sổ hoàn thành quá trình cài đặt Driver Arduino.
Vào Sketch → Include Library → Manage Libraries.. sau đó gõ vào thanh tìm
kiếm thư viện cần cài đặt và nhấn Install ở góc phải.
Sau khi cài thành công thư viện ta sẽ thấy chữ INSTALLED như trên hình.
Với yêu cầu điều khiển đã nêu như ở trên ta thiết lập được lưu đồ hệ thống như sau:
Ta sử dụng vi điều khiển để đọc dữ liệu từ firebase thông qua mạng wifi nên
cần phải khai báo hai thư viện liên quan.
#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
Các ngõ ra được sử dụng của của vi điều khiển và các biến sẽ được định nghĩa
và khai báo như sau:
#define DEN1 D4
#define DEN2 D3
#define DEN3 D2
#define BELL D1
String IDden1 = "den11";
String IDden2 = "den12";
String IDden3 = "den13";
String IDbell = "bell";
int onlyt1=1,onlys1=1;
int onlyt2=1,onlys2=1;
int onlyt3=1,onlys3=1;
int onlyt4=1,onlys4=1;
Các ngõ vào ra D4, D3, D2, D1 lần được định nghĩa trong trương trình là
DEN1, DEN2, DEN3 và BELL. Và khai báo các chuỗi các biến sử dụng..
Tiếp theo đó hàm void setup() sẽ được gọi một lần duy nhất để thiết lập các giá
trị ban đầu, rồi đến hàm void loop() sẽ được lặp đi lặp lại cho đến khi ngừng cấp điện
hoặc reset.
void setup() {
pinMode(DEN1, OUTPUT);
pinMode(DEN2, OUTPUT);
pinMode(DEN3, OUTPUT);
pinMode(BELL, OUTPUT);
WiFi.mode(WIFI_OFF);
delay(50);
Serial.begin(115200);
delay(10);
setupWifi();
setupFirebase();
}
DEN1, DEN2, DEN3, BELL là các thiết bị mà ta sẽ điều khiển nên phải khai
báo là ngõ ra. Sử dụng Serial với tốc độ baud bằng 115200 để kết nối hiển thị lên máy
tính các thông tin tiến trình mà ta muốn giúp tiện theo dõi trong quá trình build
chương trình.
Kết nối wifi cho ESP: Phải đảm bảo đã khai báo thư viện wifi như bên trên đã
nêu. Trong hàm setupWifi thêm vào dòng lệnh sau :
WiFi.begin(wifiName, wifiPass);
Serial.println("Hey i 'm connecting...");
while (WiFi.status() != WL_CONNECTED) {
Serial.println(".");
delay(500);
Khởi động wifi với wifiName và wifiPass lần lượt là địa chỉ SSID và mật khẩu
wifi mà ta muốn kết nối. Sau đó in ra màn hình thông báo kết nối, in kí tự dấu chấm
cho đến khi kết nối thành công.
#include <ESP8266WiFi.h>
Tiếp theo ta thiết đặt kết nối Firebase trong chương trình Arduino bằng các lệnh:
void setupFirebase() {
Firebase.begin(firebaseURl, authCode);
}
Trong hàm setupFirebas(): Ta có lệnh Firebase.begin(firebaseURl, authCode)
để khởi tạo esp với dữ liệu thông tin trong tài khoản firebase đã tạo.
firebaseURl: Máy chủ lưu trữ database firebase của bạn, trong ứng dụng này là:
android-vanba.firebaseio.com. Bạn lấy địa trên tại giao diện Firebase như hình dưới.
authCode: Đây là mã riêng của bạn, các bước lấy mã như hình dưới:
Hàm void loop() sẽ lặp đi lặp lại với hàm getData() bên trong. Hàm getData
chính là nơi đọc dữ liệu firebase về để điều khiển ngõ ra. Dữ liệu đọc về lần lượt tại
các nhánh đích là IDden1, IDden2, IDden3, IDbell. Quy trình đọc dữ liệu và xử lý tại
các nhánh là như nhau, nhóm sẽ trình bày chi tiết lưu đồ xử lý tại nhánh đích là
IDden1.
if(trangthai!="\0")
{
if(trangthai=="sang")
{ if(onlys1==1)
{
Firebase.setString(IDden1+"/TT","sang");
onlys1=0;
onlyt1=1;
};
digitalWrite(DEN1,LOW);
}else
{
if(onlyt1==1)
{
Firebase.setString(IDden1+"/TT","tat");
onlyt1=0;
onlys1=1;
};
digitalWrite(DEN1,HIGH);
}
}
Bắt đầu ta chọn nhánh đích làm việc từ firebase ở đây là IDden1 mà trong phần
định nghĩa ta đã định nghĩa nó là “den11”. Sau đó ta sẽ giá trị nhánh “trang thai”
thuộc IDden1. Giao diện thực tế firebase như sau:
Ta chỉ xử lý tiếp khi giá trị trạng thái khác rỗng. Ta sẽ có hai biến onlys1 và
onlyt1 là hai biến tương đồng với trạng thái ngõ ra quy định onlys1 bằng 1 đèn sáng,
onlyt1 bằng 1 đèn tắt, hai biến này giúp phản hồi là thiết bị ở trạng thái bật hay tắt. Cụ
thể như sau: Ban đầu ta đã gán onlys1 và onlyt1 bằng 1.
Nếu đọc được trạng thái là “sang” thì sẽ đặt nhánh phản hồi “TT” với giá trị là
“sang” và gán onlys1 bằng 0, onlyt1 bằng 1, để nếu vòng lặp quay lại mà không thay
đổi giá trị đọc về thì ta sẽ không cần phản hồi lại. Sau đó xuất mức thấp ra chân DEN1
cho phép đèn 1 sáng.
Ngược lại nếu đọc được trạng thái khác “sang” thì phương thức xử lý cũng
tương tự như trên, phản hổi “TT” sẽ là “tat”, onlyt1 bằng 0, onlys1 bằng 1. Sau đó
xuất mức cao ra chân DEN1 điề khiển đèn 1 tắt.
Bước 1: Đảm bảo đồng hồ và điện thoại được kết nối với nhau, kết nối wifi,
cấp nguồn cho mạch điều khiển và thiết bị điện. Nếu là lần đầu sử dụng đồng hồ, truy
cập https://www.asus.com/vn/support/FAQ/1009103/ và làm theo hướng dẫn để tiến
hành kết nối 2 thiết bị.
Bước 2: Khởi động các ứng dụng trên điện thoại và đồng hồ từ biểu tượng ứng
dụng.
Sau khi mở ứng dụng ta sẽ thấy giao như trên. Bạn nhập số điện thoại cần gửi
tin nhắn khẩn cấp vào vị trí “Enter the emergency number” sau đó nhấn CONFIRM để
tiếp tục.
Bây giờ số điện thoại bạn vừa nhập sẽ hiện trên màn hình, bạn chỉ cần nhập
một lần đầu khi khởi động ứng dụng và để ứng dụng luôn chạy. Những thao tác tiếp sẽ
thực hiện trên đồng hồ, nên đến đây thao tác ứng dụng điện thoại coi như xong.
Hình 4.48: Màn hình của ứng dụng trên đồng hồ.
: Bật chuông báo khẩn cấp, khi cần sự trợ giúp của người xung
quanh.
: Gửi tin nhắn với nội dung “ Tôi cần sự giúp đỡ”, thực hiện
cuộc gọi và gửi tọa độ hiện tại tới số điện thoại mặc định đã chọn trước.
Bước 3: Ta có thể truy cập trực tiếp vào địa chỉ https://firebase.google.com/
làm theo hướng dẫn bên dưới để theo dõi trạng thái các thiết bị và điều khiển trực tiếp
tại đây.
Tiếp theo ta bấm nút GET STARTED sẽ hiện ra màn hình đăng nhập như sau:
Ta sử dụng tài khoản Gmail đăng ký trước đó để đăng nhập, mở dự án ra và chọn mục
database trong develop.
Khi này giao diện hiện ra như hình dưới, bạn tương tác điều khiển trực tiếp tại đây.
Trạng thái chuông được hiển thị tại bell--trangthai: “tat”, chữ tat ở đây có
nghĩa là chuông đang tắt. Để bật chuông bạn thay chữ tat bằng chữ bat nhập từ bàn
phím. Tương tự cho trạng thái den11, den12 và den13. Trạng thái tin nhắn và cuộc
gọi khẩn cấp được hiển thị tại SENT: “no”, chữ no có nghĩa là chưa cho phép kích
hoạt tin nhắn và cuộc gọi khẩn cấp, để kích hoạt ta thay chữ no bằng chữ yes. TT là
trạng thái phản hồi của phần cứng.
Hình 5.2: Giao diện khi gửi tin nhắn, nội dung tin nhắn.
Hình 5.4: Điều khiển khi chưa cấp nguồn mạch điều khiển đèn, chuông.
Khi mạch điều khiển được cấp nguồn nhánh phản hồi sẽ thay đổi theo trạng thái
phần cứng.
Hình 5.5: Điều khiển khi đã cấp nguồn mạch điều khiển đèn, chuông.
o Bắt buộc phải kết nối Bluetooth với điện thoại để thực hiện việc chia sẻ
dịch vụ GPS. Bán kính kết nối của Bluetooth giữa điện thoại và đồng hồ
thông minh là khoảng 10m.
[7] Vũ An, “Lịch sử hệ điều hành Android qua các phiên bản”,
https://quantrimang.com/lich-su-he-dieu-hanh-android-qua-cac-phien-ban-147772 ,
2018.
[12] Sagar Khan, “Update Location data using android app in firebase database”,
https://stackoverflow.com/questions/42588084/update-location-data-using-android-
app-in-firebase-database, 2017.
PHỤ LỤC
Code đồng hồ:
MainActivity.java
package com.example.s46c.dongho3;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.wearable.activity.WearableActivity;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Button;
import android.widget.Switch;
import com.firebase.client.Firebase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mysent.setOnClickListener(new View.OnClickListener() {
}
});
mybell.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myfirebase.child("bell").child("trangthai").setValue("sang");
}
});
offbell.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myfirebase.child("bell").child("trangthai").setValue("tat");
}
});
myswitch1.setOnCheckedChangeListener(new
CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean
isChecked) {
if(isChecked)
{myfirebase.child("den11").child("trangthai").setValue("sang");}
else {myfirebase.child("den11").child("trangthai").setValue("tat");}
}
});
myswitch2.setOnCheckedChangeListener(new
CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean
isChecked) {
if(isChecked)
{myfirebase.child("den12").child("trangthai").setValue("sang");}
else {myfirebase.child("den12").child("trangthai").setValue("tat");}
myswitch3.setOnCheckedChangeListener(new
CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean
isChecked) {
if(isChecked)
{myfirebase.child("den13").child("trangthai").setValue("sang");}
else {myfirebase.child("den13").child("trangthai").setValue("tat");}
}
});
setAmbientEnabled();
}
Activity_main.xml
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/inner_frame_layout_padding"
app:boxedEdges="all">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name" />
<Switch
android:id="@+id/switch1"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:layout_marginTop="30dp"
android:text="L1" />
<Switch
android:id="@+id/switch2"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:layout_marginTop="70dp"
android:text="L2" />
<Switch
android:id="@+id/switch3"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:layout_marginTop="110dp"
android:text="L3" />
<ImageButton
android:id="@+id/bell"
android:layout_width="87dp"
android:layout_height="58dp"
android:layout_gravity="right"
android:background="@drawable/button_img"
android:scaleType="fitCenter"
android:src="@drawable/chuong_on"
android:text="Bell" />
<ImageButton
android:id="@+id/off"
android:layout_width="87dp"
android:layout_height="58dp"
android:layout_gravity="right"
android:layout_marginTop="60dp"
android:background="@drawable/button_img"
android:src="@drawable/chuong_off"
android:scaleType="fitCenter"
android:text="OFF" />
<Button
android:id="@+id/sent"
<DigitalClock
android:id="@+id/digitalClock1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="150dp"
android:text="DigitalClock" />
</FrameLayout>
</android.support.wear.widget.BoxInsetLayout>
androidManifest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@android:style/Theme.DeviceDefault">
<uses-library
android:name="com.google.android.wearable"
android:required="true" />
<meta-data
android:name="com.google.android.wearable.standalone"
android:value="true" />
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</manifest>
Build.gradle(App)
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.example.s46c.dongho3"
minSdkVersion 25
targetSdkVersion 27
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-
rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.google.android.support:wearable:2.3.0'
implementation 'com.google.android.gms:play-services-wearable:12.0.1'
implementation 'com.android.support:percent:27.1.0'
implementation 'com.android.support:support-v4:27.1.0'
implementation 'com.android.support:recyclerview-v7:27.1.0'
implementation 'com.android.support:wear:27.1.0'
compileOnly 'com.google.android.wearable:wearable:2.3.0'
compile 'com.google.firebase:firebase-database:12.0.1'
compile 'com.google.firebase:firebase-core:12.0.1'
compile 'com.firebase:firebase-client-android:2.5.2'
}
apply plugin: 'com.google.gms.google-services'
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
btn = findViewById(R.id.btnstart);
edt_sdt = findViewById(R.id.edt_nhap);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String sdt = edt_sdt.getText().toString();
byExtras(sdt);
}
});
}
MainActivity:
package com.example.s46c.sos_firebase;
import android.content.ActivityNotFoundException;
import com.firebase.client.DataSnapshot;
import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;
import com.firebase.client.ValueEventListener;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
Firebase myfirebase;
private LocationManager locationManager;
private LocationListener locationListener;
private TextView TVSDT;
private DatabaseReference mData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Firebase.setAndroidContext(this);
myfirebase = new Firebase("https://android-vanba.firebaseio.com");
mData = FirebaseDatabase.getInstance().getReference();
location();
myfirebase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (((String) dataSnapshot.child("SENT").getValue()).equals("yes")) {
sendSMSMessage(sdt);
Handler j = new Handler();
j.postDelayed(new Runnable() {
@Override
public void run() {
myfirebase.child("SENT").setValue("no");
call(sdt);
}
}, 5000);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Toast.makeText(getApplicationContext(), "Error",
Toast.LENGTH_LONG).show();
}
});
}
try {
SmsManager smsManager = SmsManager.getDefault();
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
@Override
public void onProviderEnabled(String provider) {
@Override
public void onProviderDisabled(String provider) {
Intent intent = new
if (ActivityCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[]
permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the
documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
locationManager.requestLocationUpdates("gps", 60000, 0, locationListener);
}
Activity_start.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_margin="16dp"
android:orientation="vertical"
android:gravity="center"
android:id="@+id/activity_mian"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/edt_nhap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Enter the emergency number"/>
<Button
Activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_margin="16dp"
android:orientation="vertical"
android:id="@+id/activity_mian"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:gravity="center"
android:text="SDT:"
android:textSize="20sp"
android:textStyle="bold"
android:id="@+id/tvsdt"
android:layout_width="match_parent"
android:layout_height="50dp"
/>
<TextView
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SOS is running...."
/>
</LinearLayout>
Androidmanifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.s46c.sos_firebase">
</manifest>
Build.gradle(App):
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.example.s46c.sos_firebase"
minSdkVersion 22
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-
rules.pro'
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
implementation 'com.google.firebase:firebase-database:11.8.0'
compile 'com.google.firebase:firebase-core:11.8.0'
compile 'com.firebase:firebase-client-android:2.5.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-
core:3.0.2'
}
int onlyt1=1,onlys1=1;
int onlyt2=1,onlys2=1;
int onlyt3=1,onlys3=1;
int onlyt4=1,onlys4=1;
void setupFirebase() {
Firebase.begin(firebaseURl, authCode);
}
void setupWifi() {
//kết nối wifi với tên và mật khẩu từ hai mảng đã lưu
WiFi.mode(WIFI_OFF);
delay(50);
Serial.begin(115200);
delay(10);
setupWifi();
setupFirebase();
}
void getData() {
if(trangthai!="\0")
{
if(trangthai=="sang")
{ if(onlys1==1)
{
Firebase.setString(IDden1+"/TT","sang");
onlys1=0;
onlyt1=1;
};
digitalWrite(DEN1,LOW);
}else
{
if(onlyt1==1)
{
Firebase.setString(IDden1+"/TT","tat");
onlyt1=0;
if(trangthai2!="\0")
{
if(trangthai2=="sang")
{ if(onlys2==1)
{
Firebase.setString(IDden2+"/TT","sang");
onlys2=0;
onlyt2=1;
};
digitalWrite(DEN2,LOW);
}else
{
if(onlyt2==1)
{
Firebase.setString(IDden2+"/TT","tat");
onlyt2=0;
onlys2=1;
};
digitalWrite(DEN2,HIGH);
}
}
if(trangthai3!="\0")
{
if(trangthai3=="sang")
{ if(onlys3==1)
{
Firebase.setString(IDden3+"/TT","sang");
onlys3=0;
if(trangthai4!="\0")
{
if(trangthai4=="sang")
{ if(onlys4==1)
{
Firebase.setString(IDbell+"/TT","sang");
onlys4=0;
onlyt4=1;
};
digitalWrite(BELL,LOW);
}else
{
if(onlyt4==1)
{
Firebase.setString(IDbell+"/TT","tat");
onlyt4=0;
onlys4=1;
};
digitalWrite(BELL,HIGH);
}
}
}
void loop() {
getData();
}