Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Мониторинг электроэнергии на LabView

Описываемое ниже устройство представляет собой измеритель потребляемой мощности для дома или квартиры.

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

Счётчик электрической энергии

Устройство работает следующим образом: контроллер 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.

Интерфейс программы очень простой:

LabView

Как видно из скриншота выше, верхний график показывает энергопотребление за последние 5 минут, в то время как нижний график показывает энергопотребление в реальном времени.

Скачать скетч PDE, файл для LabView (vi) и файл схемы Eagle вы можете ниже

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
U$1 Плата Arduino
Arduino Duemilanove
1 Поиск в магазине ОтронВ блокнот
SV1 Модуль XBee1 Поиск в магазине ОтронВ блокнот
LED1, LED2 Светодиод2 Поиск в магазине ОтронВ блокнот
PH1 ФоторезисторB1060_231 Поиск в магазине ОтронВ блокнот
R1 Резистор
10 кОм
1 Поиск в магазине ОтронВ блокнот
R2 Подстроечный резистор100 кОм1 Поиск в магазине ОтронВ блокнот
R3, R4 Резистор
470 Ом
2 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Прикрепленные файлы:

Теги:

Колтыков А.В. Опубликована: 2011 г. 0 2
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 4.8 Проголосовало: 1 чел.

Комментарии (15) | Я собрал (0) | Подписаться

0
Neit #
Возникает пару вопросов:
1. У разных электронных счетчиков разное соотношение импульсы/кВт/ч. Не совсем понял, как здесь это учитывается.
2. Насколько я понял, здесь программа в LabView может высчитывать потребление в реальном времени, путем измерения времени всего одного импульса. Как в данной программе получена зависимость энергии от времени одного импульса? Очень интересна формула взаимосвязи этих величин.
Ответить
0
Neit #
В общем спросил у автора данной статьи и он ответил, что программа применима только для итальянских счетчиков.
Для всех, кто хочет использовать ее в условиях суровой Российской действительности, приведу формулу:
P=3600/(t*A)
Здесь:
P - мощность, Квт*ч,
t- время одного импульса, сек;
А - постоянная счетчика, (Имп/Квт*ч).
Таким образом в программу Labview необходимо внести коррективы, введя в строй дополнительный блок с постоянной счетчика(А). У итальянского счетчика А=1000, поэтому успешно сокращается.
Ответить
0
Макс #
Не подскажите как посчитать время одного импульса, сек?
Ответить
0
ShaamN #
А для чего сравнивать полученный импульс на АЦП с напряжением на потенциометре (вход А0)?
Ответить
0
Neit #
Это позволяет настроить чувствительность фоторезистора к световым импульсам. Очень полезно, так как светодиоды на разных счетчиках светят с разной яркостью.
Ответить
0
Андрей Ковтун #
Очень заинтересовал подход к подсчету электроэнергии. Я так понял, в данной схеме и коде программы происходит симуляция работы счетчика?
Ответить
0
Neit #
Не совсем. Скорее программа адаптирована под импульсный выход счетчика, который производитель специально сделал в нем для его поверки. Программа лишь измеряет время импульсов и далее проводит расчет по формулам.
В счетчике все наоборот - он генерирует импульсы в зависимости от потребления.
Ответить
+1
Art101 #
Конечно со светодиодом - это забавно, но на сколько я знаю, сейчас у всех электронных счетчиков есть импульсный выход (PIK). Не проще задействовать его?
Ответить
0
An #
Обычно он под пломбой.
Ответить
0
Гордей #
А какой именно можно для этого использовать контроллер Arduino?
Ответить
0
StrannikM #
На схеме написано "Arduino Duemilanove".
Но вообще подойдёт любой. Даже в самых дешёвых найдётся пара аналоговых входов и один-три дискретных выхода. Только с питанием придётся разобраться: у автора Arduino записан от 12V.
Ответить
0
Никита #
Получается один модуль Xbee с Arduino передаёт информацию на второй модуль USB/Xbee, установленный на компьютер?
Ответить
0
StrannikM #
Пара модулей Xbee — это способ передать данные в комп. Вероятно, автору он показался наиболее удобным. А вообще, можно хоть по проводу через RS-232.
Ответить
0
StrannikM #
Вообще, идея интересная. Хотя, в современных условиях, я бы реализовал её на ESP8266. Самый дешёвый ESP-01 уже стоит дешевле самого душёвого Arduino. Зато не надо держать постоянно включенным комп. ESP сам всё посчитает и соберёт статистику. Останется только с любого смартфона или компа открыть вэб страничку.
Ответить
0
вадим #
Идея очень хорошая, если сделали - поделитесь, пожалуйста! У меня есть полный доступ к счетчику, можно с импульсного входа брать данные.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
Тестер ESR, полупроводников, резисторов, индуктивностей Мультиметр DT9205A
вверх