WEB – МОНИТОР ПАРАМЕТРОВ ЭЛЕКТРИЧЕСКОЙ
СЕТИ ЗА $30

 Предлагаю описание простого и недорогого устройства для измерения напряжения, тока и мощности в электрической сети 220В для потребителей с током потребления не больше 30А с последующим отображением результатов измерения в виде графиков на WEB странице через компьютерную сеть. Это устройство можно собрать самостоятельно следуя этой инструкции. Предполагается что ви обладаете навыками макетирования и программирования микроконтроллеров Arduino.
 Все компоненты, необходимые для сборки устройства, можно приобрести в интернет-магазине, например arduino.ua.
 Нам потребуются:
Arduino Nano
Микроконтроллер ARDUINO NANO
или любой другой подобный микроконтроллер,
например ARDUINO UNO, MICRO, MINI
датчик тока ACS712
Датчик тока ACS712 30A GY-712
Ethernet модуль ENC28J60
Ethernet модуль ENC28J60
Модуль питания TSP-05
Модуль питания TSP-05 220В - 5В 3Вт
или любой другой источник питания 5В для Arduino
Трансформатор 220/12В
Трансформатор 220/12В небольшой мощности
Можно использовать и другие,
например 220/24В, 220/9В, 220/6В.
Но при этом потребуется подобрать
параметры делителя напряжения в схеме.
Резистор и электролитический конденсатор
Четыре резистора 0.25W:
220кОм - 2 шт; 100кОм, 5.6кОм по одной штуке и
электролитический конденсатор на 10 мкФ на напряжение не менее 10В.
Резистор и электролитический конденсатор

Соединительные проводники
мама-мама и провода ПСВ (ВВГ) 0.5мм2 для коммутации цепи 220 В

Ниже приводится принципиальная схема применительно к сети переменного тока 220В до 30А, 6 кВт полной нагрузки. Этот набор оборудования позволяет мониторить и цепи постоянного тока до 30А с доработкой схемы измерения напряжения. В цепях постоянного тока трансформатор не нужен. Достаточно подобрать параметры делителя напряжения и помнить, что при этом не будет гальванической развязки между силовой и измерительной цепью.

принципиальная схема для измерения напряжения, тока и мощности в электрической сети 220В

 Для измерения тока в электрической сети используется датчик ACS712 30A GY-712, который построен на одноименной микросхеме ACS712ELCTR-30A-T фирмы Allegro. Эта микросхема обеспечивает точное измерение постоянного и переменного электрического тока за счет использования эффекта Холла и обеспечивает гальваническую развязку высоковольтной и измерительной части цепи. Ниже показана принципиальная схема включения микросхемы.

принципиальная схема включения микросхемы ACS712ELCTR

 Измеряемый ток,Ip, протекает от контактов 1, 2 к контактам 3,4. На выходе микросхемы (контакт 7) при Ip=0, напряжение равно половине напряжения питания микросхемы Vout=5/2 = 2.5В. При Ip=+30А (ток протекает в направлении от контактов 1,2 к контактам 3,4) на выходе микросхемы (контакт 7) будет напряжение Vout = 2.5 + 30 * 0.066 = 4.48B. При Ip=-30А (ток протекает в направлении от контактов 3,4 к контактам 1,4) на выходе микросхемы (контакт 7) будет напряжение Vout = 2.5 - 30 * 0.066 = 0.52B.
 Таким образом, при протекании переменного тока в контролируемой электрической сети, на аналоговом входе А0 микроконтроллера ARDUINO NANO будет напряжение, которое изменяется по синусоиде с частотой, равной частоте в электрической сети. Амплитуда напряжения на входе А0 будет пропорциональна электрическому току (линия А0 на графике внизу).
 Для измерения напряжения в электрической сети используется обычный трансформатор 220/12В, который подключен через четыре резистора и конденсатор к аналоговому входу А1 микроконтроллера ARDUINO NANO. Эти четыре резистора и конденсатор обеспечивают уменьшение амплитуды колебаний напряжения со смещением до напряжения, равном половине напряжения питания (5/2=2.5В) на входе микроконтроллера. В итоге, на входе А1 при напряжении в электрической сети равном нулю будет напряжение 2.5В. В точке максимума амплитуды сетевого напряжения 220В, напряжение на А1 будет составлять примерно 3.6B. В точке минимума амплитуды сетевого напряжения, напряжение на А1 будет примерно 1.44B. Это напряжение можно подогнать к нужному диапазону путем подбора пары резисторов 100кОм и 5.6кОм.
 В результате на входе А1 должна быть синусоида, как показано на графике внизу.

синусоида

 Если в контролируемой электрической сети ток протекает через активную нагрузку, например электронагреватель или лампу накаливания, то синусоиды А0 и А1 будут совпадать по фазе. Т.е., синусоида тока и напряжения будут переходить через ноль в одно и тоже время, как показано на графике вверху.
 Если потребителем будет нагрузка с индуктивной составляющей, например, трансформатор или электродвигатель, то синусоиды А0 и А1 не будут совпадать по фазе. Синусоида тока и напряжения будут переходить через ноль в разное время со смещением φ, как показано графике внизу. При этом синусоида тока (А0) будет отставать.

синусоида

 В случае, если потребителем будет нагрузка с емкостной составляющей, синусоида А0 будет опережать синусоиду А1, как показано на графике внизу.

синусоида
 В цепях переменного синусоидального тока, по причине постоянного изменения значения напряжения и тока, мощность нельзя вычислить путем простого перемножения напряжения на ток. Поэтому, выделяют сразу три вида электрической мощности: активную, реактивную и полную.
Активная мощность в цепях синусоидального тока
Единица измерения — ватт (обозначение: Вт; международное обозначение: W).


 где P - активная мощность, Вт;
  U - среднеквадратическое напряжение, В;
  I - среднеквадратический ток, А;
  φ - угол сдвига фаз напряжения и тока, град.
Активная мощность определяет ту часть электрической энергии, которая используется непосредственно на выполнение полезной работы.
Реактивная мощность в цепях синусоидального тока
Единица измерения — вольт-ампер реактивный (обозначение: вар; международное обозначение: var)


 где Q - реактивная мощность, вар;
  U - среднеквадратическое напряжение, В;
  I - среднеквадратический ток, А;
  φ - угол сдвига фаз напряжения и тока, град.
Реактивная мощность определяет ту часть электрической энергии, которая бесполезно расходуется в электрических сетях.
Полная мощность в цепях синусоидального тока
Единица полной электрической мощности — вольт-ампер (обозначение: ВА; международное обозначение: VA)


 где S - полная мощность, ВА;
  P - активная мощность, Вт;
  Q - реактивная мощность, вар;
Полная мощность соответствует всей энергии, которая расходуется в электрических сетях.

Алгоритм вычисления следующий.
 Через аналоговые входы А0 и А1 постоянно считываем текущие значения напряжения и тока, возводим их в квадрат и суммируем. С периодичностью в одну секунду, вычисляем среднеквадратичное значение для напряжения и тока. Произведение среднеквадратичного значения напряжения и тока дает величину полной мощности.
 Ниже приведен листинг программы.
 Вам потребуется библиотека UIPEthernet. В IDE Arduino 1.8.4 еее можно установить через меню «Скетч»-«Подключить библиотеку» - «Управлять библиотеками» - «Менеджер библиотек» - UIPEthernet. Также можно скачать библиотеку с GitHub по адресу https://github.com/UIPEthernet/UIPEthernet.

IDE Arduino 1.8.4
/*ПРОГРАММА ДЛЯ ИЗМЕРЕНИЯ ПАРАМЕТРОВ ЭЛЕКТРИЧЕСКОЙ СЕТИ 
Контроллер - Arduino Nano
Ethernet модуль - ENC28J60
Датчик тока - ACS712 30A GY-712
Трансформатор для измерения напряжения - 220/12В
  
Разработка - LIC CONTROL  http://lic.com.ua
Схема: http://lic.com.ua/article08.htm
Соединение Arduino Nano <-> ENC28J60
    D2  - INT
    D3  - RESET
    D10 - CS
    D11 - SI (ST)
    D12 - SO
    D13 - SCK
Соедините Arduino Nano и ENC28J60 по этой схеме.
Подключите Ethernet модуль в сеть.
Загрузите программу в контроллер, и в поисковой строке барузера наберите
http://192.168.100.10/ и нажмите Enter. 
Ваш компьютер должен быть обязательно подключен к Интернету.
Если вы сделали все правильно, появиться страничка с демонстрационными графиками.
После этого можно подключить датчик тока - ACS712 30A GY-712 и трансформатор и 
подобрать коэффициенты kI,kV для получения правильных данных.
Установите #define DEMO false когда будете измерять реальные данные 
*/
#include <UIPEthernet.h>
#define DEMO true //установите false для реального измерения
const char page1[] PROGMEM =
"<!DOCTYPE html>\n"
"<html>\n"
"<meta charset='UTF-8'>\n"
"<title>WEB MONITOR</title>\n"
"<link href='http://liccontrol.com/web/gauge.ico' rel='icon' type='image/x-icon'/>\n"
"<link rel='stylesheet' href='http://liccontrol.com/web/style.css' type='text/css'>\n"
"<script src='http://code.jquery.com/jquery-3.1.1.min.js'></script>\n"
"<script src='http://code.highcharts.com/highcharts.js'></script>\n"
"</head>\n"
;
const char page2[] PROGMEM =
"<body>\n"
"<table id='MainTab' border='0' cellspacing='0' cellpadding='0'>\n"
"<tbody><tr ><td><div id='trend'></div></td></tr></tbody>\n"
"</table>\n"
"<script src='http://liccontrol.com/web/trend.js'></script>\n"
"</body></html>\n"
;   
const char page3[] PROGMEM =
"HTTP/1.1 200 OK\n"
"Content-Type: text/html\n"
"Pragma: no-cache\n"
"Connection: close\r\n\r\n"
;

int IPin = A1;  //Аналоговый вход для измерения тока
int VPin = A0;  //Аналоговый вход для измерения напряжения
//текущее и суммарное значение тока
double I=0.0, I1 = 0.0, I2 = 0.0;     
//текущее и суммарное значение напряжения
double V=0.0, V1 = 0.0, V2 = 0.0;     
float S = 0.0;      //полная мощность
float P = 0.0;      //активная мощность 
float Q = 0.0;      //реактивная мощность 
float P1 = 0.0;     //мгновенная мощность
float kI = 0.07398; //коэффициент измерения тока
float kV = 0.97656; //коэффициент измерения напряжения
//Уникальный mac-адрес. Если будет повторение,
//Ethernet – модуль работать не будет!
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; 
//Установите подходящий для вас адрес             
IPAddress ip(192, 168, 100, 10);  
EthernetServer server(80);
String result="";
unsigned long time1 = 0, count=0, count1=0;
unsigned long t1 = 0;
boolean Restart = true;

//Перезапуск микросхемы ENC28J60
void resetENC28J60() {
  digitalWrite(3, LOW);    
  delay(200);           
  digitalWrite(3, HIGH);
  delay(100); 
}

//Процедура измерения тока и напряжения
void MesureData() {  
  unsigned long dt = (unsigned long)(millis() - t1);  
  //мгновенное значение тока,А
  I1 = kI*(analogRead(IPin) - 512);    
  if (DEMO) I1 = sin(1.5*(millis()-time1)/60000.0)*10.0+20.0;
  I2 += pow(I1,2);
  //мгновенное значение напряжения,В 
  V1 = kV*(analogRead(VPin) - 512);    
  if (DEMO) V1 = sin((millis()-time1)/60000.0)*50.0+200.0;   
  V2 += pow(V1,2);  
  P1 += I1 * V1; 
  if ((dt>1000)and(count>0)) {
      count1++;
      I = sqrt(I2/count); //среднеквадратичное значение тока,А
      V = sqrt(V2/count); //среднеквадратичное значение напряжения,В
      S = I * V;          //полная мощность, ВА
      P = P1/count;       //активная мощность, Вт
      if (DEMO) P=P*(0.8 + 0.2*sin(0.5*(millis()-time1)/60000.0));
      float _Q = pow(S,2)-pow(P,2);
      if (_Q>0.0) Q = sqrt(_Q);  //реактивная мощность, вар
      else Q = 0.0;
      P1 = 0.0;
      V2 = 0.0;
      I2 = 0.0;
      count = 0;   
      t1 = millis(); 
  }   
  count++;
}

//Процедура отправки в сеть данных, которые хранятся в PROGMEM 
void printProgStr (EthernetClient client, const char * str){
char c;
  if (!str) return;
  while ((c = pgm_read_byte(str++))) client.print (c);
}

//Формируем JSON строку данных для отправки ее через сеть в браузер
String DataToBrowser() {
  int t = int((millis()-time1)/1000);
  String s = String(t)+", "+String(V,1)+", "+
  String(I,1)+", "+String(S/1000.0,2)+", "+
  String(P/1000.0,2);
  return s;
}

//Начальные установки и инициализации
void setup() {
  Serial.begin(9600);
  resetENC28J60();
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("START SERVER AT:");
  Serial.println(Ethernet.localIP());
}

//Главный цикл выполнения программы
void loop() {
  MesureData();
  EthernetClient client = server.available();
  if (client) {
    result="";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        result+=c;
        if (c == '\n') { 
          int y=result.indexOf("dat");
          if ((y>0) and (!Restart)) {
            printProgStr(client, page3);
            String s = DataToBrowser();
            client.println(s);
          } else {         
              printProgStr(client, page1);
              printProgStr(client, page2);
              Restart = false;
              time1 = millis();
          }                    
          break;
        }        
      }
    }
    delay(1);
    client.stop();
  }
}
Соедините Arduino Nano и ENC28J60 по этой схеме. Подключите Ethernet модуль в сеть. Загрузите программу в контроллер, в поисковой строке барузера наберите http://192.168.100.10/ и нажмите Enter.
ВНИМАНИЕ!. Ваш компьютер должен быть обязательно подключен к Интернету.
Если вы сделали все правильно, появится страничка с демонстрационными графиками. После этого можно подключить датчик тока - ACS712 30A GY-712, трансформатор и подобрать коэффициенты kI,kV для получения правильных данных.
Установите #define DEMO false когда будете измерять реальные данные.
ПОМИНИТЕ О ПРАВИЛАХ ТЕХНИКИ БЕЗОПАСНОСТИ, КОГДА БУДЕТЕ РАБОТАТЬ С ВЫСОКИМ НАПРЯЖЕНИЕМ.
ВЫСОКОЕ НАПРЯЖЕНИЕ ОПАСНО ДЛЯ ЖИЗНИ!
Для мощных электрических потребителей, в цепи которых токи превышают 30А мы (liccontrol.com) предлагаем универсальный токовый WEB-монитор TSD i105 на контроллере STM32 и микрокомпьютере Orange PI Zero с токовыми датчиками ACS722. Это устройство подключается к электрической сети через стандартные трансформаторы тока и обеспечивает паралельный мониторинг 7 токовых линий и напряжений по трем фазам в электрической сети любой мощности.
Измерение мгновенных значений тока и напряжения обеспечивает контроллер STM32. Это дает высокую частоту опроса (16кГц) с разрешением 12 бит. Микрокомпьютер Orange PI Zero обеспечивает WEB интерфейс и архивирование данных с последующим отображением их через WEB браузер.
Стоимость такого токового WEB-монитора 8800.0 грн без НДС, что значительно дешевле любых других устройств с аналогичными характеристиками.
WEB монитор параметров электрических сетей
WEB монитор параметров электрических сетей TSD i105.

 Измерительных токовых входов (5А, AC/DC) - 7 шт;
 Измерительных входов по напряжению (220В, AC) - 3 шт;
 Измерение токов, напряжения, мощности полной, активной и реактивной с частотой 16 кГц;
 Вывод результатов измерения через WEB-интерфейс и архивирование на SD карте памяти;