Описываемое ниже устройство представляет собой измеритель потребляемой мощности для дома или квартиры.
Особенностью устройства является то, что считывание информации об энергопотреблении происходит через светодиод счетчика, путем простого подсчета длительности между миганием светодиода. Соответственно старые дисковые советские электросчетчики не подойдут для данного проекта.
Устройство работает следующим образом: контроллер Arduino считывает частоту миганий светодиода электросчетчика и передает данные через беспроводной модуль XBee. Модуль USB/Xbee, установленный на компьютере, принимает данные на ПК и передает их в LabView, позволяющей отображать и мониторить данные энергопотребления в реальном времени.
Контроллер Arduino пересылает данные о среднем энергопотреблении за последние 5 минут, а также данные энергопотребления в реальном времени.
Для детектирования мигания светодиода в схеме устройства применен фоторезистор. Он устанавливается на счетчик и прикрепляется к нему темным скотчем. Для чтения аналоговых данных от фоторезистора, применен простейший делитель напряжения.
При мигании светодиода счетчика, на фоторезисторе создается падение напряжения. Arduino считывает это значение через АЦП и сравнивает его с значением напряжения после потенциометра, который подключен к выводу A0.
Полученные данные обрабатываются в программе, а затем передаются к компьютеру через Xbee модуль.
Фрагмент кода для сбора данных с счетчика:
delay(10); //10ms val_pot = analogRead(POT); delay(10); //10ms val_sensore = analogRead(SENSORE); if((val_sensore > val_pot)&(flag_acquire == 0)){ flag_acquire = 1; digitalWrite(LED, LOW);
В приведённом выше коде происходит сравнение двух напряжений, первое - снимаемое с делителя с фоторезистором, второе напряжение - с потенциометра. Если первое значение напряжения превышает значение напряжения с потенциометра, то устанавливается флаг "flag_acquire = 1". Затем происходит подсчет времени, которое прошло с последнего мигания светодиода.
Для этого, считывается значение внутреннего программного счетчика, которое возвращает количество миллисекунд, прошедшее с момента включения питания контроллера. Для этого, используется команда millis(), см. урок 3 (тайминг)
pre_tmS = cur_tmS; cur_tmS = millis(); if( cur_tmS > pre_tmS ) { tm_diffS = cur_tmS – pre_tmS; }
Здесь задействовано две переменных pre_tmS и cur_tmS, переменная "cur_tmS" необходима для чтения значения внутреннего счетчика: cur_tmS = millis (); Если условие cur_tmS> pre_tmS выполняется, то происходит замер времени между двумя циклами (вспышками светодиода на энергосчетчике), значение которого записывается в переменную "tm_diffS".
Далее, данные посылаются в ПК через модуль Xbee.
Serial.print("S"); Serial.println(tm_diffS); delay(10); //10ms
Arduino посылает флаг S, чтобы LabView понял, что передаваемые данные - это значения в реальном времени, а затем сами данные цикла в миллисекундах.
Теперь можно сбросить флаг, когда светодиод счетчика погас:
if((val_sensore < val_pot)&(flag_acquire == 1)){ flag_acquire = 0; digitalWrite(LED, HIGH); impulsi++; delay(10); //10ms }
Здесь мы проверяем установлен ли flag_acquire в 1, и если флаг установлен и напряжение на фоторезисторе упало ниже заданного, то сбрасываем флаг в ноль. Далее идет инкрементируем переменную impulsi, которая служит для подсчет среднего энергопотребления за последние 5 минут.
Данное значение в дальнейшем также передается в LabView с меткой "L".
Полный код программы:
#define POT 0 #define SENSORE 1 #define LED 13 #define LED1sec 12 #define TimeAcquire 1000 //1 сек. #define Time5Minuts 300 //5 минут = 300 секунд unsigned long cur_tm = millis(); unsigned long pre_tm = cur_tm; unsigned int tm_diff = 0; unsigned long cur_tmS = millis(); unsigned long pre_tmS = cur_tmS; unsigned int tm_diffS = 0; unsigned int time_flag=0; unsigned int impulsi=0; unsigned int val_pot=0; unsigned int val_sensore=0; char flag_acquire=0; char flag_time=0; void setup() { pinMode(LED, OUTPUT); pinMode(LED1sec, OUTPUT); Serial.begin(115200); // setup serial 115200 Serial.println("ENEL KW/h reader!"); } void loop() { //Acquisisco delay(10); //10ms val_pot = analogRead(POT); // read the input pin delay(10); //10ms val_sensore = analogRead(SENSORE); // read the input pin if((val_sensore > val_pot)&(flag_acquire == 0)){ flag_acquire = 1; digitalWrite(LED, LOW); pre_tmS = cur_tmS; cur_tmS = millis(); if( cur_tmS > pre_tmS ) { tm_diffS = cur_tmS - pre_tmS; } Serial.print("S"); Serial.println(tm_diffS); delay(10); //10ms } if((val_sensore < val_pot)&(flag_acquire == 1)){ flag_acquire = 0; digitalWrite(LED, HIGH); impulsi++; //Увеличиваем счетчик delay(10); //10ms } pre_tm = cur_tm; cur_tm = millis(); if( cur_tm > pre_tm ) { tm_diff += cur_tm - pre_tm; //+= } if( tm_diff >= TimeAcquire ) { tm_diff = 0; time_flag++; if(flag_time==0){ digitalWrite(LED1sec, HIGH); flag_time = 1; }else{ digitalWrite(LED1sec, LOW); flag_time = 0; } } if(time_flag>=Time5Minuts){ //Если прошло более 5 мин. то передаем данные Serial.print("L"); Serial.println(impulsi); impulsi = 0; time_flag = 0; } }
LabView
Для приема данных использовался модуль XBee UartSbee V3.1.
Интерфейс программы очень простой:
Как видно из скриншота выше, верхний график показывает энергопотребление за последние 5 минут, в то время как нижний график показывает энергопотребление в реальном времени.
Скачать скетч PDE, файл для LabView (vi) и файл схемы Eagle вы можете ниже
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
U$1 | Плата Arduino | Arduino Duemilanove | 1 | Поиск в магазине Отрон | ||
SV1 | Модуль XBee | 1 | Поиск в магазине Отрон | |||
LED1, LED2 | Светодиод | 2 | Поиск в магазине Отрон | |||
PH1 | Фоторезистор | B1060_23 | 1 | Поиск в магазине Отрон | ||
R1 | Резистор | 10 кОм | 1 | Поиск в магазине Отрон | ||
R2 | Подстроечный резистор | 100 кОм | 1 | Поиск в магазине Отрон | ||
R3, R4 | Резистор | 470 Ом | 2 | Поиск в магазине Отрон | ||
Скачать список элементов (PDF)
Прикрепленные файлы:
- PowerMeter.rar (112 Кб)
Комментарии (15) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
1. У разных электронных счетчиков разное соотношение импульсы/кВт/ч. Не совсем понял, как здесь это учитывается.
2. Насколько я понял, здесь программа в LabView может высчитывать потребление в реальном времени, путем измерения времени всего одного импульса. Как в данной программе получена зависимость энергии от времени одного импульса? Очень интересна формула взаимосвязи этих величин.
Для всех, кто хочет использовать ее в условиях суровой Российской действительности, приведу формулу:
P - мощность, Квт*ч,
t- время одного импульса, сек;
А - постоянная счетчика, (Имп/Квт*ч).
Таким образом в программу Labview необходимо внести коррективы, введя в строй дополнительный блок с постоянной счетчика(А). У итальянского счетчика А=1000, поэтому успешно сокращается.
В счетчике все наоборот - он генерирует импульсы в зависимости от потребления.
Но вообще подойдёт любой. Даже в самых дешёвых найдётся пара аналоговых входов и один-три дискретных выхода. Только с питанием придётся разобраться: у автора Arduino записан от 12V.