thể hiện sơ đồ nối dây chi tiết giữa các phần tử, đồng thời ta có thể mơ phỏng để kiểm chứng các chức năng hoạt động của hệ thống thiết kế. Hình 2.8 thể hiện sơ đồ nối dây chi tiết của hệ thống đã thiết kế trên phần mềm Proteus 8.8.
Arduino WeMos D1 R1 Module PZEM004T Module PZEM004T Module PZEM004T Module relay Ngõ vào điện áp Hình 2.9: Hình ảnh tổng thể của hệ thống
Proteus 8.8, tác giả tiến hành thiết kế và lắp ráp mạch của hệ thống thực nghiệm theo sơ đồ nối dây chi tiết đã thực hiện. Kết nối các phần tử lại với nhau sẽ được hệ thống hồn chỉnh để giám sát và phân tích chất lượng điện năng trong đề tài này có hình ảnh tổng thể như Hình 2.9. Các phần tử chính của hệ thống bao gồm: 03 máy biến dòng 100/1A cho ba pha, 03 module PZEM004T để đo lường các đại lượng điện của ba pha, 01 bo mạch Arduino WeMos D1 R1, 01 module rơle để mở rộng phần điều khiển. Cách thức lắp đặt hệ thống để thực hiện việc giám sát và phân tích chất lượng điện năng đó là: Điện áp ba pha A, B, C và dây trung tính N của mạng điện hạ áp 380/220V được đưa vào ngõ vào điện áp của hệ thống. Tại ngõ vào này, điện áp pha nào sẽ được đưa vào đầu vào điện áp của PZEM004T của pha đó. Dịng điện pha A, B, C của phần mạch lực sẽ được biến đổi sang phía thứ cấp của ba máy biến dòng và được đưa vào đầu vào dòng điện của ba PZEM004T.
2.3. Kết luận chương 2
Nội dung chương 2 đã thể hiện được việc thiết kế lựa chọn các thiết bị phần cứng của hệ thống giám sát và phân tích chất lượng điện năng dựa trên cơng nghệ IoT. Các linh kiện điện tử phục vụ cho việc đo lường, điều khiển, hiển thị chẳng hạn như máy biến dịng 100/1A, module PZEM004T, bo mạch Arduino Wemos D1 R1, mơđun wifi kết nối với Arduino,. . . đã được lựa chọn để thu thập dữ liệu, xử lý và tính tốn các thơng số mong muốn như điện áp, dịng điện, công suất, điện năng tiêu thụ,. . . Sơ đồ kết nối dây giữa các thiết bị phần cứng, sơ đồ chi tiết thể hiện sự đấu nối giữa các phần tử cũng đã được trình bày trong chương này. Sau khi nghiên cứu lắp ráp hệ thống phần cứng hồn chỉnh thì tổng thể của hệ thống cũng được thể hiện giúp người đọc dễ dàng hình dung.
CHƯƠNG 3.
THIẾT KẾ CHƯƠNG TRÌNH GIÁM SÁT VÀ PHÂN TÍCH CHẤT LƯỢNG ĐIỆN NĂNG
DỰA TRÊN CƠNG NGHỆ IoT
Các dữ liệu đo lường từ hệ thống được lắp đặt tại vị trí cần giám sát sẽ được thu thập và đẩy lên Internet để phục vụ cho việc giám sát và phân tích chất lượng điện năng tại vị trí cần giám sát. Một ứng dụng dựa trên công nghệ IoT được sử dụng trong luận văn này đó là phần mềm ThingSpeak. Sau khi thiết lập các thông số ban đầu cần thiết để phần mềm thiết kế trên ThingSpeak có thể kết nối với hệ thống thơng qua Internet thì tất cả các thông số chất lượng điện năng sẽ được giám sát và phân tích một cách đầy đủ và trực quan thơng qua các biểu đồ. Hoặc có thể sử dụng các cách thức lưu trữ và phân tích kết quả bằng phần mềm khác như: Matlab, Excel,... khi cần thiết. Do đó, nội dung cơ bản của chương này sẽ tập trung vào việc ứng dụng các phần mềm để viết lệnh nạp vào bo mạch Arduino nhằm mục đích đọc được các dữ liệu đo lường từ các module PZEM004T sau đó đẩy dữ liệu lên mạng Internet để hiển thị trên giao diện được thiết kế trên phần mềm ThingSpeak.
3.1. Các giao thức truyền thông trong các ứng dụng IoT
Trong luận văn này, các dữ liệu đo lường của hệ thống đặt tại vị trí cần giám sát sẽ được truyền thơng dữ liệu lên mạng Internet để thực hiện việc giám sát và phân tích chất lượng điện năng trên phần mềm Thingspeak tại các máy tính hoặc smartphone có kết nối với Internet. Q trình truyền thơng dữ liệu đó có thể được thực hiện theo một số giao thức truyền thơng. Hiện nay có năm giao
thức truyền tải dữ liệu phổ biến có thể được sử dụng trong các ứng dụng IoT như sau:
- MQTT (Message Queue Telemetry Transport) - CoAP (Constrained Applications Protocol) - AMQP (Advanced Message Queue Protocol)
- XMPP (Extensible Messaging và Presence Protocol) - DDS (Data Distribution Service)
3.1.1. MQTT (Message Queue Telemetry Transport)
Hình 3.1 thể hiện giao thức MQTT, nó là một giao thức mã nguồn mở để truyền các messages giữa nhiều Client (Publisher và Subscriber) thông qua một Broker trung gian, được thiết kế để đơn giản và dễ dàng triển khai. Kiến trúc MQTT dựa trên Broker trung gian và sử dụng kết nối TCP long-lived từ các Client đến Broker. MQTT hỗ trợ tổ chức hệ thống theo các Topics có tính phân cấp, như một hệ thống tập tin (ví dụ: /Home/kitchen/humidity), cung cấp nhiều lựa chọn điều khiển và QoS (Quality of Service). MQTT là một giao thức khá nhẹ nên có thể được sử dụng cho truyền thơng 2 chiều thơng qua các mạng có độ trễ cao và độ tin cậy thấp, nó cũng tương thích với các thiết bị tiêu thụ điện năng thấp.
3.1.2. CoAP (Constrained Applications Protocol)
CoAP (Hình 3.2) là một giao thức truyền tải tài liệu theo mơ hình clien- t/server dựa trên Internet tương tự như giao thức HTTP nhưng được thiết kế cho các thiết bị ràng buộc. Giao thức này hỗ trợ một giao thức one-to-one để chuyển đổi trạng thái thông tin giữa client và server. CoAP sử dụng UDP (User Datagram Protocol), khơng hỗ trợ TCP, ngồi ra cịn hỗ trợ địa chỉ broadcast và multicast, truyền thông CoAP thông qua các datagram phi kết nối (connec- tionless) có thể được sử dụng trên các giao thức truyền thơng dựa trên các gói.
Hình 3.1: Giao thức truyền thơng MQTT
UDP có thể dễ dàng triển khai trên các vi điều khiển hơn TCP nhưng các cơng cụ bảo mật như SSL/TSL khơng có sẵn, tuy nhiên ta có thể sử dụng Datagram Transport Layer Security (DTLS) để thay thế.
3.1.3. AMQP (Advanced Message Queue Protocol)
AMQP (Hình 3.3) là một giao thức làm trung gian cho các gói tin trên lớp ứng dụng với mục đích thay thế các hệ thống truyền tin độc quyền và khơng tương thích. Các tính năng chính của AMQP là định hướng message, hàng đợi, định tuyến (bao gồm point-to-point và publish-subscribe) có độ tin cậy và bảo mật cao. Các hoạt động sẽ được thực hiện thơng qua broker, nó cung cấp khả năng điều khiển luồng (Flow Control). Một trong các Message Broker phổ biến là RabbitMQ, được lập trình bằng ngơn ngữ Erlang, RabbitMQ cung cấp cho lập trình viên một phương tiện trung gian để giao tiếp giữa nhiều thành phần trong một hệ thống lớn. Không giống như các giao thức khác, AMQP là một giao thức có dây (wire-protocol), có khả năng diễn tả các message phù hợp với định dạng dữ liệu, có thể triển khai với rất nhiều loại ngơn ngữ lập trình.
Hình 3.3: Giao thức truyền thơng AMQP
3.1.4. DDS (Data Distribution Service)
DDS (Hình 3.4) là một ngơn ngữ trung gian dựa vào dữ liệu tập trung được sử dụng để cho phép khả năng mở rộng, thời gian thực, độ tin cậy cao và trao đổi dữ liệu tương tác. Đây là một giao thức phi tập trung (broker-less) với truyền thông ngang hàng trực tiếp theo kiểu peer-to-peer giữa các publishers và subscribers và được thiết kế để trở thành một ngôn ngữ và hệ điều hành độc lập. DDS gửi và nhận dữ liệu, sự kiện, và thơng tin lệnh trên UDP nhưng cũng
có thể chạy trên các giao thức truyền tải khác như IP Multicast, TCP/IP, bộ nhớ chia sẻ,. . . DDS hỗ trợ các kết nối được quản lý many-to-many theo thời gian thực và ngoài ra cịn hỗ trợ dị tìm tự động (automatic discovery). Các ứng dụng sử dụng DDS cho truyền thông được tách riêng và không yêu cầu sự can thiệp từ các ứng dụng của người dùng, có thể đơn giản hóa việc lập trình mạng phức tạp. Các tham số QoS được sử dụng để xác định các cơ chế tự dị tìm của nó được thiết lập một lần.
Hình 3.4: Giao thức truyền thơng DDS
3.1.5. XMPP (Extensible Messaging và Presence Protocol)
XMPP (Hình 3.5) là giao thức truyền thơng dùng cho định hướng tin nhắn trung gian dựa trên ngôn ngữ XML. XMPP là mô hình phân quyền client-server phi tập trung, được sử dụng cho các ứng dụng nhắn tin văn bản. Có thể nói XMPP gần như là thời gian thực và có thể mở rộng đến hàng trăm hàng nghìn nút. Dữ liệu nhị phân phải được mã hóa base64 trước khi nó được truyền đi trong băng tần. XMPP tương tự như MQTT, có thể chạy trên nền tảng TCP.
Hình 3.5: Một ví dụ về XMPP
3.2. Giới thiệu các phần mềm để thiết kế
3.2.1. Phần mềm ThingSpeak
ThingSpeak là một clound service khá nổi tiếng và phổ biến trong cộng đồng IoT, nó cho phép người dùng đưa dữ liệu lên cloud và từ cloud lấy dữ liệu về qua giao thức HTTP. Trong đề tài này, ThingSpeak được áp dụng để thiết kế chương trình phần mềm giám sát và phân tích các dữ liệu đo lường bao gồm: tần số, điện áp, dịng điện, cơng suất và điện năng tiêu thụ từ hệ thống đưa lên ThingSpeak. Một ưu điểm của ThingSpeak là có tích hợp phần mềm Matlab, do đó chúng ta có thể dễ dàng phân tích tập dữ liệu đo lường bằng các đoạn chương trình tính tốn và hiển thị dưới dạng biểu đồ trong Matlab. Trong mục này, cách tạo 1 tài khoản ThingSpeak và 1 Data Channel và dùng Blocky để đưa data lên channel này thông qua giao thức HTTP bao gồm các bước như sau:
Bước 1: Tạo tài khoản ThingSpeak
Truy cập vào địa chỉ https://thingspeak.com và chọn Sign Up để đăng ký một tài khoản miễn phí. Sau khi điền đầy đủ các thơng tin u cầu, ta sẽ nhận được email yêu cầu xác thực tài khoản email như 3.6
Hình 3.6: Giao diện đăng ký tạo tài khoản trên ThingSpeak
Sau khi xác thực, ta sẽ có thể login vào và thấy được các thông tin về tài khoản của mình.
Bước 2: Tạo Data Channel
Sau khi login, ta cần tạo một data channel để lưu trữ dữ liệu. Trong My Channels, ta chọn New Channel và điền các thông tin cần thiết.
Một ví dụ ở đây là chúng ta tạo 1 channel để chứa các dữ liệu từ cảm biến với Field 1 là nhiệt độ (temperature) và Field 2 là độ ẩm (humidity) như 3.7:
Hình 3.7: Giao diện tạo Data Channel trên ThingSpeak
Bước 3: Lấy URL cần thiết để upload dữ liệu
Để đọc hay ghi dữ liệu về ta cần biết URL để truy cập. Ta mở kênh mới tạo, tìm đến tab API Keys và sẽ thấy được các URL để đọc hay ghi dữ liệu:
Bước 4: Upload dữ liệu từ Blocky
Hình 3.8: Giao diện lấy URL để upload dữ liệu trên ThingSpeak
liệu lên ThingSpeak, ta có thể xem các dữ liệu này trong channel, tab Private View.
Hình 3.9: Giao diện upload dữ liệu từ Blocky trên ThingSpeak
3.2.2. Phần mềm Arduino IDE
Arduino IDE là một chương trình phần mềm mã nguồn mở cho phép người dùng viết và tải lên mã trong một mơi trường làm việc thời gian thực. Vì mã này sau đó sẽ được lưu trữ trong đám mây. Hệ thống này hồn tồn tương thích với bất kỳ bo mạch phần mềm Arduino nào. Giao diện chính của phần mềm
Arduino IDE được thể hiện như Hình 3.10.
Hình 3.10: Giao diện chương trình Arduino IDE
Trong đề tài này ứng dụng phần mềm Arduino IDE để lập trình chương trình nạp vào bo mạch Arduino WeMos D1 R1. Nhiệm vụ của đoạn chương trình trong phần mềm này là phải đọc được các dữ liệu đo được từ các module PZEM004T bằng một số lệnh cơ bản có cú pháp và ý nghĩa được trình bày trong Bảng 3.1. Sau khi bo mạch Arduino WeMos D1 R1 đọc được dữ liệu từ các PZEM004T thì nó sẽ tiếp tục gửi dữ liệu lên Cloud của ThingSpeak nhờ module ESP8266 tích hợp trên bo mạch Arduino WeMos. Các lệnh cơ bản để gửi dữ liệu từ bo mạch Arduino WeMos lên ThingSpeak có cú pháp và ý nghĩa được trình bày trong Bảng 3.2. Đoạn code của chương trình trên Arduino IDE được lập trình và nạp vào bo mạch Arduino WeMos D1 R1 để thực hiện chức năng giám sát và phân tích chất lượng điện năng của hệ thống thiết kế.
Bảng 3.1: Một số hàm đọc giá trị đo từ PZEM004T
Cấu trúc hàm Ý nghĩa
pzem_info pzemData = pzem.getData(); Hàm đọc dữ liệu đo lường từ PZEM004T
float voltage = (pzemData.volt); Hàm đọc giá trị điện áp từ PZEM004T và
gán cho biến voltage
float current = (pzemData.ampe); Hàm đọc giá trị dòng điện từ PZEM004T và
gán cho biến current
float freq = (pzemData.freq); Hàm đọc giá trị tần số từ PZEM004T và gán
cho biến freq
float power = (pzemData.power); Hàm đọc giá trị công suất từ PZEM004T và
gán cho biến power
float energy = (pzemData.energy); Hàm đọc giá trị điện năng tiêu thụ từ
PZEM004T và gán cho biến energy
float pf = (pzemData.powerFactor); Hàm đọc giá trị hệ số công suất từ
PZEM004T và gán cho biến pf
3.3. Xây dựng thuật tốn chương trình
3.3.1. Thuật tốn chương trình
Lưu đồ thuật tốn gửi dữ liệu lên Internet và giám sát bằng phần mềm ThingSpeak của hệ thống được thể hiện trong Hình 3.11. Bắt đầu thiết lập các cổng ra vào, khởi tạo tạo các giá trị ban đầu, khởi tạo PZEM004T. Sau đó đọc dữ liệu từ các PZEM004T, thiết lập kết nối Wifi trên Wemos D1 R1. Nếu có kết nối Wifi thì gửi các giá trị đọc được từ các PZEM004T lên Thingspeak cloud. Nếu không kết nối được Wifi (nguyên nhân do đổi mật khẩu hay đứt cáp Wifi) thì hệ thống sẽ thiết lập phát Wifi trên Wemos D1 R1. Sau đó ta sẽ kết nối vào điểm truy cập Wifi của Wemos D1 R1 phát ra, tiếp theo ta mở trình duyệt web nhập Ip 192.168.4.1 để đổi tên và mật khẩu Wifi mới sau đó lưu vào EPPROM ESP8266. Nhấn nút reset để bắt đầu lại chương trình.
Bảng 3.2: Một số hàm gửi dữ liệu từ Arduino WeMos lên ThingSpeak Cú pháp hàm Ý nghĩa void thingspeak() { ur += "&field1="; ur += String(voltage); }
Khai báo hàm con thingspeak Khởi tạo trường field
Đẩy dữ liệu biến voltage cho trường field
để thu thập và đo lường các đại lượng điện của cả ba pha. Các dữ liệu này sẽ được truyền đến bo mạch Arduino Wemos D1 R1 thông qua việc giao tiếp và nhận lệnh truyền - nhận giữa chúng. Để có thể đọc được dữ liệu đo lường từ các module PZEM004T thì chúng ta cần phải lập trình các đoạn lệnh để nạp vào bo mạch Arduino. Lưu đồ thuật tốn trên được sử dụng để lập trình các đoạn code trong phần mềm Arduino IDE và nạp vào bo mạch Arduino WeMos D1 R1 để thực hiện đầy đủ các chức năng của hệ thống. Các bước cơ bản của thuật toán như sau:
Bước 1: Thiết lập các cổng vào ra. Bước này thực hiện nhiệm vụ thiết lập
chức năng của các cổng vào ra trên bo mạch Arduino WeMos cho đúng với chức năng là cổng vào hay cổng ra; cổng truyền nhận dữ liệu,. . .
Bước 2: Khởi tạo các giá trị ban đầu của các biến đo lường ở mỗi PZEM004T.
Trước khi đọc liên tục các dữ liệu đo: tần số, điện áp, dịng điện, cơng suất, hệ số công suất và điện năng tiêu thụ của mỗi PZEM004T thì chương trình phải gán tất cả các đại lượng này bằng 0, sau khi đọc được giá trị sẽ liên tục cập nhật vào các biến.
Bước 3: Đọc dữ liệu đo lường từ cả ba PZEM004T. Khi nhận được lệnh truyền
tín hiệu ở chân RX của module PZEM004T được gửi từ module Arduino WeMos thì PZEM004T sẽ đẩy gói dữ liệu đo được đến bo mạch Arduino WeMos. Quá trình này cứ thế được lặp đi lặp lại liên tục trong thời gian thực trong suốt quá trình hoạt động của hệ thống.
Bắt đầu
Thiết lập các cổng vào ra
Khởi tạo giá trị ban đầu của mỗi PZEM004T: fa = 0; Ua = 0; Ia = 0; Pa = 0; Aa = 0 fb = 0; Ub = 0; Ib = 0; Pb = 0; Ab = 0 fc = 0; Uc = 0; Ic = 0; Pc = 0; Ac = 0