Đồ án tốt nghiệp có cả file code arduino: senderq esp trạm 1 lora_reciver trạm 2 code trên raspberry Pi: chạy trên Pycharm GUI2.py chi tiết liên hệ email: kiemtiencn123gmail.com
TRƯỜNG ĐẠI HỌC QUY NHƠN KHOA KỸ THUẬT VÀ CÔNG NGHỆ - - ĐỒ ÁN TỐT NGHIỆP THIẾT KẾ HỆ THỐNG ĐIỀU KHIỂN VÀ GIÁM SÁT MẠNG CUNG CẤP ĐIỆN DỰA TRÊN CÔNG NGHỆ IoT GVHD: ThS NGUYỄN AN TOÀN SVTH: NGUYỄN NGỌC THIỆN MSSV: 3951070137 KHĨA: 39 Bình Định, 01/2021 i TRƯỜNG ĐẠI HỌC QUY NHƠN KHOA KỸ THUẬT VÀ CÔNG NGHỆ - - ĐỒ ÁN TỐT NGHIỆP THIẾT KẾ HỆ THỐNG ĐIỀU KHIỂN VÀ GIÁM SÁT MẠNG CUNG CẤP ĐIỆN DỰA TRÊN CÔNG NGHỆ IoT Chuyên ngành: Kỹ thuật Điện, Điện tử GVHD: TS NGUYỄN AN TOÀN SVTH: NGUYỄN NGỌC THIỆN Bình Định, 01/2021 LỜI CAM ĐOAN Tơi xin cam đoan đồ án tốt nghiệp“Thiết kế hệ thống điều khiển giám sát mạng cung cấp điện dựa cơng nghệ IoT” cơng trình tơi thực hướng dẫn ThS Nguyễn An Toàn Các số liệu kết hoàn toàn trung thực Để hồn thành luận văn này, tơi sử dụng tài liệu ghi danh mục “Tài liệu tham khảo” không chép hay sử dụng tài liệu khác Nếu phát có chép tơi xin chịu hồn tồn trách nhiệm Bình Định, ngày 10 tháng 01 năm 2021 Sinh viên thực Nguyễn Ngọc Thiện LỜI CẢM ƠN Đầu tiên, nhóm xin bày tỏ lịng tri ân sâu sắc kính trọng đến ThS Nguyễn An Tồn, người trực tiếp hướng dẫn, định hướng khoa học trình nghiên cứu Nhóm xin trân trọng cảm ơn giảng viên cán Khoa Kỹ thuật Công nghệ - Đại học Quy Nhơn tận tình giúp đỡ nhóm q trình nghiên cứu hồn thiện đồ án Nhóm xin trân trọng cảm ơn cán bộ, sinh viên cựu sinh viên khoa Kỹ thuật Công nghệ - Đại học Quy Nhơn hỗ trợ nhóm q trình thực đồ án Cảm ơn bạn Đinh Quốc Đạt, Đào Tấn Phương, Nguyễn Văn Quốc Đặc biệt,nhóm xin cảm ơn TS Ngơ Minh Khoa hỗ trợ trang thiết bị cho nhóm q trình nhóm học tập nghiên cứu phịng lưới điện thơng minh Nhóm xin trân trọng cảm ơn Ban Giám hiệu Trường Đại học Quy Nhơn, Ban Chủ nhiệm Khoa Kỹ thuật Công nghệ tạo điều kiện thuận lợi cho nhóm tập trung học tập Quy Nhơn suốt thời gian qua Xin chân thành cảm ơn quan tâm, giúp đỡ động viên bạn sinh viên học lớp KTĐ-ĐTK39A iv MỤC LỤC LỜI CAM ĐOAN i LỜI CẢM ƠN iv MỤC LỤC v DANH MỤC CÁC KÝ HIỆU .vii DANH MỤC CÁC CHỮ VIẾT TẮT viii DANH MỤC CÁC BẢNG x DANH MỤC CÁC HÌNH VẼ VÀ ĐỒ THỊ xi MỞ ĐẦU 1 Lý chọn đề tài Nội dung Phương pháp nghiên cứu Cấu trúc đồ án tốt nghiệp Chương TỔNG QUAN VỀ CÁC HỆ THỐNG ĐO LƯỜNG, GIÁM SÁT VÀ ĐIỀU KHIỂN TẠI VIỆT NAM 1.1 Giao thức truyền thông IEC 60870-5-101 1.2 Giao thức truyền thông IEC 60870-5-104 1.3 Tủ điện phân phối hạ DB 1.4 MOF – Metering Out Fit 1.5 Kết luận chương 10 Chương 11 THIẾT KẾ PHẦN CỨNG CỦA HỆ THỐNG 11 2.1 Cấu trúc phần cứng hệ thống 11 2.2 Các thiết bị phần cứng hệ thống 12 2.2.1 Raspberry Pi 12 2.2.2 WIFI Lora 32(V2) 15 2.2.3 Điện kế đa chức SENTRON PAC4200 17 2.2.4 PZEM-004T V3 18 2.3 Kết luận chương 19 Chương 20 v Mục lục THIẾT KẾ TỰ ĐỘNG HOÁ CHO HỆ THỐNG 20 Lập trình tự động hố cho trạm 20 3.1 3.1.1 Sơ đồ ghép nối thiết bị cho trạm 20 3.1.2 Lập trình cho Rasberry Pi 20 3.1.3 Lập trình cho WIFI LoRa 32(V2) trạm 24 Lập trình tự động hố cho trạm 27 3.2 3.2.1 Sơ đồ ghép nối thiết bị cho trạm 27 3.2.2 Lập trình cho WIFI LoRa 32(V2) trạm 28 3.3 Thiết kế giao diện cho hệ thống 30 3.3.1 Thiết kế giao diện Rasberry Pi 30 3.3.2 Thiết kế giao diện ThingsBoard 32 Kết luận chương 33 3.4 Chương 34 THỰC NGHIỆM TRÊN MƠ HÌNH 34 4.1 Mơ hình thực nghiệm 34 4.1.1 Mơ hình thực nghiệm trạm 34 4.1.2 Mơ hình thực nghiệm trạm 37 4.2 Thực nghiệm mơ hình 40 4.2.1 Giám sát giao diện 40 4.2.2 Thực nghiệm mơ hình trạm 43 4.2.3 Thực nghiệm mơ hình trạm 44 4.3 Kết luận chương 45 KẾT LUẬN 47 DANH MỤC CƠNG TRÌNH ĐÃ CƠNG BỐ CỦA ĐỒ ÁN 48 TÀI LIỆU THAM KHẢO 49 PHỤ LỤC 51 P.1 Chương trình lập trình cho Raspberry 51 P.2 Chương trình lập trình cho WIFI LoRa 32(V2) trạm 57 P.3 Chương trình lập trình cho WIFI LoRa 32(V2) trạm 63 DANH MỤC CÁC KÝ HIỆU Ký hiệu Đơn vị Ý nghĩa U V,kV Điện áp I A, kA Dòng điện P W, kW Công suất tác dụng Q VAr S VA, kVA cosφ Độ A kWh Công suất phản kháng Công suất biểu kiến Góc lệch pha Điện tiêu thụ vii DANH MỤC CÁC CHỮ VIẾT TẮT Nghĩa tiếng Việt Viết tắt Tên tiếng Anh IEC International Commission MSB Main Distribution Switchboard Tủ điện phân phối tổng DB Distribution Board Tủ điện phân phối hạ PSTN Public Switched Network FBS PCM Fall Back Switch Pulse - Code Modulation Thiết bị chuyển mạch Điều chế mã xung RTU Remote Terminal Unit Thiết bị đầu cuối điều khiển từ xa Electrotechnical Tiêu chuẩn hoá lĩnh vực điện - điện tử Telephone Mạng điện thoại chuyển mạch công cộng SCADA Supervisory Control And Data Hệ thống điều khiển giám sát Acquisition thu thập liệu DC Direct Current Dòng điện chiều AC Alternating Current Dòng điện xoay chiều TCP/IP Transmission Control Protocol/ Giao thức điều khiển truyền nhận/ Internet Protocol Giao thức liên mạng PCTTH Công ty Điện lực Thừa Thiên Huế GPRS General Packet Radio Service Dịch vụ vô tuyến tổng hợp ADSL Asymmetric Digital Subscriber Đường dây thuê bao bất đối xứng Line Cơ sở liệu CSDL MCB Miniature Circuit Breaker Cầu dao/aptomat (cắt dòng nhỏ) MCCB Molded Case Circuit Breaker Cầu dao/aptomat (cắt dòng lớn) ATS Automatic Transfer Switches Tủ chuyển nguồn tự động PLC MOF TI TU CPU GPU I/O Programmable Logic Controller Metering Out Fit Current Transformer Voltage Transformer Central Processing Unit Graphics Processing Unit Input/Output Bộ điều khiển logic lập trình Hợp đo lường Máy biến dòng điện Máy biến điện áp Bộ xử lí trung tâm (của máy tính) Bộ xử lí đồ hoạ (card đồ hoạ) Đầu vào/đầu viii Danh mục chữ viết tắt USB HD RAM UART Opto THD Universal Serial Bus High Definition Random Access Memory Universal Asynchronous Receiver / Transmitter Optocoupler Total Harmonic Distortion Chuẩn kết nối Độ (phân giải) nét cao Bộ nhớ truy xuất ngẫu nhiên Giao thức truyền liệu nối tiếp Linh kiện quang điện tử Giá trị tổng biến dạng sóng hài DANH MỤC CÁC BẢNG Bảng 2.1: Thông số Raspberry Pi 3B+ 14 x Phụ lục canvas31.draw() rects122 = ax4.bar(1, float(u1), color="#81FBF6") canvas32.draw() rects13 = ax5.bar(1, float(f1), color="#81FBF6") canvas33.draw() rects14 = ax6.bar(1, float(u2), color="#B1FEB5") canvas34.draw() rects15 = ax7.bar(1, float(f2), color="#B1FEB5") canvas35.draw() lines.set_xdata(np.arange(0, len(data))) lines.set_ydata(data) lines1.set_xdata(np.arange(0, len(data2))) lines1.set_ydata(data2+20) lines2.set_xdata(np.arange(0, len(data1))) lines2.set_ydata(data + 9) lines11.set_xdata(np.arange(0, len(data))) lines11.set_ydata(data) lines12.set_xdata(np.arange(0, len(data2))) lines12.set_ydata(data2 ) lines23.set_xdata(np.arange(0, len(data1))) lines23.set_ydata(data + 9) canvas.draw() canvas1.draw() 56 Phụ lục app.after(4000, plot_data1) self.after(4000, plot_data1) P.2 Chương trình lập trình cho WIFI LoRa 32(V2) trạm //Khai báo thư viện/ #include "string.h" #include "stdio.h" #include "heltec.h" #include "images.h" //cài đặt tần số truyền thông 433Hz #define BAND 433E6 String rssi = "RSSI "; String packSize = " "; String packet ; String RxString; long lastSendTime = 0; // last send time int interval = 1; String str; #define LED 25 void setup() { //khai báo cổng truyền thông cần thiết Heltec.begin(true /*DisplayEnable Enable*/, true /*Heltec.Heltec.Heltec.LoRa Disable*/, false /*Serial Enable*/, true /*PABOOST Enable*/, BAND /*long BAND*/); 57 Phụ lục Serial.begin(9600); Heltec.display->init(); pinMode(LED,OUTPUT); digitalWrite(LED,LOW); LoRa.setTxPower(14,RF_PACONFIG_PASELECT_PABOOST); LoRa.onReceive(onReceive); LoRa.receive(); } void loop() { //nhận truyền liệu if (millis() - lastSendTime > interval) { sendMessage(); lastSendTime = millis(); // timestamp the message interval = random(2000) + 1000; LoRa.receive();// 2-3 seconds } } //code nhận tín hiệu LoRra void get_lora_data() { boolean clr = 1; while (LoRa.available()) { if (clr == 1) { 58 Phụ lục RxString = ""; clr = 0; } RxString += (char)LoRa.read(); } clr = 1; } //code mã hoa tín hiệu Lora để truyền sang raspberry Pi void display_status() { String U0 = split_string( RxString, ';', 0); String I0 = split_string( RxString, ';', 1); String P0 = split_string( RxString, ';', 2); String f0 = split_string( RxString, ';', 3); String pf0 = split_string( RxString, ';', 4); String U1 = split_string( RxString, ';', 5); String I1 = split_string( RxString, ';', 6); String P1 = split_string( RxString, ';', 7); String f1 = split_string( RxString, ';', 8); String pf1 = split_string( RxString, ';', 9); String U2 = split_string( RxString, ';', 10); String I2 = split_string( RxString, ';', 11); String P2 = split_string( RxString, ';', 12); String f2 = split_string( RxString, ';', 13); 59 Phụ lục String pf2 = split_string( RxString, ';', 14); Serial.print("U0:"); Serial.print(U0); Serial.print(";"); Serial.print("I0:"); Serial.print(I0); Serial.print(";"); Serial.print("P0:"); Serial.print(P0); Serial.print(";"); Serial.print("f0:"); Serial.print(f0); Serial.print(";"); Serial.print("pf0:"); Serial.print(pf0); Serial.print(";"); Serial.print("U1:"); Serial.print(U1); Serial.print(";"); Serial.print("I1:"); Serial.print(I1); Serial.print(";"); Serial.print("P1:"); 60 Phụ lục Serial.print(P1); Serial.print(";"); Serial.print("f1:"); Serial.print(f1); Serial.print(";"); Serial.print("pf1:"); Serial.print(pf1); Serial.print(";"); Serial.print("U2:"); Serial.print(U2); Serial.print(";"); Serial.print("I2:"); Serial.print(I2); Serial.print(";"); Serial.print("P2:"); Serial.print(P2); Serial.print(";"); Serial.print("f2:"); Serial.print(f2); Serial.print(";"); Serial.print("pf2:"); Serial.print(pf2); Serial.println(""); 61 Phụ lục //code để tách chuổi liệu lấy giá trị số String split_string(String data, char separator, int index) { int found = 0; int strIndex[] = { 0, -1 }; int maxIndex = data.length(); for (int i = 0; i clear(); Heltec.display->drawXbm(0,5,logo_width,logo_height,logo_bits); 64 Phụ lục Heltec.display->display(); } void LoRaData(){ Heltec.display->clear(); Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT); Heltec.display->setFont(ArialMT_Plain_10); Heltec.display->drawString(0 , 10 , "Received "+ String(volt0)); Heltec.display->display(); } void setup() { Serial.begin(9600); //WIFI Kit series V1 not support Vext control Heltec.begin(true /*DisplayEnable Enable*/, true /*Heltec.Heltec.Heltec.LoRa Disable*/, false /*Serial Enable*/, true /*PABOOST Enable*/, BAND /*long BAND*/); Heltec.display->init(); Heltec.display->flipScreenVertically(); Heltec.display->setFont(ArialMT_Plain_10); logo(); delay(1500); //khai báo chân đo PZem cho Lora WIFI 32 65 Phụ lục ModbusSerial1.begin(9600, SERIAL_8N1, 12, 13); ModbusSerial2.begin(9600, SERIAL_8N1, 23, 17); Serial.print("Reset Energy"); pzem0.resetEnergy(); Serial.print("Set address to 0x42"); pzem0.setAddress(0x42); pinMode(LED,OUTPUT); digitalWrite(LED,LOW); LoRa.onReceive(onReceive); LoRa.receive(); } void loop() { // nơi chương trình thưc if (millis() - lastSendTime > interval) { sendMessage(); lastSendTime = millis(); // timestamp the message interval = random(2000) + 1000; LoRa.receive();// 2-3 seconds } } // gửi liệu đo lường mà Lora WIFI 32 nhận từ PZEM void sendMessage(){ 66 Phụ lục float volt2 = pzem2.voltage(); if(String(volt2)=="nan")volt2=0; float cur2 = pzem2.current(); if(String(cur2)=="nan")cur2=0; float powe2 = pzem2.power(); if(String(powe2)=="nan")powe2=0; float ener2 = pzem2.energy(); if(String(ener2)=="nan")ener2=0; float freq2 = pzem2.frequency(); if(String(freq2)=="nan")freq2=0; float pf2 = pzem2.pf(); if(String(pf2)=="nan")pf2=0; float volt1 = pzem1.voltage(); if(String(volt1)=="nan")volt1=0; float cur1 = pzem1.current(); if(String(cur1)=="nan")cur1=0; ; float powe1 = pzem1.power(); if(String(powe1)=="nan")powe1=0; float ener1 = pzem1.energy(); if(String(ener1)=="nan")ener1=0; float freq1 = pzem1.frequency(); if(String(freq1)=="nan")freq1=0; 67 Phụ lục float pf1 = pzem1.pf(); if(String(pf1)=="nan")pf1=0; float volt0 = pzem0.voltage(); if(String(volt0)=="nan")volt0=0; float cur0 = pzem0.current(); if(String(cur0)=="nan")cur0=0; float powe0 = pzem0.power(); if(String(powe0)=="nan")powe0=0; float ener0 = pzem0.energy(); if(String(ener0)=="nan")ener0=0; float freq0 = pzem0.frequency(); if(String(freq0)=="nan")freq0=0; float pf0 = pzem0.pf(); if(String(pf0)=="nan")pf0=0; i=i+5; LoRa.beginPacket(); LoRa.setTxPower(14,RF_PACONFIG_PASELECT_PABOOST); LoRa.print(volt2); LoRa.print(";"); LoRa.print(cur2); LoRa.print(";"); LoRa.print(ener2); LoRa.print(";"); LoRa.print(freq2); 68 Phụ lục LoRa.print(";"); LoRa.print(pf2); LoRa.print(";"); LoRa.print(volt1); LoRa.print(";"); LoRa.print(cur1); LoRa.print(";"); LoRa.print(ener1); LoRa.print(";"); LoRa.print(freq1); LoRa.print(";"); LoRa.print(pf1); LoRa.print(";"); LoRa.print(volt0); LoRa.print(";"); LoRa.print(cur0); LoRa.print(";"); LoRa.print(ener0); LoRa.print(";"); LoRa.print(freq0); LoRa.print(";"); LoRa.print(pf0); LoRa.endPacket(); 69 Phụ lục } //Nhận tín hiệu Lora từ Trạm để điều khiển Relay void onReceive(int packetSize) { // try to parse packet if (packetSize==0) return; // received a packet while (LoRa.available()) { sprintf(Readback+strlen(Readback),"%c",(char)LoRa.read()); } if(strncmp(Readback, "OpenLED", strlen(Readback)) == 0) { digitalWrite(LED, HIGH); } else if(strncmp(Readback, "CloseLED", strlen(Readback)) == 0) { digitalWrite(LED, LOW); } memset(Readback,0,50); // print RSSI of packet } 70 ... TRÊN CÔNG NGHỆ IoT Chuyên ngành: Kỹ thuật Điện, Điện tử GVHD: TS NGUYỄN AN TỒN SVTH: NGUYỄN NGỌC THIỆN Bình Định, 01/2021 LỜI CAM ĐOAN Tôi xin cam đoan đồ án tốt nghiệp“Thiết kế hệ thống điều khiển... tơi xin chịu hồn tồn trách nhiệm Bình Định, ngày 10 tháng 01 năm 2021 Sinh viên thực Nguyễn Ngọc Thiện LỜI CẢM ƠN Đầu tiên, nhóm xin bày tỏ lịng tri ân sâu sắc kính trọng đến ThS Nguyễn An Toàn,... viên cán Khoa Kỹ thuật Công nghệ - Đại học Quy Nhơn tận tình giúp đỡ nhóm q trình nghiên cứu hồn thiện đồ án Nhóm xin trân trọng cảm ơn cán bộ, sinh viên cựu sinh viên khoa Kỹ thuật Công nghệ -