Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 103 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
103
Dung lượng
2,97 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƢỜNG ĐẠI HỌC CÔNG NGHỆ TP HỒ CHÍ MINH ĐỒ ÁN TỐT NGHIỆP HỆ THỐNG ĐIỀU KHIỂN VÀ GIÁM SÁT TỦ KEM NGÀNH: KỸ THUẬT ĐIỆN TỬ, TRUYỀN THÔNG GIẢNG VIÊN HƢỚNG DẪN: TS VÕ ĐÌNH TÙNG Sinh viên thực hiện: MSSV: Lớp: Nguyễn Thanh An 1711010097 17DDTA1 Tp Hồ Chí Minh, tháng 09/2021 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƢỜNG ĐẠI HỌC CÔNG NGHỆ TP HỒ CHÍ MINH ĐỒ ÁN TỐT NGHIỆP HỆ THỐNG ĐIỀU KHIỂN VÀ GIÁM SÁT TỦ KEM NGÀNH: KỸ THUẬT ĐIỆN TỬ, TRUYỀN THÔNG GIẢNG VIÊN HƢỚNG DẪN: TS VÕ ĐÌNH TÙNG Sinh viên thực hiện: MSSV: Lớp: Nguyễn Thanh An 1711010097 17DDTA1 Tp Hồ Chí Minh, tháng 09/2021 MỤC LỤC PHIẾU ĐĂNG KÝ ĐỀ TÀI ĐỒ ÁN/KHÓA LUẬN TỐT NGHIỆP PHIẾU GIAO NHIỆM VỤ THỰC HIỆN ĐỒ ÁN TỐT NGHIỆP LỜI CAM ĐOAN i LỜI CẢM ƠN ii MỤC LỤC iii DANH SÁCH CÁC CHỮ VIẾT TẮT .v DANH SÁCH CÁC HÌNH vi DANH SÁCH CÁC BẢNG viii LỜI MỞ ĐẦU 1 Tính cấp thiết đề tài Tình hình nghiên cứu Mục đích nghiên cứu Nhiệm vụ nghiên cứu Phƣơng pháp nghiên cứu Kết đạt đƣợc Kết cấu đồ án tốt nghiệp Chƣơng 1: GIỚI THIỆU 1.1 Thực trạng vấn đề doanh nghiệp kinh doanh tủ lạnh tủ mát nay4 1.1.1 Các chủ doanh nghiệp khơng có phương tiện để kiểm soát tủ mát .4 1.1.2 Khơng thể biết nhân viên có thường xuyên đến lại tủ theo định kỳ để thực bảo dưỡng hay không ? 1.1.3 Sau thời gian vận hành, doanh nghiệp đối diện với nguy tủ vấn đề đạo đức nhân viên .5 1.2 Hƣớng giải vấn đề Chƣơng 2: TỔNG QUAN GIẢI PHÁP 2.1 Giới thiệu mơ hình giám sát điều khiển quản lí tập trung 2.2 Chức hệ thống giám sát điều khiển quản lý tập trung cho tủ kem Chƣơng 3: PHƢƠNG PHÁP GIẢI QUYẾT 10 3.1 Mô tả phƣơng pháp .10 iii 3.2 Giới thiệu Module ESP8266 NodeMCU 10 3.3 Optocoupler PC817 .12 3.3.1 Khái niệm 12 3.3.2 Nguyên lý hoạt động 13 3.4 Phần mềm lập trình cho vi điều khiển 13 3.5 Phần mềm lập trình cho Websever (Visual Studio Code) 18 3.6 Giới thiệu CSS 21 3.7 Giới thiệu JavaScript 22 Chƣơng 4: QUY TRÌNH THIẾT KẾ 24 4.1 Giới thiệu 24 4.2 Thiết kế mạch sơ đồ khối hệ thống 24 4.3 Tính tốn thiết kế mạch điện tử 25 4.3.1 Mạch giám sát điều khiển thiết bị .26 4.3.2 Mạch phát điện áp AC .26 4.3.3 Mạch điều khiển sử dụng kết nối wifi .29 4.4 Lƣu đồ giải thuật 30 4.5 Website quản lý 32 4.6 Website thiết bị 37 Chƣơng 5: THI CÔNG 40 5.1 Giới thiệu 40 5.2 Thi công hệ thống 41 5.2.1 Thi công board mạch hệ thống 41 5.2.2 Danh sách linh kiện 42 5.2.3 Lắp ráp kiểm tra 42 5.3 Viết tài liệu hƣớng dẫn sử dụng, thao tác 43 Chƣơng 6: ĐÁNH GIÁ KẾT QUẢ, KẾT LUẬN 50 6.1 Kết đạt đƣợc 50 6.2 Đánh giá kết thực tế .50 6.3 Nhận xét 51 6.4 Định hƣớng phát triển 51 TÀI LIỆU THAM KHẢO 52 PHỤ LỤC 53 iv DANH SÁCH CÁC CHỮ VIẾT TẮT SMD: Surface-mount device (Là loại linh kiện dán, khác với Through Hole) Terminal: Chân cắm ngõ vào, ngõ để cấp nguồn truyền tín hiệu cho mạch AMS1117: IC ổn áp, áp ngõ quy định vào số cụ thể ghi vỏ ESP8266: Chip Wifi điều khiển trung tâm mạch IP: Internet Protocol IOT: Internet of Thing TX RX: Transmitter Receiver (Chân truyền chân nhận tín hiệu) UART: Universal Asynchronous Receiver-Transmitter v DANH SÁCH CÁC HÌNH Hình 1.1: Nhân viên cơng ty bảo trì sửa chữa Hình 1.2: Tủ để lâu chưa sửa chữa Hình 1.3 Tủ kem không quản lý Hình 1.4 Tủ lạnh bán lại cho tạp hóa Hình 2.1: Sơ đồ khối hệ thống Hình 3.1: Cấu trúc phần cứng Module ESP8266 NodeMCU 11 Hình 3.2: Sơ đồ chân Module ESP8622 NodeMCU 12 Hình 3.3: Sơ đồ chân Opto 13 Hình 3.4: Nguyên lý hoạt động Opto 13 Hình 3.5: Trang tải phần mềm Arduino IDE 14 Hình 3.6: Hình lựa chọn dạng tải phần mềm 15 Hình 3.7: Giao diện làm việc Arduino IDE 15 Hình 3.8: Hộp thoại Preferences thêm đường link vào ô Additional Board 16 Manager URLs 16 Hình 3.9: Hộp thoại Boards Manager .17 Hình 3.10: Cửa sổ chọn Board Port cho Module ESP-12E Node MCU 17 Hình 3.11: Logo Visual Studio Code 18 Hình 3.12: Trang download Visual Studio Code 19 Hình 3.13: Giao diện sau mở Visual Studio Code 19 Hình 3.14: Các thành phần Html – CSS – JavaScript .20 Hình 3.15: Chức HTML, CSS, Javascript 20 Hình 3.16: Cấu trúc HTML đơn giản 21 Hình 3.17: CSS rule 22 Hình 3.18: Logo Nodejs 23 Hình 4.1: Sơ đồ khối hệ thống 24 Hình 4.2: Sơ đồ nguyên lý mạch 26 Hình 4.3: Sơ đồ mạch phát điện áp 26 Hình 4.4: Chỉnh lưu bán kỳ .27 Hình 4.5: Sơ đồ cấu tạo Opto cách li quang PC817 28 Hình 4.6: Đèn LED để kiểm tra trạng thái Opto .28 vi Hình 4.7: Sơ đồ mạch điều khiển 29 Hình 4.9: Lưu đồ giải thuật hệ thống 30 Hình 4.10: Giao diện đăng nhập website quản lí .32 Hình 4.11: Giao diện website cho người quản lí 33 Hình 4.12: Tất thông tin riêng tủ kem qua giao diện người quản lý 34 Hình 4.13:Bảng trạng thái lịch sử hoạt động tủ kem .34 Hình 4.14: Giao diện dành cho nhân viên giám sát hiển thị tủ kem thuộc phân quyền nhân viên 35 Hình 4.15: Nhân viên giám sát điểm danh (check in) kết nối chung với wifi mà tủ kem kết nối .36 Hình 4.16: Giao diện báo hỏng trình bảo trì 36 Hình 4.17: Cảnh báo người dùng tình trạng thiết bị 37 Hình 4.18: Giao diện tổng thể website thiết bị 37 Hình 4.19: Giao diện nhập thông tin wifi cho tủ kem .38 Hình 4.20: Các phím bấm thao tác web thiết bị .38 Hình 4.21: Trạng thái thiết bị theo thời gian thực 39 Hình 5.1: Sơ đồ dây mạch in lớp mạch 41 Hình 5.2: Sơ đồ 3D 41 Hình 5.4: Mơ vị trí đặt mạch 3D 42 Hình 5.5: Kết nối với Wifi mặc định mạch 43 Hình 5.6: Nhập mật mặc định 44 Hình 5.7: Giao diện thay đổi mật .44 Hình 5.8: Các chức .45 Hình 5.9: Địa IP wifi nơi lắp đặt cấp 47 Hình 5.10: Nhập IP server để truy cập trở lại website thiết bị 48 Hình 5.11: Giao diện website thiết bị .49 Hình 5.12: Địa IP kết nối trạng thái theo thời gian thực 49 vii DANH SÁCH CÁC BẢNG Bảng 6.1: Bảng thực nghiệm kết chạy thực tế 50 viii LỜI MỞ ĐẦU Tính cấp thiết đề tài Trong đời sống thường nhật, bắt gặp khơng thiết bị như: - Tủ mát chứa hàng hóa siêu thị - Tủ lạnh chứa đựng thức uống tiệm tạp hố, cửa hàng bán lẻ - … Có thực là, thiết bị nhà cung cấp dịch vụ sản phẩm trang bị miễn phí cho chủ cửa hàng, siêu thị Thực trạng đặt là, nhà cung cấp sản phẩm Coca cola, Pepsi…trang bị từ hàng trăm chí hàng nghìn thiết bị khắp miền đất nước Vấn đề xuất hiện: - Làm biết máy đặt đâu? - Ai người giao chịu trách nhiệm quản lý máy cụ thể - Làm để biết thiết bị có cịn hữu khơng hay bị bán, bị hư, bị lý… - Tình trạng hoạt động máy nào? Phương pháp quản lý truyền thống để trả lời vấn đề thật nan giải Nếu làm tốt phải nhiều nguồn lực, không hiệu không kịp thời, kết phụ thuộc vào đạo đức nhân viên Cần có giải pháp đại, hiệu quả, xác đáng tin cậy để giải quết vấn đề nêu nhu cầu cấp thiết Tình hình nghiên cứu Hệ thống hỗ trợ giám sát – quản lý tập chung thiết bị lắp đặt rải rác nơi đâu vị trí Hệ thống thiết kế hồn thiện nhằm mang đến nhiều lợi ích cho doanh nghiệp, đơn giản hóa vấn đề quản lý giám sát từ xa Phân tích liệu thiết bị thông qua kết nối wifi, phát vấn đề cố thiết bị trình vận hành Mục đích nghiên cứu Trong thực tế nay, việc quản lí từ xa dần trở nên cần thiết doanh nghiệp, thời đại internet sử dụng phổ biến khắp nơi việc cho hệ thống quản lí giám sát sử dụng internet điều nên làm Xuất phát từ nhu cầu đó, ý tưởng việc thiết kế, chế tạo hệ thống điều khiển, giám sát thiết bị quản lý tập trung em nghiên cứu triển khai Đồng thời áp dụng vào quản lý chuỗi gồm 1.000 tủ Phần mềm quản lý tiếp nhận liệu tủ kem thông qua kết nối wifi, thiết bị điện tử lắp đặt với tủ kem Các doanh nghiệp dễ dàng kiểm tra xem nhân viên có đến nơi tủ đặt để kiểm tra bảo dưỡng hay không cách theo dõi check in nhân viên tủ kem đó, nhân viên phải đăng nhập vào wifi giống với wifi mà tủ kem kết nối check in server, doanh nghiệp theo dõi tình trạng thiết bị, theo dõi thời hạn hợp đồng, kiểm tra trạng thái tồn kho phát có cố để bảo trì kịp thời.Việc ứng dụng cơng nghệ quản lý giám sát giúp người vận hành nắm bắt thơng tin cụ thể xác giảm thiểu thời gian trễ (so với phương truyền thống lại tủ kem) Việc quản lý giám sát, điều khiển tủ kem trở nên đơn giản Tóm lại, mục tiêu chung em thiết kế, chế tạo hệ thống điều khiển, giám sát quản lý tập trung Hệ thống sử dụng cho nhiều đạng thiết bị khác Đặc biệt báo cáo khoa học đề cập đến ứng dụng triển khai quản lý 1.000 tủ kem Nhiệm vụ nghiên cứu Em thực đề tài đặt nhiệm vụ nghiên cứu cụ thể sau: Tìm hiểu tổng quan: Cấu tạo phần cứng, chức chân Viết chương trình điều khiển ESP8266 với thiết bị ngoại vi Thiết kế giao diện Webserver để giám sát quản lý thiết bị Điều khiển đóng ngắt thiết bị Kiểm tra, đánh giá tính ứng dụng đề tài Phƣơng pháp nghiên cứu EEPROM.commit(); Serial.println("Writed to EEPROM!"); Serial.print("SSID: "); Serial.println(ssid); Serial.print("PASS: "); Serial.println(pass); Serial.print("SERI: "); Serial.println(seri); Serial.print("ADDR: "); Serial.println(addr); String s = "Đã lưu Wifi"; webServer.send(200, "text/html", s); ESP.restart(); } //============= Chương trình thiết lập chức khởi động lại cho mạch ===================================== void restart_ESP(){ ESP.restart(); String s = "Đã khởi động lại"; webServer.send(200, "text/html", s); } //====== Chương trình thiết lập chức xóa thông tin liệu wifi nhớ, đồng thời đưa trạng thái xuất xưởng ======== void clear_EEPROM(){ Serial.println("Clear EEPROM!"); for (int i = 0; i < 500; ++i) { EEPROM.write(i, 0); 81 delay(10); } EEPROM.commit(); String s = "Đã xóa liệu"; webServer.send(200,"text/html", s); } //====== Chương trình thiết lập hiển thị địa IP wifi khách hàng cấp xuống ===== void get_IP(){ String s = WiFi.localIP().toString(); webServer.send(200,"text/html", s); } //======== Cập nhật trạng thái máy lên web thiết bị để theo dõi nội thời gian thực ======= void fetchTemp(){ time_t now=time(nullptr); struct tm* p_tm=localtime(&now); Serial.print(p_tm->tm_mday); Serial.print("/"); Serial.print(p_tm->tm_mon + 1); Serial.print("/"); Serial.print(p_tm->tm_year + 1900); Serial.print(" "); Serial.print(p_tm->tm_hour); Serial.print(":"); Serial.print(p_tm->tm_min); Serial.print(":"); 82 Serial.print(p_tm->tm_sec); Serial.println(" "); int = p_tm->tm_mday; int thang = p_tm->tm_mon + 1; int nam = p_tm->tm_year + 1900; int gio = p_tm->tm_hour; int phut = p_tm->tm_min; int giay = p_tm->tm_sec; String x; buttonState = digitalRead(Pin); if (buttonState == HIGH){ Serial.println("Máy Dừng Chạy"); x = String("Máy dừng chạy"); Serial.println(x); }else{ Serial.println("Máy Đang Chạy"); x = String("Máy chạy"); Serial.println(x); } String s = x + " " + "(" + " " + String(ngay) + "/" + String(thang) + "/" + String(nam) + " " + "-" + " " + String(gio) + ":" + String(phut) + ":" + String(giay) + " " + ")" + " "; webServer.send(200,"text/html", s); } 83 //===== Gửi liệu thời gian nhiệt độ lên server ===== void api(){ String jsonData; int y; int m; //int n = WiFi.localIP(); time_t now=time(nullptr); struct tm* p_tm=localtime(&now); Serial.print(p_tm->tm_mday); Serial.print("/"); Serial.print(p_tm->tm_mon + 1); Serial.print("/"); Serial.print(p_tm->tm_year + 1900); Serial.print(" "); Serial.print(p_tm->tm_hour); Serial.print(":"); Serial.print(p_tm->tm_min); Serial.print(":"); Serial.print(p_tm->tm_sec); Serial.println(" "); int = p_tm->tm_mday; int thang = p_tm->tm_mon + 1; int nam = p_tm->tm_year + 1900; 84 int gio = p_tm->tm_hour; int phut = p_tm->tm_min; int giay = p_tm->tm_sec; buttonState = digitalRead(Pin); if (buttonState == HIGH){ Serial.println(0); y = 0; //máy dừng chạy, đủ lạnh m = 2; Serial.println(y); }else{ Serial.println(1); y = 1; //máy chạy, thiếu lạnh m = 2; Serial.println(y); } String z = String(ngay) + "/" + String(thang) + "/" + String(nam) + " " + "-" + " " + String(gio) + ":" + String(phut) + ":" + String(giay); String n = WiFi.localIP().toString(); String result = n + key; HTTPClient http; String serverNamee = addr + "/log/create"; char char_array[512]; 85 serverNamee.toCharArray(char_array,serverNamee.length()+1); Serial.println(char_array); http.begin(char_array); http.addHeader("Content-Type", "application/json"); DynamicJsonDocument doc(1024); doc["s"] = seri; doc["r"] = y; doc["e"] = m; doc["t"] = z; doc["sd"] = ssid_ap; doc["pwd"] = pass_ap; doc["sw"] = ssid; doc["pww"] = pass; doc["ip"] = n; doc["pwip"] = pass_login1; String sha = SHA256(result); Serial.println(result); Serial.println(sha); doc["hk"] = sha; Serial.println(WiFi.localIP()); serializeJson(doc, jsonData); Serial.println(jsonData); int httpResponseCode = http.POST(jsonData); Serial.print("HTTP Response code ping: "); Serial.println(httpResponseCode); Serial.println(addr); 86 Serial.print(http.getString()); // Serial.println(serializeJson(doc, Serial)); // Free resources http.end(); //delay(5000); } //========================================= void api_start(){ String jsonData; int y; int m; //int n = WiFi.localIP(); time_t now=time(nullptr); struct tm* p_tm=localtime(&now); Serial.print(p_tm->tm_mday); Serial.print("/"); Serial.print(p_tm->tm_mon + 1); Serial.print("/"); Serial.print(p_tm->tm_year + 1900); Serial.print(" "); Serial.print(p_tm->tm_hour); Serial.print(":"); Serial.print(p_tm->tm_min); Serial.print(":"); 87 Serial.print(p_tm->tm_sec); Serial.println(" "); int = p_tm->tm_mday; int thang = p_tm->tm_mon + 1; int nam = p_tm->tm_year + 1900; int gio = p_tm->tm_hour; int phut = p_tm->tm_min; int giay = p_tm->tm_sec; buttonState = digitalRead(Pin); if (buttonState == HIGH){ Serial.println(0); y = 0; //máy dừng chạy, đủ lạnh m = 1; Serial.println(y); }else{ Serial.println(1); y = 1; //máy chạy, thiếu lạnh m = 1; Serial.println(y); } String z = String(ngay) + "/" + String(thang) + "/" + String(nam) + " " + "-" + " " + String(gio) + ":" + String(phut) + ":" + String(giay); 88 String n = WiFi.localIP().toString(); String result = n + key; HTTPClient http; String serverNamee = addr + "/log/create"; char char_array[512]; serverNamee.toCharArray(char_array,serverNamee.length()+1); Serial.println(char_array); http.begin(char_array); http.addHeader("Content-Type", "application/json"); DynamicJsonDocument doc(1024); doc["s"] = seri; doc["r"] = y; doc["e"] = m; doc["t"] = z; doc["sd"] = ssid_ap; doc["pwd"] = pass_ap; doc["sw"] = ssid; doc["pww"] = pass; doc["ip"] = n; doc["pwip"] = pass_login1; String sha = SHA256(result); Serial.println(result); Serial.println(sha); doc["hk"] = sha; Serial.println(WiFi.localIP()); 89 serializeJson(doc, jsonData); Serial.println(jsonData); int httpResponseCode = http.POST(jsonData); Serial.print("HTTP Response code ping: "); Serial.println(httpResponseCode); Serial.println(addr); Serial.print(http.getString()); // Serial.println(serializeJson(doc, Serial)); // Free resources http.end(); //delay(5000); } //======================================== void se_ri(){ seri = webServer.arg("seri"); for (int i = 0; i < seri.length(); ++i) { EEPROM.write(i, seri[i]); EEPROM.commit(); Serial.print("SERI: "); Serial.println(seri); } String s = "Đã nhập Seri Number"; webServer.send(200, "text/html", s); } //====================================== void lo_gin(){ 90 passwordlogin = webServer.arg("passwordlogin"); if(passwordlogin == pass_login1){ String s = "0"; webServer.send(200, "text/html", s); }else{ String s = "-1"; webServer.send(200, "text/html", s); } } //====================================== void change_pass(){ oldpass = webServer.arg("oldpass"); newpass = webServer.arg("newpass"); passcomfirm = webServer.arg("passcomfirm"); Serial.print("pass_login1: "); Serial.println(pass_login1); Serial.print("oldpass: "); Serial.println(oldpass); Serial.print("newpass: "); Serial.println(newpass); Serial.print("passcomfirm: "); Serial.println(passcomfirm); if(newpass == passcomfirm){ HTTPClient http; String serverChangePass = addr + "/device/ChangePwdWebsite?seri=" + seri + "&pwd=" + pass_login1; 91 char char_array[512]; serverChangePass.toCharArray(char_array,serverChangePass.length()+1); Serial.println(char_array); http.begin(char_array); int httpResponseCode = http.POST("null"); if (httpResponseCode == 200) { pass_login1 = newpass; Serial.print("pass_login1: "); Serial.println(pass_login1); String s = "0"; webServer.send(200, "text/html", s); } Serial.print("httpResponseCode Change Pass: "); Serial.println(httpResponseCode); } else { String s = "-1"; webServer.send(200, "text/html", s); } Serial.println("Clear EEPROM!"); for (int i = 200; i < 250; ++i) { EEPROM.write(i, 0); delay(10); } // for (int i = 0; i < pass_login1.length(); ++i) { EEPROM.write(200 + i, pass_login1[i]); 92 } EEPROM.commit(); Serial.println("Writed to EEPROM!"); Serial.print("pass_login: "); Serial.println(pass_login1); } //====================================== boolean read_EEPROM(){ Serial.println("Reading EEPROM "); if(EEPROM.read(0)!=0){ ssid = ""; pass = ""; seri = ""; addr = ""; for (int i=0; i