POWER MONITOR на Arduino

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

BATONS
Сообщения: 107
Зарегистрирован: Сб июн 30, 2012 7:54 am
Благодарил (а): 0
Поблагодарили: 14 раз

POWER MONITOR на Arduino

Сообщение BATONS » Вс июл 08, 2012 9:06 am

В этой ветке хочу поделится своим проектом по замеру напряжения и тока в домашней электросети на базе платформы Arduino.
начало "поползновений" в этой ветке: http://smartliving.ru/forum/viewtopic.php?f=4&t=63
В Москве платки arduino дороговаты. поэтому все заказывал в китайских магазинах.

Плата Arduino
http://www.aliexpress.com/product-fm/35 ... alers.html

Если будете брать, что-то другое, то берите на ATmega328, иначе памяти для кода может не хватить.

Интернет шилд

http://www.aliexpress.com/product-fm/50 ... alers.html

Чтобы было удобно подключать датчики купил Arduino Prototype Shield

http://www.dealextreme.com/p/arduino-pr ... 040?item=6

Датчик напряжения:
Использовал миниатюрный трансформатор. попался мне 220/18.
Схема подключения:
Изображение
Вывод цепляю к 0 контакту ардуино (цифровой)

Датчик тока
покупал его тут:
http://www.seeedstudio.com/depot/noninv ... th=144_154

схема подключения:
Изображение

Вывод цепляю к 1 контакту ардуино (цифровой)
На схеме конденсатор 10 мкф - я ставил полярный (+ верхний в схеме).

LCD дисплей для отображения параметров

http://www.aliexpress.com/product-fm/47 ... alers.html

схему подключения дисплея к ардуино выложу чуть позже.

Вот вроде и все.
К стати, купил себе недавно всем известные DS18B20 - в Москве они у нас стоят от 80 руб за штучку. в китае - за 10 штук просят 6 баксов включая уже доставку
http://www.aliexpress.com/product-fm/41 ... alers.html
Последний раз редактировалось BATONS Вс июл 08, 2012 9:50 am, всего редактировалось 2 раза.
За это сообщение автора BATONS поблагодарили (всего 7):
VolKu (Чт авг 28, 2014 7:49 am) • annton (Вс окт 12, 2014 9:20 pm) • Bagir (Чт янв 15, 2015 9:52 pm) • foxvlad (Вс янв 25, 2015 2:21 am) • Alex (Пн июн 29, 2015 6:39 am) • Serega66 (Сб фев 25, 2017 4:00 pm) • vitosmaxim80sad145 (Вт апр 28, 2020 10:29 pm)
Рейтинг: 8.14%
BATONS
Сообщения: 107
Зарегистрирован: Сб июн 30, 2012 7:54 am
Благодарил (а): 0
Поблагодарили: 14 раз

Re: POWER MONITOR на Arduino

Сообщение BATONS » Вс июл 08, 2012 9:10 am

Код для Arduino

/*
Код мониторинга электропотребления и трансляции
данных на сервер majordomo
настроены коэфф под эту прошиву 5 июля 2012г

Схема подключения:
* LCD RS пин к цифр. выходу 12
* LCD Enable пин к цифр. выходу 11
* LCD R/W к Общему
* LCD VO пин (пин 3) к ШИМ-выходу 9
* LCD D4 пин к цифр. выходу 5
* LCD D5 пин к цифр. выходу 4
* LCD D6 пин к цифр. выходу 3
* LCD D7 пин к цифр. выходу 2
*/
#include <Ethernet.h>
#include <SPI.h>


byte mac[] = { 0x00, 0x2A, 0xF6, 0x12, 0x69, 0xDU }; // MAC-адрес устройства
byte ip[] = { 192, 168, 8, 10 }; // ip-адрес устройства
byte server[] = { 192, 168, 8, 3 }; // IP компьютера на котором установлен сервер majordomo
byte gateway[] = { 192, 168, 8, 1 };
byte subnet[] = { 255, 255, 255, 0 };
char buf[80];
Client rclient(server, 80); // 80-порт

// Функция отправки HTTP-запроса на сервер
void sendHTTPRequest()
{
//Serial.println(buf);
if (rclient.connect())
{
//Serial.println("OK");
rclient.println(buf);
rclient.println("Host: 192.168.8.3"); // IP компьютера на котором установлен сервер majordomo
rclient.println();
delay(2000);
rclient.stop();
}

}

int numberOfSamples = 3000;

//Установка датчиков тока и напряжения
int inPinV = 0;
int inPinI = 1;

//*************************************************************************


// Коэффициенты для калибровки выводимых значений
// Подбираются опытным путем сверяясь с эталонным прибором
double VCAL = 27.00; // для напряжения
double ICAL = 2.21; // для тока
double PHASECAL = 2.3; // для мощности

//*************************************************************************

double V_RATIO = 50.5 / 1024 * VCAL;
double I_RATIO = (long double) 15.15 * 5 / 1024 * ICAL;

//Образцы переменных
int lastSampleV,lastSampleI,sampleV,sampleI;

//Переменные для фильтров
double lastFilteredV, lastFilteredI, filteredV, filteredI;
double filterTemp;

//Сюда сохраняем калибровочное значение фазы мгновенного напряжения
double shiftedV;

//Расчет переменной для мощности
double sqI,sqV,instP,sumI,sumV,sumP;

//Полезные значения переменных
double realPower,
apparentPower,
apparentPower1,
powerFactor,
Vrms,
Irms;


// подключаем библиотеку дисплея:
#include <LiquidCrystal.h>

// инициализация библиотеки с перечнем задействованных выводов
LiquidCrystal lcd (8, 7, 6, 5, 3, 2);

void setup ()
{
Ethernet.begin(mac, ip, gateway, subnet); // Инициализируем Ethernet Shield

// устанавливаем ШИМ выход (регулируем контрастность дисплея):
pinMode (9, OUTPUT);
analogWrite (9, 70);
// устанавливаем кол-во столбцов и строк:
lcd.begin (16, 4);
lcd.print(" POWER MONITOR");
}
void loop ()
{

//Serial.println(temp);
for (int n=0; n<numberOfSamples; n++) // цикл крутится 3000 раз
{

//Используется для удаления смещения 2,5в
lastSampleV=sampleV;
lastSampleI=sampleI;

//Читаем с пинов текущее значение U и I
sampleV = analogRead(inPinV);
sampleI = analogRead(inPinI);

// Используется для удаления смещения 2,5в
lastFilteredV = filteredV;
lastFilteredI = filteredI;

//Цифровой фильтр для удаления постоянного смещения 2,5 в

filteredV = 0.996*(lastFilteredV+sampleV-lastSampleV);
filteredI = 0.996*(lastFilteredI+sampleI-lastSampleI);

//Тут калибруем фазу
shiftedV = lastFilteredV + PHASECAL * (filteredV - lastFilteredV);

//Среднеквадратический метод расчета напряжения
//1) square voltage values
sqV= filteredV * filteredV;
//2) Суммируем
sumV += sqV;

// Среднеквадратический метод расчета тока
//1) square current values
sqI = filteredI * filteredI;
//2) Суммируем
sumI += sqI;

//Мгновенная мощность
instP = shiftedV * filteredI;
//Суммируем
sumP +=instP;
}

//Расчет корня из среднего напряжения и тока (rms)
Vrms = V_RATIO*sqrt(sumV / numberOfSamples);
Irms = I_RATIO*sqrt(sumI / numberOfSamples);

//Расчет величины мощности
//realPower = V_RATIO*I_RATIO*sumP / numberOfSamples;
apparentPower = (Vrms * Irms)/1000; // значение в Киловатах
apparentPower1 = (Vrms * Irms); // значение в Ваттах
powerFactor = realPower / apparentPower;


//Сброс накопленных значений
sumV = 0;
sumI = 0;
sumP = 0;



// устанавливаем курсор в 0-ом столбце, 1 строка (начинается с 0):
lcd.setCursor (0, 1);
lcd.print ("U=");
lcd.setCursor (2, 1);
lcd.print (Vrms);
lcd.setCursor (9, 1);
lcd.print ("I=");
lcd.setCursor (11, 1);
lcd.print (Irms);
//lcd.print(sampleI);
lcd.setCursor (0, 2);
lcd.print ("P=");
lcd.setCursor (2, 2);
lcd.print(apparentPower);
lcd.setCursor (6, 2);
lcd.print ("kW");
delay(333);


// отправляем значения на сервер majordomo

//значение напряжения
sprintf(buf, "GET /objects/?object=sensorVolt&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (int)Vrms, abs(Vrms));
//sprintf(buf, "GET /objects/?object=sensorVolt&op=m&m=eleChanged&t=%d HTTP/1.0", Vrms);
sendHTTPRequest();

//значение тока
sprintf(buf, "GET /objects/?object=sensorAmper&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (int)Irms, abs(Irms));
sendHTTPRequest();

//значение мощности
sprintf(buf, "GET /objects/?object=sensorVatt&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (int)apparentPower1, abs(apparentPower1));
sendHTTPRequest();
//delay(3000);
}
Последний раз редактировалось BATONS Вс июл 08, 2012 9:41 am, всего редактировалось 1 раз.
За это сообщение автора BATONS поблагодарил:
Serega66 (Пт май 04, 2018 8:12 am)
Рейтинг: 1.16%
BATONS
Сообщения: 107
Зарегистрирован: Сб июн 30, 2012 7:54 am
Благодарил (а): 0
Поблагодарили: 14 раз

Re: POWER MONITOR на Arduino

Сообщение BATONS » Вс июл 08, 2012 9:13 am

Настройки на сервере:

Изображение

код метода:

//$params['t']
$old_electric=$this->getProperty('electric');
$t=round($params['t'],1);
$this->setProperty('electric',$t);
if ($t>$old_electric) {
$d=1;
} elseif ($t<$old_electric) {
$d=-1;
} else {
$d=0;
}

$this->setProperty('direction',$d);
$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("H:i",time()));
BATONS
Сообщения: 107
Зарегистрирован: Сб июн 30, 2012 7:54 am
Благодарил (а): 0
Поблагодарили: 14 раз

Re: POWER MONITOR на Arduino

Сообщение BATONS » Вс июл 08, 2012 9:19 am

у участника Alex в его ветке по APC HS 500 слизал код,
вот так у меня выводятся значения:

Изображение

код:

<font size="4" color="red" face="Arial">POWER MONITOR</font><font size="3" color="gray" face="Arial">
<br>
Напряжение: <font color="cyan">%sensorVolt.Electric%</font>
Вольт
<br>
Ток: <font color="cyan">%sensorAmper.Electric%</font>
Ампер
<br>
Мощность: <font color="cyan">%sensorVatt.electric%</font>
Ватт
<br>

Последнее обновление: <font color="cyan">%sensorVatt.updatedTime%</font>
<br>



а так, на экранчике LCD

Изображение
За это сообщение автора BATONS поблагодарил:
Serega66 (Пт май 04, 2018 8:13 am)
Рейтинг: 1.16%
BATONS
Сообщения: 107
Зарегистрирован: Сб июн 30, 2012 7:54 am
Благодарил (а): 0
Поблагодарили: 14 раз

Re: POWER MONITOR на Arduino

Сообщение BATONS » Вс июл 08, 2012 9:40 am

Калибровка

Когда все собрали, подключаете вольтметр к розетке и подбираем опытным путем значение double VCAL = 27.00
Потом подключаем амперметр и подбираем double ICAL = 2.21
double PHASECAL = 2.3 - оставляем как есть

//*************************************************************************


// Коэффициенты для калибровки выводимых значений
// Подбираются опытным путем сверяясь с эталонным прибором
double VCAL = 27.00; // для напряжения
double ICAL = 2.21; // для тока
double PHASECAL = 2.3; // для мощности

//*************************************************************************

Вечером сфотографирую потрошки и внешний вид коробочки, где все это живет и выложу тут.
Если будут вопросы, то с удовольствием отвечу.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: POWER MONITOR на Arduino

Сообщение sergejey » Пн июл 09, 2012 10:07 am

проект супер! обязательно перенесу в раздел сценариев на сайте.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: POWER MONITOR на Arduino

Сообщение Alex » Пн июл 09, 2012 10:59 am

Очень интересная и полезная информация. Ждём подробностей по другим составляющим вашей домашней автоматизации.

Например, о твёрдотельных реле. На фото видно 2 радиатора и какая-то закрытая коробочка. Фото только с одной стороны и без какого-либо знакомого предмета, например коробка спичек, чтобы представить масштаб. Побольше фото и побольше подробностей.
BATONS
Сообщения: 107
Зарегистрирован: Сб июн 30, 2012 7:54 am
Благодарил (а): 0
Поблагодарили: 14 раз

Re: POWER MONITOR на Arduino

Сообщение BATONS » Пн июл 09, 2012 7:23 pm

Alex
Опишу Все обязательно, только в другой теме.
Эта система у меня работает, теперь ее нужно "соединить" с сервером "умный дом".
Сейчас разгребу накопившиеся дела и в отдельной ветке выложу свои наработки
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: POWER MONITOR на Arduino

Сообщение Alex » Сб июл 14, 2012 5:05 pm

Что-то я запутался. С одной стороны
Вывод цепляю к 0 контакту ардуино (цифровой)
С другой стороны
//Установка датчиков тока и напряжения
int inPinV = 0;
//Читаем с пинов текущее значение U
sampleV = analogRead(inPinV);
Может быть речь всё таки идёт об ANALOG IN A0, а не о «цифровом контакте 0»?

Второй вопрос. У меня трансформатор на 9 вольт. Как лучше - оставить R1=10K и R2=100K или поставить другие номиналы?
BATONS
Сообщения: 107
Зарегистрирован: Сб июн 30, 2012 7:54 am
Благодарил (а): 0
Поблагодарили: 14 раз

Re: POWER MONITOR на Arduino

Сообщение BATONS » Пн июл 16, 2012 8:04 am

нет, у меня подключено именно к цифровому входу 0
вечером проверю и отпишусь тут.

Трансформатор можно и такой. резисторы используйте как у меня в схеме.
единственное различие будет - это в коэффициентах.
их Вам нужно будет подобрать опытным путем, используя вольтметр.
муторное дело это конечно.... Изменяешь коэффициент, заливаешь прошивку в ардуино....смотрю полученные результаты и сравниваю их с показаниями вольтметра.... и так по кругу, пока данные не будут соответствовать. (погрешность у меня +/- 1 вольт).
За это сообщение автора BATONS поблагодарил:
lanket (Пт мар 11, 2016 9:07 am)
Рейтинг: 1.16%
Ответить