Cùng với sự phát triển của nền kinh tế đất nước, nhu cầu về tiêu thụ điện năngngày càng cao trong khi khả năng cung cấp điện còn rất nhiều khó khăn, từ đó vấn đềsử dụng điện tiết kiệm, hiệu quả trở thành vấn đề cấp bách. Việc ý thức tiết kiệm điệncủa người dân chưa được nâng cao, các biện pháp đề ra để tiết kiệm điện còn khá ít vàviệc áp dụng nó vào thực tiễn còn nhiều bất cập. Để tiết kiệm điện phụ thuộc ở 2 yếutố: thiết bị điện và thói quen sử dụng của con người. Người dùng thường bận rộn vớicông việc nên ít có thời gian giám sát được việc sử dụng các thiết bị trong gia đình haycơ quan, dẫn đến nhiều thiết bị hoạt động không cần thiết, gây lãng phí năng lượng điệnvà tăng chi phí điện cho gia đình, cơ quan.Để giải quyết vấn đề quản lý và giảm sát được việc sử dụng điện năng trong nhà,nhóm đã nảy sinh ra ý tưởng thiết kế một hệ thống có thể giúp người dùng tiết kiệmđiện năng qua việc giám sát lượng điện và có thể định ngưỡng tiêu thụ điện trong mỗingày hoặc mỗi tháng. Khi lượng điện vượt mức giới hạn thì thông báo cho người dùngbiết mà đưa ra việc điều khiển thiết bị điện phù hợp. Ngoài ra, người dùng có thể theodõi các thiết bị của ngôi nhà từ xa qua điện thoại hoặc internet.
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 10 tháng 07 năm 2020 NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: Trần Anh Khoa MSSV: 15141185 Nguyễn Văn Hạnh MSSV: 15141151 Chuyên ngành: Kỹ thuật Điện tử - Truyền thông Mã ngành: 141 Hệ đào tạo: Đại học quy Mã hệ: Khóa: 2015 Lớp: 15141DT I TÊN ĐỀ TÀI: THIẾT KẾ VÀ THI CÔNG HỆ THỐNG ĐIỀU KHIỂN VÀ GIÁM SÁT ĐIỆN NĂNG TIÊU THỤ CHO TẢI THÔNG QUA MẠNG INTERNET II NHIỆM VỤ Các số liệu ban đầu: - Các loại vi điều khiển: Arduino Mega 2560 Pro, Arduino Nano, Esp 8266 V12 - Các loại Module: Lora – E32 TTL 100, Đo dịng ACS712, ULN2003 - Màn hình hiển thị: LCD 20x4 - Điều khiển thiết bị điện: relay, transistor, diode - Nguồn: module hạ áp AC – DC Nội dung thực - Tìm hiểu tham khảo tài liệu, giáo trình, nghiên cứu chủ đề, nội dung liên quan đến đề tài - Tìm hiểu công nghệ Lora, IoT - Thiết kế, thi công hệ thống điều khiển - Thiết kế ứng dụng điều khiển hệ điều hành Android - Chạy thử nghiệm hệ thống - Chỉnh sửa lỗi xuất - Đánh giá kết thực - Viết báo cáo luận văn - Báo cáo đề tài tốt nghiệp III NGÀY GIAO NHIỆM VỤ: 18/03/2020 IV NGÀY HOÀN THÀNH NHIỆM VỤ: 10/08/2020 V HỌ VÀ TÊN CÁN BỘ HƯỚNG DẪN: KS Hà A Thồi CÁN BỘ HƯỚNG DẪN BM ĐIỆN TỬ CÔNG NGHIỆP – Y SINH i 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 10 tháng 07 năm 2020 LỊCH TRÌNH THỰC HIỆN ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên 1: Trần Anh Khoa Lớp: 15141DT1D MSSV:15141185 Họ tên sinh viên 2: Nguyễn Văn Hạnh Lớp: 15141DT1A MSSV:15141151 Tên đề tài: THIẾT KẾ VÀ THI CÔNG HỆ THỐNG ĐIỀU KHIỂN VÀ GIÁM SÁT ĐIỆN NĂNG TIÊU THỤ CHO TẢI THÔNG QUA MẠNG INTERNET Xác nhận Tuần/ngày Nội dung Tuần 1,2 Gặp GVHD để lựa chọn đề tài tốt nghiệp GVHD 18/03-01/04 viết đề cương chi tiết Tuần 3,4,5 Tìm hiểu linh kiện sử dụng mạch 02/03-25/04 Thiết kế sơ đồ nguyên lí Tuần 6,7,8,9 Lập trình vi điều khiển điều khiển giao tiếp 27/04-25/05 với module mạch Tuần 10,11 Thiết kế App Android, truyền nhận liệu 26/05-09/06 Firebase với App với Esp8266 Tuần 12 10/06-17/06 Tuần 13,14,15 18/06-11/07 Đóng hộp mơ hình, kiểm tra hoạt động hệ thống Kiểm tra sửa lỗi hệ thống Viết báo cáo hoàn chỉnh GV HƯỚNG DẪN (Ký ghi rõ họ tên) ii LỜI CAM ĐOAN Nhóm sinh viên – Nguyễn Văn Hạnh Trần Anh Khoa xin cam đoan đồ án nhóm tự thực hướng dẫn thầy Hà A Thồi Nhóm tham khảo tài liệu trước nghiên cứu mạng online Kết công bố khóa luận tốt nghiệp trung thực khơng chép từ tài liệu hay cơng trình có trước Người thực đề tài Trần Anh Khoa Nguyễn Văn Hạnh iii LỜI CẢM ƠN Nhóm thực đồ án xin được gửi lời cảm ơn đặc biệt đến giảng viên hướng dẫn thầy Hà A Thồi giúp đỡ nhóm q trình thực đồ án, người đưa hướng nghiên cứu, giải đáp thắc mắc, tận tình quan sát nhóm làm việc Trong q trình thực nhóm tiếp thu được kiến thức thực tế cách làm việc nghiêm túc, hiệu từ thầy Nhóm em xin gửi lời tri ân thành đến quý thầy cô khoa Điện - điện tử hỗ trợ chúng em kiến thức tảng vững vàng, tạo điều kiện tốt cho sinh viên trình học tập nghiên cứu Sự hỗ trợ thầm lặng vơ quan trọng từ gia đình bạn bè ln động lực để nhóm làm việc hết khả hoàn thành đồ án cách tốt Một lần nhóm vơ hân hạnh được làm sinh viên trường ĐH Sư Phạm Kỹ Thuật TPHCM, học trò giảng viên đầy tâm huyết, lời cảm ơn ghi nhận sâu sắc mà nhóm muốn gửi đến thầy cơ, gia đình bạn bè Người thực đề tài Trần Anh Khoa Nguyễn Văn Hạnh iv MỤC LỤC NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP i LỊCH TRÌNH THỰC HIỆN ĐỒ ÁN TỐT NGHIỆP ii LỜI CAM ĐOAN iii LỜI CẢM ƠN iv TÓM TẮT xv CHƯƠNG 1: TỔNG QUAN 1.1 ĐẶT VẤ N ĐỀ 1.2 MỤC TI ÊU Đ Ề T ÀI 1.3 NỘI DUN G TH Ự C HIỆN 1.5 BỐ CỤC ĐỒ Á N CHƯƠNG 2: CƠ SỞ LÝ THUYẾT 2.1 TẦM QUA N TRỌNG CỦA V IỆ C QUẢN LÝ ĐI Ệ N NĂNG 2.2 CÔN G NG H Ệ IOT 2.3 GIỚI TH IỆU V Ề PHẦN CỨ NG 2.3.1 Giới thiệu module ESP8266 2.3.2 Vi Điều Khiển 10 2.3.3 Module LCD 2004-20X4 .15 2.3.4 Module Lora E32 - TTl – 100 16 2.3.5 Cảm biến dòng điện Hall ACS712 20A .19 2.3.6 IC đệm dòng ULN 2003 .21 2.3.7 Module chuyển đổi nguồn điện AC - DC 22 2.3.8 Relay tiếp điểm khí 23 2.4 CHU ẨN GI AO TI ẾP U ART 25 2.7 CÁC LOẠI M ODULE TTHU P HÁT SÓ NG RF 28 2.8 NGU ỒN CU N G C ẤP 29 2.8.1 Bộ Chuyển Đổi Nguồn AC-DC 29 2.8.2 Bộ Chuyển Đổi Nguồn DC-DC 31 CHƯƠNG TÍNH TỐN VÀ THIẾT KẾ 33 3.1 GIỚI THI ỆU 33 v 3.2 TÍN H TỐ N VÀ THI ẾT KẾ H Ệ TH ỐNG 33 3.2.1 Thiết kế sơ đồ khối hệ thống .33 3.2.2 Tính tốn mạch điện .34 CHƯƠNG THI CÔNG HỆ THỐNG 50 4.1 GIỚI THI ỆU 50 4.2 THI CÔNG H Ệ THỐN G 50 4.2.1 Thi công board mạch 50 4.2.2 Lắp ráp kiểm tra 53 4.2.3 Thi công lắp ráp mô hình 55 4.3 LẬP TRÌN H H Ệ THỐ NG 58 4.3.1 Lưu đồ giải thuật 58 4.4 GIỚI THIỆ U VỀ PH ẦN M ỀM LẬ P TRÌNH 70 4.4.1 Giới thiệu Arduino IDE 70 4.4.2 Giới thiệu App Blynk .76 CHƯƠNG KẾT QUẢ_NHẬN XÉT_ĐÁNH GIÁ 79 5.1 GIỚI TH IỆU 79 5.2 KẾT QU Ả ĐẠT Đ ƯỢC 79 5.3 KẾT QUẢ T HỰC NG HIỆM 80 5.3.1 Cấp nguồn kết nối Master với Slave .80 5.3.2 Đăng nhập ứng dụng điện thoại điều khiển – giám sát thiết bị.83 5.4 NHẬ N XÉT – ĐÁNH G IÁ 87 5.4.1 Nhận xét 87 5.4.2 Đánh giá 88 CHƯƠNG KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 89 6.1 KẾT LU ẬN 89 6.2 HƯỚNG PHÁT T RI ỂN 89 TÀI LIỆU THAM KHẢO 90 PHỤ LỤC 91 vi DANH SÁCH HÌNH ẢNH Chương Hình 2.1: Sơ đồ chân ESP8266MOD Hình 2.2: Sơ đồ chân Board ESP-12E Node MCUS Hình 2.3: Board Arduino Mega 2560 Pro 10 Hình 2.4: Board Arduino Mega 2560 Pro với GPIO 11 Hình 2.5: Board Arduino Nano 12 Hình 2.6: Arduino Nano GPIO 13 Hình 2.7: Hình ảnh mặt trước LCD 20x4 14 Hình 2.8: Module Lora E32 – TTL – 100 15 Hình 2.9: Mạch nguyên lý nối dây với vi điều khiển 15 Hình 2.10: Dạng sóng module truyền liệu qua vi điều khiển 16 Hình 2.11: Dạng sóng module nhận liệu khơng dây 17 Hình 2.12: Cảm biến dịng điện Hall ACS712 20A 18 Hình 2.13: Sơ đồ nối dây để sử dụng ACS712 19 Hình 2.14: IC đệm dòng UNL 2003 20 Hình 2.15: Các chân kết nối ic uln 2003 20 Hình 2.16: Mạch chuyển đổi nguồn AC – DC 21 Hình 2.17: Relay 5v 22 Hình 2.20: Gói liệu truyền UART 22 Hình 2.21: Sóng truyền UART 23 Hình 2.22: Quá trình truyền UART 24 Hình 2.23: Quá trình nhận UART 25 Hình 2.26: Sơ đồ mạch RF đơn giản 27 Hình 2.27: Sơ đồ mạch thu song RF đơn giản 28 Hình 2.28: Mạch thu phát kênh 2.4 GHZ L24YK-RX4 31 viii Hình 2.29: Mạch thu phát sóng RF NRF24L01+ 32 Hình 2.30: Mạch thu phát RF UART LC12S 2.4Ghz 33 Hình 2.31: Adapter 12v – 1,5A 33 Hình 2.32: Nguồn tổ ong 12V-10A 34 Hình 2.33: Sơ đồ hoạt động mạch tăng áp 34 Hình 2.34: Mạch tăng áp XL6009 4A 35 Hình 2.35: Sơ đồ hoạt động mạch hạ áp 35 Hình 2.36: Mạch hạ áp DC-DC LM2596 35 Chương Hình 3.1: Sơ đồ khối hệ thống 45 Hình 3.2: Sơ đồ chân ESP8266-12E Node MCU 47 Hình 3.3: Sơ đồ chân Arduimo Mega 2650 Pro 48 Hình 3.4: Sơ đồ kết nối Arduino Mega với nút nhấn 49 Hình 3.5: Sơ đồ kết nối Arduino Mega với LCD 50 Hình 3.6: Sơ đồ kết nối Arduino Mega với Lora 51 Hình 3.7: Sơ đồ nguyên lý Master 52 Hình 3.8: BJT điều khiển Buzzer 53 Hình 3.9: IC đệm dòng ULN 2003 54 Hình 3.10: Sơ đồ cấu tạo IC ULN 2003 55 Hình 3.11: Kết nối ACS với Arduino Nano 55 Hình 3.12: Kết nối relay với UNL2003 56 Hình 3.13: Kết nối khối giám sát điều khiển relay với Arduino Nano 57 Hình 3.14: Kết nối mạch điều khiển buzzer với Arduino 57 Hình 3.15: Kết nối Lora với Arduino nano 58 Hình 3.16: Kết nối phím nhấn với Arduino Nano 58 Hình 3.17: Sơ đồ nguyên lý mạch Slave 59 ix Hình 3.18: Khối nguồn 61 Chương Hình 4.1: Bố trí linh kiện mặt mạch (Master) 62 Hình 4.2: Bố trí linh kiện mặt sau mạch (Master) 63 Hình 4.3: Bố trí linh kiện mặt trước mạch (Slave) 64 Hình 4.4: Bố trí linh kiện mặt sau mạch (Slave) 65 Hình 4.5: Hình ảnh mạch sau hàn linh kiện 66 Hình 4.6: Hình ảnh mạch phụ sau hàn linh kiện 66 Hình 4.7: Hình ảnh mica 67 Hình 4.8: Hình ảnh thực tế bên hộp mạch chính(Master) 67 Hình 4.9: Hình ảnh thực tế bên hộp mạch chính(Master) 68 Hình 4.10: Hình ảnh thực tế bên hộp mạch phụ(Slave) 68 Hình 4.11: Hình ảnh thực tế bên hộp mạch phụ(Slave) 69 Hình 4.12: Hình ảnh thực tế bên hộp hai mạch 70 Hình 4.13: Lưu đồ chương trình Arduino Mega2560 pro 71 Hình 4.14: Lưu đồ khởi tạo hệ thống 73 Hình 4.15: Lưu đồ gửi nhận giữ liệu từ Slave 74 Hình 4.16: Lưu đồ điều khiển nút nhấn Master 75 Hình 4.17: Lưu đồ chương trình phát gửi cảnh báo 76 Hình 4.18: Lưu đồ chương trình điều khiển Slave 77 Hình 4.19: Lưu đồ chương trình đọc cảm biến ACS 712 78 Hình 4.20: Lưu đồ điều khiển nút nhấn Slave 79 Hình 4.21: Lưu đồ kết nối ESP với Blynk Sever 80 Hình 4.22: Lưu đồ chương trình tạo liệu gửi lên Blynk Sever 81 Hình 4.23: Lưu đồ sử dụng App 82 Hình 4.24: Quy trình làm việc arduino 83 x PHỤ LỤC //Serial.print("Attempting MQTT connection "); // Thực kết nối với mqtt user pass if (client.connect("ESP8266Client",mqtt_user, mqtt_pwd)) { // digitalWrite(ledPin, HIGH); Serial.println("connected"); digitalWrite(wifi, HIGH); digitalWrite(lamp, HIGH); // Khi kết nối publish thông báo client.publish(mqtt_topic_pub, "ESP_reconnected"); // nhận lại thông tin //client.subscribe(mqtt_topic_sub); } else { //digitalWrite(ledPin, LOW); digitalWrite(wifi, LOW); digitalWrite(lamp, LOW); Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in seconds"); // Đợi 5s delay(1000); } } } void loop() { Blynk.run(); // Nếu nhận liệu từ master if (Serial.available() > ) { data = Serial.readString(); data.trim(); //Serial.println(data); //Serial.println(data.length()); // Xử lý tách liệu id = getValue(data, ';', 0); l1 = getValue(data, ';', 1); l2 = getValue(data, ';', 2); l3 = getValue(data, ';', 3); l4 = getValue(data, ';', 4); cur = getValue(data, ';', 5); alarm = getValue(data, ';', 6); // Serial.println(id); //Serial.println(l2); checkStatus(); // // // // } }// Kết nối lại server bị ngắt kết nối if (!client.connected()) { reconnect(); } client.loop(); // Setup terminal blynk BLYNK_WRITE(V20) { String t = param.asStr(); 94 BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH PHỤ LỤC String id = getValue(t, ';', 0); String pass = getValue(t, ';', 1); terminal.print("SSID :"); terminal.println(id); terminal.print("PASS :"); terminal.println(pass); terminal.flush(); id.toCharArray(ssid_buff,20); pass.toCharArray(pass_buff,20); } // Cáu hình nút set để lưu thông tin wifi sau nhập BLYNK_WRITE(V6) { int i = param.asInt(); if (i == 1) { delete_eeprom(); delay(50); EEPROM.put(5, ssid_buff); EEPROM.put(30, pass_buff); EEPROM.commit(); terminal.println("CAP NHAT THANH CONG"); terminal.println("Auto reboot "); terminal.flush(); delay(2000); ESP.restart(); } else { ; } } // đặt nút xóa nhớ eeprom cần BLYNK_WRITE(V7) { int i = param.asInt(); if (i == 1) { delete_eeprom(); delay(50); terminal.println("Da xoa bo nho"); terminal.flush(); } else { ; } } // Hàm điều khiển tải BLYNK_WRITE(V21) { int i = param.asInt(); if (i == 1) { // statusld1 = !statusld1; //Blynk.virtualWrite(V12, HIGH); control[10] = '1'; Serial.println(control); 95 BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH PHỤ LỤC } else { ; } } //Hàm điều khiển tải BLYNK_WRITE(V22) { int i = param.asInt(); if (i == 1) { control[10] = '2'; Serial.println(control); } else { ; } } //Hàm điều khiển tải BLYNK_WRITE(V23) { int i = param.asInt(); if (i == 1) { control[10] = '3'; Serial.println(control); } else { ; } } //Hàm điều khiển tải BLYNK_WRITE(V24) { int i = param.asInt(); if (i == 1) { control[10] = '4'; Serial.println(control); } else { ; } } // Hàm xử lý nhận chuỗi void checkStatus() { //Serial.println("Step1"); // xác thực chuỗi nhận if ((id == "slave1")&&(data.length() == 40)) { // Dữ liệu gửi lên web server 96 BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH PHỤ LỤC String temp = String("gateway1-") + l1 + String(";") + l2 + String(";") + l3 + String(";") + l4 + String("-statusA"); temp.toCharArray(mqtt2,100); client.publish(mqtt_topic_pub, mqtt2); sendmqtt(); float t1 = cur.toFloat(); float t2 = alarm.toFloat(); // Serial.println(mqtt2); //Serial.println(t2); // Cập nhật hiển thị blynk tải Blynk.virtualWrite(V11,t1 ); Blynk.virtualWrite(V12,t2 ); if (l1 == "ld1:a") { Blynk.virtualWrite(V21, HIGH); statusld1 = 1; // Blynk.virtualWrite(V12,); } else { Blynk.virtualWrite(V21, LOW); statusld1 = 0; } // Cập nhật hiển thị blynk tải if (l2 == "ld2:a") { Blynk.virtualWrite(V22, HIGH); } else { Blynk.virtualWrite(V22, LOW); } // Cập nhật hiển thị blynk tải if (l3 == "ld3:a") { Blynk.virtualWrite(V23, HIGH); } else { Blynk.virtualWrite(V23, LOW); } // Cập nhật hiển thị blynk tải if (l4 == "ld4:a") { Blynk.virtualWrite(V24, HIGH); } else { Blynk.virtualWrite(V24, LOW); } // Nếu ngưỡng thị bật thông báo sáng đèn warning if (t1 > t2) { warning.on(); Blynk.notify("Current warning!"); 97 BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH PHỤ LỤC Serial.println("warning"); over = 0; } else { warning.off(); over = 1; } } } ❖ Chương trình code cho mạch Master // Khai báo thư viện #include #include #include #define ledStatus3 40 #define ledStatus4 38 #define btnSet A14 #define btnMode A12 #define btnDown 34 #define btnUp 32 #define buzz 42 // Khai báo biến boolean status_btn_up = 0; boolean status_btn_set = 0; boolean status_btn_down = 0; boolean check = 0; float CURRENT_ALAMR = 0; // Chuỗi truyền xuống slave tải String warning = "master;warning"; String safety = "master;safety"; // Khai báo dử dụng lcd LiquidCrystal lcd(A0, A2 , A4, A6, A8, A10); // Biến lưu liệu nhận từ slave String data = ""; String id = ""; String l1 = ""; String l2 = ""; String l3 = ""; String l4 = ""; String cur = ""; boolean fw = 0; void setup() { Serial.begin(9600); // Khai báo serial Serial2.begin(9600);// Khai báo serial2 Serial2.setTimeout(150); Serial3.begin(9600);// Khai báo serial3 Serial3.setTimeout(150); //EEPROM.put(20, CURRENT_ALAMR) ; EEPROM.get(20, CURRENT_ALAMR) ; // Đọc giá trị ngưỡng dòng từ eeprom lcd.begin(20,4); // Khai báo lcd 20x4 lcd.print("Starting "); delay(500); 98 BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH PHỤ LỤC Serial.println("Start"); // Khai báo chân, input, output pinMode(ledStatus3, OUTPUT); pinMode(ledStatus4, OUTPUT); pinMode(buzz, OUTPUT); pinMode(btnSet, INPUT); pinMode(btnMode, INPUT); pinMode(btnDown, INPUT); pinMode(btnUp, INPUT); digitalWrite(ledStatus3, LOW); digitalWrite(ledStatus4, LOW); delay(1000); blink_buzz(2); lcd.setCursor(14, 1); lcd.print("Done"); delay(2000); display_setting(); } void loop() { read_input(); if(check == 0){ // Kiểm tra liệu nhận slave gửi if (Serial3.available() > ) { data = Serial3.readString(); data.trim(); // Tách liệu id = getValue(data, ';', 0); l1 = getValue(data, ';', 1); l2 = getValue(data, ';', 2); l3 = getValue(data, ';', 3); l4 = getValue(data, ';', 4); cur = getValue(data, ';', 5); // Kiểm tra dòng cao giá trị ngưỡng báo động gửi cảnh báo slave if (cur.toFloat() > CURRENT_ALAMR) { // blink_buzz(1); digitalWrite(buzz , HIGH); digitalWrite(ledStatus3, HIGH); digitalWrite(ledStatus4, HIGH); fw = 1; Serial3.println(warning); } else { digitalWrite(buzz , LOW); digitalWrite(ledStatus3, LOW); digitalWrite(ledStatus4, LOW); if (fw == 1) { Serial3.println(safety); fw = 0; } } // Xác thực chuỗi nhận có hay khơng 99 BỘ MƠN ĐIỆN TỬ CƠNG NGHIỆP – Y SINH PHỤ LỤC if ((id == "slave1")&&(data.length() == 35)) { // Cập nhật hiển thị lcd display_update(); //Gửi liệu lên Esp8266 String data2 = data + String(";") + String(CURRENT_ALAMR); Serial2.println(data2); } }// Check chuỗi gửi từ Esp8266 if (Serial2.available() > ) { String data3 = Serial2.readString(); data3.trim(); //Serial.println(data3); // Serial.println(data3.length()); String id2 = getValue(data3, ';', 0); String value = getValue(data3, ';', 1); // Xác thực chuỗi nhận if((id2 == "control")&&(data3.length() == 11)) { // Gửi điều khiển xuống slave Serial.println(data3); Serial3.println(data3); } } } } // -Hàm check nhấn nút -boolean debounce(int pin) { boolean state; boolean previousState; const int debounceDelay = 60; previousState = digitalRead(pin); for (int counter = 0; counter < debounceDelay; counter++) { delay(1); state = digitalRead(pin); if (state != previousState) { counter = 0; previousState = state; } } return state; } // Hàm đọc input, nút nhấn đầu vào void read_input() { int value_set = debounce(btnSet); if (!value_set) // check nút set nhấn { status_btn_set = !status_btn_set; blink_buzz(2); Serial.println("Nut set"); 100 BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH PHỤ LỤC } int value_up = debounce(btnUp); if (!value_up) // check nút UP nhấn { //Serial.println("Nut up"); if (status_btn_set == 1) { CURRENT_ALAMR = CURRENT_ALAMR + 0.1 ; // temp = count; //Serial.print("UP "); display_set_cur(); Serial.print(CURRENT_ALAMR); Serial.println("Nut up"); } } int value_down = debounce(btnDown); if (!value_down) // Check nút Down nhấn { //Serial.println("Nut down"); if (status_btn_set == 1) { CURRENT_ALAMR = CURRENT_ALAMR - 0.1 ; // temp = count; // display_segment(TEMP_ALAMR); // Serial.print("Down "); display_set_cur(); Serial.print(CURRENT_ALAMR); Serial.println("Nut down"); } } if(status_btn_set == 1) { check = 1; } if((status_btn_set == 0)&&(check == 1)) { // Lưu gia trị set vào nhớ eeprom EEPROM.put( 20, CURRENT_ALAMR ); check = 0; blink_buzz(2); } } // Hàm hú còi, led báo động void blink_buzz (int n) { for (int i = ; i < n ; i++) { digitalWrite(buzz , HIGH); digitalWrite(ledStatus3, HIGH); digitalWrite(ledStatus4, HIGH); delay (300) ; digitalWrite(buzz , LOW); digitalWrite(ledStatus3, LOW); digitalWrite(ledStatus4, LOW); delay (300) ; } } 101 BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH PHỤ LỤC // Hàm hiển thị lcd ban đầu void display_setting() { lcd.clear(); //lcd.setCursor(7, 0); //lcd.print("Monitor"); lcd.setCursor(0, 0); lcd.print("Load1:"); lcd.setCursor(6, 0); lcd.print("on"); lcd.setCursor(11, 0); lcd.print("Load2:"); lcd.setCursor(17, 0); lcd.print("on"); lcd.setCursor(0, 1); lcd.print("Load3:"); lcd.setCursor(6, 1); lcd.print("on"); lcd.setCursor(11, 1); lcd.print("Load4:"); lcd.setCursor(17, 1); lcd.print("on"); lcd.setCursor(0, 2); lcd.print("Current:"); lcd.setCursor(9, 2); lcd.print("0.00/"); lcd.setCursor(14, 2); lcd.print(String(CURRENT_ALAMR)); lcd.setCursor(19, 2); lcd.print("A"); lcd.setCursor(0, 3); lcd.print("Power :"); lcd.setCursor(10, 3); lcd.print(" W"); } // Hàm update hiển thị cho lcd void display_update() { if (l1 == "ld1:a") { lcd.setCursor(6, 0); lcd.print("on "); } else { lcd.setCursor(6, 0); lcd.print("off"); } if (l2== "ld2:a") { lcd.setCursor(17, 0); lcd.print("on "); } else { 102 BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH PHỤ LỤC lcd.setCursor(17, 0); lcd.print("off"); } if (l3 == "ld3:a") { lcd.setCursor(6, 1); lcd.print("on "); } else { lcd.setCursor(6, 1); lcd.print("off"); } if (l4 == "ld4:a") { lcd.setCursor(17, 1); lcd.print("on "); } else { lcd.setCursor(17, 1); lcd.print("off"); } lcd.setCursor(9, 2); lcd.print(cur); int w = cur.toFloat() * 220; lcd.setCursor(10, 3); String poe = String(w) + String(" W "); lcd.print(poe); } void display_set_cur() { lcd.setCursor(14, 2); lcd.print(String(CURRENT_ALAMR)); } // Hàm lấy giá trị từ chuỗi String getValue(String data, char separator, int index) { int found = 0; int strIndex[] = {0, -1}; int maxIndex = data.length()-1; for(int i=0; i= printPeriod) { previousMillis = millis(); count++; if (count == 1) { // Đọc nút nhấn read_input(); // Đọc trạng thái tải readstatus(); // Gửi chuỗi truyền lên master String data = String(stringsta) + String(';') + String(temp); Serial.println(data); } else { // Tính giá trị dịng điện Amps_TRMS = intercept + slope * inputStats.sigma(); // Calib giá trị cảm biến temp = abs(Amps_TRMS - 0.18); // Serial.println(stringsta); count = 0; } } } } // Hàm cảnh báo dòng void blink_buzz (int n) { for (int i = ; i < n ; i++) { digitalWrite(buzz , HIGH); delay (300) ; digitalWrite(buzz , LOW); delay (300) ; } } // Hàm check nút nhấn boolean debounce(int pin) 106 BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH PHỤ LỤC { boolean state; boolean previousState; const int debounceDelay = 60; previousState = digitalRead(pin); for (int counter = 0; counter < debounceDelay; counter++) { delay(1); state = digitalRead(pin); if (state != previousState) { counter = 0; previousState = state; } } return state; } // Hàm đọc nút nhấn điều khiển void read_input() { boolean value = debounce(btn1); if (!value) { status_btn1 = !status_btn1; action(); } boolean value2 = debounce(btn2); if (!value2) { status_btn2 = !status_btn2; action(); } boolean value3 = debounce(btn3); if (!value3) { status_btn3 = !status_btn3; action(); } boolean value4 = debounce(btn4); if (!value4) { status_btn4 = !status_btn4; action(); } } // Hàm thực thi lệnh điều khiển void action() { if (status_btn1 == 1) { digitalWrite(load1, HIGH); } else digitalWrite(load1, LOW); if (status_btn2 == 1) 107 BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH PHỤ LỤC { digitalWrite(load2, HIGH); } else digitalWrite(load2, LOW); if (status_btn3 == 1) { digitalWrite(load3, HIGH); } else digitalWrite(load3, LOW); if (status_btn4 == 1) { digitalWrite(load4, HIGH); } else digitalWrite(load4, LOW); } // Hàm đọc trạng thái tải void readstatus(){ for (int i = ; i < ; i++){ if(digitalRead(load[i]) == 0) { stringsta[sttsta[i]] = 'b'; } else { stringsta[sttsta[i]] = 'a'; } } } // Hàm check lệnh điều khiển void check_control() { if (t2 == "ld1") { status_btn1 = !status_btn1; action(); } if (t2 == "ld2") { status_btn2 = !status_btn2; action(); } if (t2 == "ld3") { status_btn3 = !status_btn3; action(); } if (t2 == "ld4") { status_btn4 = !status_btn4; action(); } } 108 BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH