(Đồ án tốt nghiệp) điều khiển và giám sát thiết bị trong nhà với sự hỗ trợ của google assistant

69 18 0
(Đồ án tốt nghiệp) điều khiển và giám sát thiết bị trong nhà với sự hỗ trợ của google assistant

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

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

Thông tin tài liệu

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH ĐỒ ÁN TỐT NGHIỆP NGÀNH CƠNG NGHỆ KỸ THUẬT MÁY TÍNH ĐIỀU KHIỂN VÀ GIÁM SÁT THIẾT BỊ TRONG NHÀ VỚI SỰ HỖ TRỢ CỦA GOOGLE ASSISTANT GVHD: NGUYỄN THANH HẢI SVTH: NGUYỄN THÀNH TRUNG MSSV: 13119157 SVTH: TRẦN THÀNH PHÁT MSSV: 13119121 SKL005437 Tp Hồ Chí Minh, tháng 01/2019 TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH KHOA CHẤT LƯỢNG CAO - ĐỒ ÁN TỐT NGHIỆP NGÀNH CÔNG NGHỆ KỸ THUẬT MÁY TÍNH ĐỀ TÀI: ĐIỀU KHIỂN VÀ GIÁM SÁT THIẾT BỊ TRONG NHÀ VỚI SỰ HỖ TRỢ CỦA GOOGLE ASSISTANT GVHD: PGS.TS NGUYỄN THANH HẢI SV: NGUYỄN THÀNH TRUNG SV: TRẦN THÀNH PHÁT MSSV: 13119157 MSSV: 13119121 TP HỒ CHÍ MINH - 1/2019 i TP HCM, ngày 14 tháng năm 2019 NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: Chuyên ngành: Hệ đào tạo: Khóa: I TÊN ĐỀ TÀI: ĐIỀU KHIỂN VÀ GIÁM SÁT THIẾT BỊ TRONG NHÀ VỚI SỰ HỖ TRỢ CỦA GOOGLE ASSISTANT II NHIỆM VỤ Các số liệu ban đầu: - chatbot tạo tảng Dialogflow - kit raspberry Pi2 - nodeMCU 0.9 - wemos d1 - Module sim 800A Nội dung thực hiện: - Tìm hiểu tảng Dialogflow tạo chatbot dựa tảng - Tìm hiểu kit Raspberry Pi ngơn ngữ lập trình Python - Tạo webhook để nhận liệu từ Google Assistant Dialogflow, kết nối với Firebase Database, xử lí liệu để trả lại đồng thời điều khiển thiết bị nhà - Tìm hiểu tạo Firebase Cloud Message gửi thông báo cho điện thoại có xảy kiện III NGÀY GIAO NHIỆM VỤ: 1/10/2018 IV NGÀY HOÀN THÀNH NHIỆM VỤ: 15/1/2019 V HỌ VÀ TÊN CÁN BỘ HƯỚNG DẪN: PGS.TS Nguyễn Thanh Hải CÁN BỘ HUỚNG DẪN KHOA ĐÀO TẠO CHẤT LƯỢNG CAO ii PHIẾU NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN Họ tên Sinh viên: MSSV: Ngành: Tên đề tài: Họ tên Giáo viên hướng dẫn: NHẬN XÉT Về nội dung đề tài & khối lượng thực hiện: Ưu điểm: Khuyết điểm: Đề nghị cho bảo vệ hay không? Đánh giá loại: Điểm:……………….(Bằng chữ: ) Tp Hồ Chí Minh, ngày tháng năm 20… Giáo viên hướng dẫn (Ký & ghi rõ họ tên) iii PHIẾU NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN Họ tên Sinh viên: MSSV: Ngành: Tên đề tài: Họ tên Giáo viên hướng dẫn: NHẬN XÉT Về nội dung đề tài & khối lượng thực hiện: Ưu điểm Khuyết điểm: Đề nghị cho bảo vệ hay không? Đánh giá loại: Điểm:……………….(Bằng chữ: ) Tp Hồ Chí Minh, ngày tháng năm 20… Giáo viên hướng dẫn (Ký & ghi rõ họ tên) iv LỜI CẢM ƠN Trong thời gian làm đồ án tốt môn học, em nhận nhiều giúp đỡ, đóng góp ý kiến bảo nhiệt tình thầy cơ, gia đình bạn bè Nhóm em xin gửi lời cảm ơn chân thành đến GVHD Nguyễn Thanh Hải, giảng viên Khoa Điện – Điện Tử - Trường ĐH Sư Phạm Kỹ Thuật TP.HCM, người tận tình hướng dẫn, bảo em suốt trình làm đồ án Nhóm em xin chân thành cảm ơn thầy cô giáo trường ĐH Sư Phạm Kỹ Thuật TP.HCM nói chung, thầy Khoa Chất Lượng Cao nói riêng dạy dỗ cho em kiến thức môn đại cương môn chuyên ngành, giúp em có sở lý thuyết vững vàng tạo điều kiện giúp đỡ em suốt trình học tập Cuối cùng, em xin chân thành cảm ơn gia đình bạn bè, ln tạo điều kiện, quan tâm, giúp đỡ, động viên em suốt q trình học tập hồn thành đồ án môn học Sinh viên thực Nguyễn Thành Trung Trần Thành Phát v TÓM TẮT Trong năm gần người ta thường nhắc nhiều đến AI (trí tuệ nhân tạo) ứng dụng rộng rãi chúng Nhóm em thích thú biết thành tựu mà trí tuệ nhân tạo mang lại tương lai, đặc biệt ứng dụng hiệu chatbot kinh doanh khoa học kỹ thuật Để bắt kịp xu hướng đó, nhóm chúng em định chọn chatbot – Google Assistant làm đối tượng nghiên cứu ứng dụng cụ thể vào điều khiển nhà thông minh Trong đề tài nhóm em, thiết bị thông minh thiết kế sử dụng Raspberry Pi cho việc điều khiển giám sát thiết bị nhà thông qua việc giao tiếp với Google Assistant, Diaglogflow, Firebase Một số thiết bị điều khiển thông qua việc lệnh cho Google Assistant: điều khiển mở/tắt thiết bị gia dụng, giám sát nhiệt độ độ ẩm nhà, mở/tắt tất thiết bị lúc thiết bị vi MỤC LỤC TRANG PHỤ BÌA i NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP ii PHIẾU NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN iii PHIẾU NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN iv LỜI CẢM ƠN v TÓM TẮT vi LIỆT KÊ HÌNH VẼ xi LIỆT KÊ BẢNG xiii Chương TỔNG QUAN 1.1 ĐẶT VẤN ĐỀ 1.2 MỤC TIÊU 1.3 NỘI DUNG NGHIÊN CỨU 1.4 GIỚI HẠN 1.5 BỐ CỤC Chương CƠ SỞ LÝ THUYẾT 2.1 TỔNG QUAN VỀ CHATBOT – GOOGLE ASSISTANT .4 2.1.1 Khái niệm chatbot 2.1.2 Google Assistant 2.1.3 Xử lý ngôn ngữ tự nhiên (Natural Language Processing) 2.2 TỔNG QUAN VỀ API 2.2.1 Khái niệm API 2.2.2 Mơ hình API 2.2.3 Các tác vụ thực qua API 2.3 WEBHOOK 2.3.1 Khái niệm Webhook 2.3.2 Hoạt động Webhook 2.4 TỔNG QUAN VỀ DIALOGFLOW 2.5 TỔNG QUAN VỀ FIREBASE 10 2.5.1 Firebase Realtime Database 10 2.5.2 Kết nối Firebase Database với Diaglogflow 10 vii MỤC LỤC 2.6 TỔNG QUAN VỀ RASPBERRY PI 12 2.6.1 Giới thiệu Board Raspberry Pi 12 2.6.2 Phần cứng Raspberry Pi 13 2.6.3 Hệ điều hành Raspbian cho kit Raspberry Pi 13 2.7 NodeMCU 0.9 (ESP-12) 14 2.7.1 Esp8266 14 Chương CƠ SỞ LÝ THUYẾT (TIẾP THEO) 17 3.1 THÀNH PHẦN KHỐI TRUNG TÂM 17 3.2 THÀNH PHẦN KHỐI ĐIỀU KHIỂN THIẾT BỊ 17 3.2.1 Relay Module 18 3.2.2 Mạch cấp nguồn 19 3.3 THÀNH PHẦN KHỐI BÁO HỎNG 19 3.3.1 Kit Wemos D1 20 3.3.2 Cảm biến ánh sáng K1C4-3 21 3.3.3 Cảm biến dòng ACS712 21 3.4 THÀNH PHẦN KHỐI CẢNH BÁO 22 3.4.1 Module cảm biến lửa 23 3.4.2 Module cảm biến khói, gas MQ4 23 3.4.3 Module sim 800A 23 3.4.4 Mạch giảm áp LM2596 24 3.5 KHỐI NGUỒN 24 Chương THIẾT KẾ HỆ THỐNG 26 4.1 GIỚI THIỆU 26 4.2 THIẾT KẾ DIALOGFLOW 27 4.2.1 Cách thức hoạt động Google Assistant với Dialogflow 27 4.2.2 Thiết lập mẫu đối thoại cho Trợ lý ảo 28 4.3 TRUNG TÂM RASPBERRY PI 32 4.3.1 Mô hình, bố cục 32 4.3.2 Trung tâm Raspberry khối vệ tinh 33 Chương KẾT QUẢ, NHẬN XÉT, ĐÁNH GIÁ 38 5.1 KẾT QUẢ 38 viii MỤC LỤC 5.1.1 Google Assistant trợ lý ảo điều khiển thiết bị 38 5.1.2 Firebase Realtime Database 39 5.1.4 Mô hình phần cứng 41 5.2 NHẬN XÉT VÀ ĐÁNH GIÁ 41 6.1 KẾT LUẬN 43 6.2 HƯỚNG PHÁT TRIỂN 43 ix CHƯƠNG 5: KẾT QUẢ, NHẬN XÉT, ĐÁNH GIÁ 5.1.4 Mơ hình phần cứng Sau nhiều tuần thực hiện, hệ thống thiết lập nên Kết nối chặt chẽ với mơ hình socket client với trung tâm Raspberry Pi Hình 5.5: Hệ thống sản phẩm 5.2 NHẬN XÉT VÀ ĐÁNH GIÁ Ưu điểm: Dễ dàng lệnh bật/tắt thiết bị bằng giọng nói khơng rãnh tay Thủ thuật nhanh gọn Có tính bảo mật hệ thống xử lý theo mơ hình server client Đường truyền phản hồi nhanh ổn định từ Firebase xuống thiết bị Dễ dàng phát thiết bị hư hỏng, điện vị trí xác khu vực quy mô lớn cơng ty xí nghiệp,… để kịp thời tới sửa chữa bảo trì 41 CHƯƠNG 5: KẾT QUẢ, NHẬN XÉT, ĐÁNH GIÁ Nhược điểm: Tính ổn định hệ thống chưa cao chất lượng vi xử lý, cảm biến lập trình Chưa thống kê thời gian sử dụng thiết bị gợi ý tiết kiệm điện Mơ hình hệ thống chưa thẩm mỹ, chưa nhỏ gọn Chưa có nhiều tính nâng cao 42 CHƯƠNG KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN Chương 6: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 6.1 KẾT LUẬN Bám sát mục tiêu đề ra, nhóm thực thành công việc thiết kế hệ thống điều khiển bằng giọng nói với hỗ trợ Google Assistant giám sát bằng cảm biến; với mô hình socket server – client liệu thơng qua trung tâm Raspberry Pi Trong đó, hệ thống kết nối chặt chẽ với tính bảo mật quan tâm hàng đầu Phương pháp điều khiển bằng giọng nói dễ tiếp cận, thao tác nhanh Trong trường hợp khác nhau, khả nhân diện giọng nói smartphone bị ảnh hưởng: Mơi trường Yên tĩnh Yên tĩnh xung quanh nói chuyện xung quanh nói chuyện xung quanh nói chuyện 6.2 HƯỚNG PHÁT TRIỂN Việc sử dụng trí tuệ nhân tạo API từ hãng lớn trở nên phổ biến giúp người lập trình dễ dàng tiếp cận, sử dụng chúng tùy biến thiết bị, smartphone trở nên tiện lợi thông minh Hiện nay, có nhiều hướng phát triển đề tài nhóm em hỏi trợ lý tình trạng thiết bị nào, sau thời gian sử dụng làm quen với trợ lý giúp chủ nhân tối ưu thời gian tiết kiệm điện, nhắc nhở lưu ý đến trường hợp xấu xảy để đề phòng khắc phục nhanh chóng Ngồi ta tích hợp thêm chế độ hẹn bật /tắt thiết bị bằng giọng nói cho trợ lý ảo 43 TÀI LIỆU THAM KHẢO [1] Dẫn chứng: https://successoceans.com/chatbot-facebook-messenger.html [2] Tham khảo Đồ Án Tốt Nghiệp Nguyễn Minh Hùng 14141139 “Ứng dụng chatbot vào điều khiển nhà thông minh” - 2018 [3] Trang chủ Raspberry : https://www.raspberrypi.org [4] Tài liệu website Dialogflow: https://dialogflow.com/docs/getting-started Nick Quinlan, “What’s a webhook”, www.sendgrid.com, 2014 [6] Sachin Kumar, “How to create a chatbot using Dialogflow Enterprise Edition and Dialogflow API V2”, 2018 [7] Website datasheet linh kiện: alldatasheet.com [8] Arduino to Android, Firebase IOT https://medium.com/coinmonks/arduino-toandroid-real-time-communication-for-iot-with-firebase-60df579f962 [9] Dialogflow https://dialogflow.com/docs [10] Actions on Google https://developers.google.com/actions/extending-theassistant [11] Arduino VN http://arduino.vn [12] Github Quickstart Firebase Android https://github.com/firebase/quickstartandroid [13] Firebase Cloud Message https://firebase.google.com/docs/cloud-messaging/? hl=vi [14] Firebase https://firebase.google.com [5] 44 PHỤ LỤC CODE CỦA KHỐI TRUNG TÂM import import import import import socket thread time json urllib2 from subprocess import check_output from firebase import firebase authentication = firebase.FirebaseAuthentication('FBmq232y12AGJy7dyH062TNmZlGLTj5RG3j N8mMo', 'forty.mg.kary@gmail.com', extra={'id': 123}) firebase = firebase.FirebaseApplication('https://smart-antitheft-device.firebaseio.com/', authentication = authentication) HOST = check_output(['hostname', ' all-ip-addresses']) PORT = 12345 s= socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) print 'Socket created' try: s.bind((HOST, PORT)) except socket.error: print 'bind fail' s.listen(5) print 'start listen' print 'wait ' def pullDataFromfirebase(arguments1, arguments2): global led1 global fan1 while True: try: time.sleep(2) result = firebase.get('/devices/led1/value', None) if result == 'on': led1 = '1' else: if result == 'off': led1 = '0' result = firebase.get('/devices/fan1/value', None) if result == 'on': fan1 = '1' 45 else: if result == 'off': fan1 = '0' except: time.sleep(1) thread.start_new_thread(pullDataFromfirebase,(0,0)) def FCM_notify(body): url = 'https://android.googleapis.com/gcm/send' myKey = 'key=' + 'AIzaSyApA-siC_Ftqc5hho7RqYt_y-Sye-m5XAI' token = "djk6F6m0430:APA91bHILHzjjNrYoPlYKeZpJxgUdeHeKSsbSNpEBwJeajzSGapgWkNrFlh0DxYalvo2wMRkqaXeBTQlzskq0g8qc63TeWiA3SJWWOxw0zxqpMZYbxPL_YGoQMpFDRx1bCBT8FtZgg" json_data = { 'to': token, 'notification' : { 'title' : 'warning', 'body' : body, 'sound' : 'default' } } req = urllib2.Request(url) req.add_header('Content-Type', 'application/json') req.add_header('Authorization', myKey) response = urllib2.urlopen(req, json.dumps(json_data)) response.close() def on_new_client(conn,addr): while True: try: data = conn.recv(500) if data == 'Fire': print data firebase.put('/devices','fire','on') FCM_notify('FIRE') if data == '!Fire': print data firebase.put('/devices','fire','off') FCM_notify('NOT FIRE') if data == 'GAS': print data firebase.put('/devices','gas','on') FCM_notify('GAS') 46 if data == '!GAS': print data firebase.put('/devices','gas','off') FCM_notify('NOT GAS') if data == 'led1': conn.send(led1) if data == 'fan1': conn.send(fan1) time.sleep(0.01) except socket.error: conn.close() break while True: (conn,addr) = s.accept() thread.start_new_thread(on_new_client,(conn,addr)) s.close() 47 CODE ANDROID MAINACTIVITY package com.example.admin.mobile; import import import import import import import android.content.Context; android.content.IntentFilter; android.media.Ringtone; android.media.RingtoneManager; android.net.Uri; android.os.Bundle; android.os.Vibrator; import android.support.v7.app.AppCompatActivity; import android.view.View; import import import import android.widget.CompoundButton; android.widget.ImageView; android.widget.TextView; android.widget.ToggleButton; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ServerValue; import com.google.firebase.database.ValueEventListener; import com.google.firebase.messaging.FirebaseMessaging; import java.text.SimpleDateFormat; import java.util.Date; public class MainActivity extends AppCompatActivity { private static ToggleButton buttonLed; private static ToggleButton buttonFan; private static TextView texttimeled; private static TextView texttimefan; private static ImageView firewarning; private static ImageView gaswarning; private static TextView texttimefire; private static TextView texttimegas; private IntentFilter intentFilter; private MyReceiver myReceiver; private static String[] dataDisplay = null; private DatabaseReference firewarn; private DatabaseReference gaswarn; private DatabaseReference timefire; private DatabaseReference timegas; private DatabaseReference led; private DatabaseReference fan; private DatabaseReference ledtime; private DatabaseReference fantime; public static void GetDataToDisplay() { } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); / Action BroadcastReceiver myReceiver = new MyReceiver(); buttonLed = (ToggleButton) findViewById(R.id.toggle_led); buttonFan = (ToggleButton) findViewById(R.id.toggle_fan); texttimeled = (TextView) findViewById(R.id.timeled); texttimefan = (TextView) findViewById(R.id.timefan); texttimefire = (TextView) findViewById(R.id.firetime); texttimegas = (TextView) findViewById(R.id.gastime); firewarning = (ImageView) findViewById(R.id.fire); gaswarning = (ImageView) findViewById(R.id.gas); firewarn = FirebaseDatabase.getInstance().getReference("devices").child("fire").child("value") ; 48 gaswarn = FirebaseDatabase.getInstance().getReference("devices").child("gas").child("value"); fan = FirebaseDatabase.getInstance().getReference("devices").child("fan").child("value"); led = FirebaseDatabase.getInstance().getReference("devices").child("led").child("value"); ledtime = FirebaseDatabase.getInstance().getReference("devices").child("led").child("timestam p"); fantime = FirebaseDatabase.getInstance().getReference("devices").child("fan").child("timestam p"); timefire = FirebaseDatabase.getInstance().getReference("devices").child("fire").child("timesta mp"); timegas = FirebaseDatabase.getInstance().getReference("devices").child("gas").child("timestam p"); FirebaseMessaging.getInstance().setAutoInitEnabled(true); / First update data from server this.GetDataToDisplay(); buttonLed.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked) { led.setValue("on"); ledtime.setValue(ServerValue.TIMESTAMP); } else { led.setValue("off"); ledtime.setValue(ServerValue.TIMESTAMP); } } }); led.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String statusled = dataSnapshot.getValue().toString(); if (statusled.equalsIgnoreCase("on")) { buttonLed.setChecked(true); } else { buttonLed.setChecked(false); } } @Override public void onCancelled(DatabaseError databaseError) { } }); buttonFan.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked) { fan.setValue("on"); fantime.setValue(ServerValue.TIMESTAMP); 49 } else { fan.setValue("off"); fantime.setValue(ServerValue.TIMESTAMP); } } }); fan.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String statusfan = dataSnapshot.getValue().toString(); if (statusfan.equalsIgnoreCase("on")) { buttonFan.setChecked(true); } else { buttonFan.setChecked(false); } } @Override public void onCancelled(DatabaseError databaseError) { } }); firewarn.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { Uri noti = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), noti); Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); String statusfire = dataSnapshot.getValue().toString(); if (statusfire.equalsIgnoreCase("on")) { r.play(); v.vibrate(5000); buttonLed.setAlpha(.5f); buttonLed.setClickable(false); } else { r.stop(); buttonLed.setAlpha(1f); buttonLed.setClickable(true); } } @Override public void onCancelled(DatabaseError databaseError) { } }); gaswarn.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { Uri noti = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), noti); Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); String statusgas = dataSnapshot.getValue().toString(); 50 if (statusgas.equalsIgnoreCase("on")) { r.play(); v.vibrate(5000); buttonLed.setAlpha(.5f); buttonLed.setClickable(false); } else { r.stop(); buttonLed.setAlpha(1f); buttonLed.setClickable(true); } } @Override public void onCancelled(DatabaseError databaseError) { } }); ledtime.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String timeofled = dataSnapshot.getValue().toString(); SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); String dateString = formatter.format(new Date(Long.parseLong(timeofled))); texttimeled.setText("Last updated " + dateString); } @Override public void onCancelled(DatabaseError databaseError) { } }); fantime.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String timeoffan = dataSnapshot.getValue().toString(); SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); String dateString = formatter.format(new Date(Long.parseLong(timeoffan))); texttimefan.setText("Last updated " + dateString); } @Override public void onCancelled(DatabaseError databaseError) { } }); buttonLed.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String postRequest = "Update=TRUE&Name=led&Value=" + String.valueOf(buttonLed.isChecked()); } }); buttonFan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String postRequest = "Update=TRUE&Name=warning&Value=" + String.valueOf(buttonFan.isChecked()); } }); } } 51 52 ... ngày 14 tháng năm 2019 NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: Chuyên ngành: Hệ đào tạo: Khóa: I TÊN ĐỀ TÀI: ĐIỀU KHIỂN VÀ GIÁM SÁT THIẾT BỊ TRONG NHÀ VỚI SỰ HỖ TRỢ CỦA GOOGLE ASSISTANT II... CHẤT LƯỢNG CAO - ĐỒ ÁN TỐT NGHIỆP NGÀNH CÔNG NGHỆ KỸ THUẬT MÁY TÍNH ĐỀ TÀI: ĐIỀU KHIỂN VÀ GIÁM SÁT THIẾT BỊ TRONG NHÀ VỚI SỰ HỖ TRỢ CỦA GOOGLE ASSISTANT GVHD: PGS.TS NGUYỄN THANH... thiết bị nhà thông qua việc giao tiếp với Google Assistant, Diaglogflow, Firebase Một số thiết bị điều khiển thông qua việc lệnh cho Google Assistant: điều khiển mở/tắt thiết bị gia dụng, giám sát

Ngày đăng: 22/12/2021, 06:01

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

  • Đang cập nhật ...

Tài liệu liên quan