цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Мониторинг мощности и других энергетических параметров сетевых устройств с помощью ESP8266

Мониторинг мощности и других энергетических параметров сетевых устройств с помощью ESP8266

Автор: Mike(admin) от 17-06-2019, 05:15

Беспроводной ваттметр на основе ESP8266 своими руками


Микроконтроллерная платформа ESP8266 является отличным инструментом домашней автоматизации, и это можно продемонстрировать в сегодняшнем проекте. Это проект демонстрирует измерение энергетических параметров устройства, подключенного к розетке, и передачу данных с помощью Blynk с OTA.


Мониторинг мощности и других энергетических параметров сетевых устройств с помощью ESP8266

Устройство данного примера измеряет переменный ток любых подключенных к нему сетевых устройств. Основой проекта является плата Wemos D1 Mini Pro на базе ESP8266. Она измеряет напряжение смещения и текущее напряжение с помощью аналого-цифрового преобразователя ADS1015. Фактическое измерение тока выполняется датчиком тока 30 А / 1 В YHDC SCT013. Питание осуществляется с помощью блок питания 5В, 1А. Принципиальная схема подключения устройства выглядит следующим образом.


Мониторинг мощности и других энергетических параметров сетевых устройств с помощью ESP8266

Устройство работает следующим образом. Линия переменного тока первичной нагрузки проходит через датчик тока SCT013 к розетке. Когда устройство подключено к розетке переменного тока, SCT013 обнаруживает ток, протекающий через провод, который проходит через центр датчика. Он и обнаруживает вторичное напряжение, которое индуцируется от текущего тока. Он выдает линейное напряжение в диапазоне 0-1 В постоянного тока, 0 В = 0 А, 1 В = 30 А.


Допустим, у вас есть 1 В переменного тока. Напряжение на самом деле колеблется между 1 В и -1 В переменного тока. Не стоит работать с отрицательными числами, поэтому решаем это, подавая смещение напряжения на линию к SCT013. Используя делитель напряжения, мы снижаем напряжение 3,3 В примерно до 1,015 В постоянного тока и используем это для напряжения смещения. Это позволяет всем числам оставаться положительными. Так, например, если бы у вас было 30 ампер переменного тока, устройство вывело бы 0,015-2,015 вольт постоянного тока, потому что оно начинается с 1,015 вольт, и переменное напряжение для измерения переменного тока колеблется вокруг этого значения.


Для повышения точности фактическое напряжение смещения первоначально измеряется при включении питания ADS1015, поэтому он точно знает, сколько вольт нужно вычесть из выхода SCT013. При включении питания ничего не должно быть подключено к розеткам, чтобы получить точное измерение смещения. Он измеряет напряжение в течение 1/2 секунды (так как он должно улавливать около 30 циклов формы сигнала переменного тока) и записывает максимальное значение. Затем он вычитает напряжение смещения из этого значения, чтобы оставить нас с фактическим выходным напряжением SCT013. Затем мы рассчитываем ток путем умножения на 30 (потому что мы знаем 1 В = 30 А). Для расчета мощности в ваттах просто нужно еще использовать переменное напряжение сети, которое по умолчанию известно.


При этом используется метод пикового сигнала для измерения переменного тока, поэтому он не является истинным среднеквадратичным показанием тока. Но все равно мы получаем довольно точное значение с использованием этого метода.


Устройство отображает всю информацию в приложении Blynk. Оно показывает: ток, мощность в кВт-ч, совокупную мощность кВт-ч, Wifi RSSI, показания смещения, измеренные показания и настроенное значение. Пользовательские элементы управления задают напряжение переменного тока, сбрасывают напряжение смещения, сбрасывают накопленный кВтч и перезагружают микросхему. Устройство использует EEPROM для хранения текущих (накопленных) кВтч каждый час в случае потери питания. Здесь также используется возможность прошивки по воздуху (OTA), чтобы его можно было запрограммировать / обновить без необходимости открывать корпус и вручную подключать к USB.


Мониторинг мощности и других энергетических параметров сетевых устройств с помощью ESP8266

И помните, что с электричеством нужно работать осторожно. Если вы не знаете, как правильно работать и подключать цепи переменного тока, не пытайтесь это сделать.


Далее приведен код программы для ESP8266.



#include <Wire.h>
#include <BlynkSimpleEsp8266.h>

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <EEPROM.h>


uint16_t config3 = 0x0003  |
	0x0000  |
	0x0000  | 
	0x0000  |
	0x00A0  |
	0x0000  |
	0x0400  |
	0x4000  |
	0x8000;


uint16_t offsetConfig = 0x0003  |
	0x0000  |
	0x0000  |
	0x0000  |
	0x00A0  |
	0x0000  |
	0x0400  |
	0x7000  |
	0x8000;


char auth[] = "auth token";
char ssid[] = "wifi network";
char pass[] = "wifi password";


int i2caddress = 0x48;

int converDelay = 250;


///////////////////


byte appConnected;

int reading0;
int maxValue1 = 0;
int adjusted = 0;
int userVoltage = 120;
int kwhCount = 0;

float volt1;
float current1;
float offset;
float watts;
float currentKwh;
float hourKwhAccrue = 0.0;
float kwhHourTotal = 0.0;
float runKwhTotal = 0.0;

unsigned long timer1 = 0;
unsigned long timer2 = 0;
unsigned long timer3 = 0;
unsigned long timer4 = 0;
unsigned long timer5 = 0;
unsigned long timer6 = 0;



void setup()
{
	EEPROM.begin(512);

	Wire.begin(D4, D5);
	Wire.setClock(400000);

	Blynk.begin(auth, ssid, pass);

	wifi_station_set_hostname("ESP-AC Mon");
	ArduinoOTA.setHostname("AC Monitor");
	ArduinoOTA.begin();

	getOffset();

	EEPROM.get(0, runKwhTotal);
	Blynk.virtualWrite(V6, runKwhTotal);

	write_register_ADC(i2caddress, config3);
} // setup



void loop()
{
	Blynk.run();
	ArduinoOTA.handle();


	if (millis() - timer2 > 500 && appConnected)
	{
		pullCurrent();
		getKwh();
	}

	else if (millis() - timer2 > 10000)
	{
		pullCurrent();
		getKwh();
	}


	if (millis() - timer4 > 15000)
	{
		maint();
		timer4 = millis();
	}

	if (millis() - timer6 > 86400000)
	{
		EEPROM.put(0, runKwhTotal);
		EEPROM.commit();
		timer6 = millis();
	}
} // loop

///////////////////////////////////////

void pullCurrent()
{
	maxValue1 = 0;
	timer1 = millis();

	while (millis() - timer1 < 500)
	{
		reading0 = ( read_ADC(i2caddress, 0x00) >> 4 );
		delayMicroseconds(converDelay);

		if (reading0 > maxValue1)
		{
			maxValue1 = reading0;
		}
	}

	adjusted = maxValue1 - offset;

	volt1 = ((float)adjusted / 2048) * 2.048;

	current1 = volt1 * 30;
	// current2 = volt2 * 30;

	Blynk.virtualWrite(V0, current1);
	Blynk.virtualWrite(V30, maxValue1);
	Blynk.virtualWrite(V32, adjusted);


	timer2 = millis();
} // pullCurrent


/////////////////////////////////////////


void getOffset()
{
	write_register_ADC(i2caddress, offsetConfig);
	delay(10);

	offset = ( read_ADC(i2caddress, 0x00) >> 4 );

	Blynk.virtualWrite(V31, offset);
}


/////////////////////////////////////////



void getKwh()
{
	watts = current1 * userVoltage;
	currentKwh = watts / 1000;

	kwhCount++;
	hourKwhAccrue += currentKwh;
	kwhHourTotal = hourKwhAccrue / kwhCount;

	if (millis() - timer5 > 3600000)
	{
		runKwhTotal += kwhHourTotal;

		kwhCount = 0;
		kwhHourTotal = 0;
		hourKwhAccrue = 0;
		timer5 = millis();
		Blynk.virtualWrite(V6, runKwhTotal);
	}

	Blynk.virtualWrite(V5, kwhHourTotal);
} // getKwh

/////////////////////////////////////////


void maint()
{
	int myRssi = wifi_station_get_rssi();

	Blynk.virtualWrite(V10, myRssi);
}


/////////////////////////////////////////

void write_register_ADC(uint8_t address, uint16_t regis)
{
	Wire.beginTransmission(address);
	Wire.write(0x01);
	Wire.write((uint8_t)( regis >> 8 ));
	Wire.write((uint8_t)( regis & 0xFF ));
	Wire.endTransmission();
}

/////////////////////////////////////////


uint16_t read_ADC(uint8_t address, uint8_t reg1)
{
	Wire.beginTransmission(address);
	Wire.write(reg1);
	Wire.endTransmission();
	Wire.requestFrom(address, (uint8_t)2);
	return ( ( Wire.read() << 8 ) | Wire.read() );
}



/////////////////////////////////////////


BLYNK_CONNECTED()
{
  Blynk.syncAll();
}



BLYNK_APP_CONNECTED()
{
	appConnected = 1;
}

BLYNK_APP_DISCONNECTED()
{
	appConnected = 0;
}



BLYNK_WRITE(V20)
{
	byte restartChip = param.asInt();

	if (restartChip == 1)
	{
		ESP.restart();
	}
}


BLYNK_WRITE(V21)
{
	byte resetCounter = param.asInt();

	if (resetCounter)
	{
		runKwhTotal = 0.0;
		EEPROM.put(0, runKwhTotal);
		EEPROM.commit();
	}
}


BLYNK_WRITE(V22)
{
	byte resetOffset = param.asInt();

	if (resetOffset == 1)
	{
		getOffset();
	}
}


BLYNK_WRITE(V23)
{
	userVoltage = param.asInt();
}



© digitrode.ru


Теги: ESP8266, ваттметр



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий