понедельник, 18 февраля 2013 г.

Система мониторинга потребления электричества

Сегодня мы построим систему, которая позволит измерять текущую потребляемую электрическую мощность в доме/квартире.

Особенностью этой системы будет то, что для измерения не потребуется никакого вмешательства в силовую электрическую сеть (неинвазивный метод).
Более того, сделаем эту систему беспроводной (необязательно, но очень просто и полезно).

Использовать будем вот такой датчик:

Этот датчик просто одевается на силовой провод (обязательно на один провод!) и имеет токовый выход, уровень сигнала с которого прямо пропорционален протекующему через силовой провод току. Датчик позволяет измерить ток до 100А.

Как и в предыдущей статье, мы будем использвать комплектующие серии Grove. Нам понадобится:

На этом можно ограничиться. Но если захочется сделать беспроводную передачу данных, дополнительно потребуется:

Аппаратная конфигурация


Сначала необходимо разобраться с подключением датчика тока. Выход датчика является токовым и напрямую подключить его к ардуине нельзя.
Подключение такого датчика (и многих подобных) можно осуществить по схеме:
В схеме нет ничего сложного. Номиналы резисторов - 33 Ом (тот, что параллельно датчику тока - самый левый на схеме) и 10 кОм (одинаковые - образуют делитель напряжения). Почему выбрана именно такая схема и обоснование номиналов можно прочитать в первоисточнике.

Чтобы нам было удобно - разместим все элементы на модуле протоплаты. Сначала удобнее распаять разъем для подключения датчика, а затем произвести монтаж остальных навесных элементов. Получается вот такая конструкция:
У нас в хозяйстве не нашлось резистора в 33 Ом, но нашлись резисторы по 100 Ом - воспользовались законом Ома (поставили три резистора в параллель и получили необходимое сопротивление). 

После этого несложного подготовительного этапа можно приступать к сборке нашего "прибора".
Подключаем в следующем порядке:
  • Выход датчика тока - на вход A0
  • Модуль кнопки - D5
  • RF-передатчик - D2
  • OLED-дисплей - к шине IIC (SDA - A4, SCL - A5).
"Прибор" в сборе (на фото хорошо видно расположение разъемов, к которым производится подключение):

Программная часть


Основная составляющая кода - библиотеки для работы соответствующих устройств (OLED-дисплей, библиотека VirtualWire для беспроводного модуля), основу же для работы датчика тока мы возьмем из проекта OpenEnergyMonitor (библиотека EmonLib). 

В функции setup() мы производим инициализацию всех подключенных элементов (дисплей, датчик, RF-передатчик)  и в три шага проводим калибровку нашего прибора:
  1. С помощью дисплея просим пользователя подключить датчик (пока датчик на кабель не одеваем) и после этого - нажать на кнопку
  2. Прибор производит измерение "нулевых" значений (которые на самом деле - ненулевые), высчитывает среднее значение и запоминает его как поправочное значение (переменная delta)
  3. Предлагаем пользователю подключить датчик на провод и подтвердить свое действие нажатием на кнопку.
Датчик лучше подключить после стабилизатора питания
Таким образом, в функции setup() у нас происходит первичная настройка прибора.

В основной функции (loop()) у нас в каждом цикле производится замер среднеквадратичного значения тока (переменная sIrms), вычисляется значение потребляемой мощности Pcur (по формуле Pcur = sIrms*220) и происходит формирование максимального и минимального значения потребления (переменные Pmax и Pmin, соответственно). 
Наиболее внимательные из вас могут сказать, что использование в формуле значения текущего напряжения (220) - не совсем хорошо, ведь напряжение может отличаться от "стандартного" и правильнее было бы его тоже измерять. Это правильное замечание, но мы будем считать, что напряжение соотвествует ГОСТ и его колебания находятся в пределах +5% и просто смиримся с тем, что погрешность нашего прибора будет примерно на этом же уровне. Так же для большей точности рекомендуем использовать этот прибор после стабилизатора напряжения.
В каждом цикле производится вывод этих параметров на дисплей. 

Дополнительно в каждом цикле происходит отправка значения потребляемой мощности через RF-передатчик.
Архив с полным кодом скетча (mon_pow_oled_rf) и всеми необходимыми библиотеками находится в файле, ссылка на который приведена в конце статьи.
Если вы сделали все правильно, то на дисплее (после процесса калибровки) отобразится примерно следующее:

Первый параметр - текущая потребляемая мощность (в кВт), далее следует среднеквадратичное значение тока (в А), последние два параметра - максимальное и минимальное значение потребляемой мощности.

Как видите, такой прибор просто сделать и результат его работы виден сразу.

Беспроводная передача данных


Наш прибор уже отлично функционирует, но для того, чтобы видеть значения потребляемой мощности, к нему необходимо подойти и посмотреть, что же отображается на дисплее. 
Но мы не зря сразу подключили к нашему устройству RF-передатчик. 

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

Для этого на беспаечной макетке разместим ардуино nano и к его пину D2 подключим выход с RF-приемника (не забываем о том, что к модулю приемника надо еще и питание подвести - общий и +5В):

Если у вас нет комплектующих, что мы используем в статье - можете использовать те аналоги, что есть под рукой (например вместо ардуино nano и беспаечной макетки можно использовать любую полноформатную ардуино и просто проводками сделать аналогичное подключение RF-приемника).

Теперь необходимо в ардуино nano залить скетч mon_reciver и открыть монитор порта, чтобы убедиться, что данные успешно принимаются:

На этом мы закончим с нашей системой мониторинга потребления электричества.

Примечание: большая часть из приведенного списка комплектующих, что мы использовали сегодня, входят в следующие наборы:
  1. Grove "стартовый набор" (или расширенная версия "стартовый набор плюс")
  2. Набор перемычек
  3. Набор электронных компонентов 20в1
Архив со скетчами и необходимыми библиотеками находится по ссылке.

4 комментария:

  1. Приветствую.
    Попробовал использовать шилд Energy Monitor Shield
    При компиляции вываливаются ошибки. Подскажите где поправить

    /home/roman/sketchbook/libraries/LCD5110_Graph_SPI/DefaultFonts.c:12:14: error: variable 'SmallFont' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
    /home/roman/sketchbook/libraries/LCD5110_Graph_SPI/DefaultFonts.c:117:14: error: variable 'MediumNumbers' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
    /home/roman/sketchbook/libraries/LCD5110_Graph_SPI/DefaultFonts.c:135:14: error: variable 'BigNumbers' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
    /home/roman/sketchbook/libraries/LCD5110_Graph_SPI/DefaultFonts.c:153:14: error: variable 'TinyFont' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

    ОтветитьУдалить
  2. Прорвете, есть ли в /libraries библиотека SPI и digitalWriteFast

    ОтветитьУдалить
  3. Здравствуйте. Собрал схему все работает. Только, как можно получить график изменения нагрузки используя такой трансформатор тока? Работаю через АЦП zetlab-210.

    ОтветитьУдалить
  4. Я хочу подключить несколько датчиков тока ко входам A0 - A5
    Как изменится схема?
    Могу ли я использовать один общий делитель напряжения?

    ОтветитьУдалить