Сегодня мы построим систему, которая позволит измерять текущую потребляемую электрическую мощность в доме/квартире.
Особенностью этой системы будет то, что для измерения не потребуется никакого вмешательства в силовую электрическую сеть (неинвазивный метод).
Более того, сделаем эту систему беспроводной (необязательно, но очень просто и полезно).
Использовать будем вот такой датчик:
Этот датчик просто одевается на силовой провод (обязательно на один провод!) и имеет токовый выход, уровень сигнала с которого прямо пропорционален протекующему через силовой провод току. Датчик позволяет измерить ток до 100А.
Как и в предыдущей статье, мы будем использвать комплектующие серии Grove. Нам понадобится:
Особенностью этой системы будет то, что для измерения не потребуется никакого вмешательства в силовую электрическую сеть (неинвазивный метод).
Более того, сделаем эту систему беспроводной (необязательно, но очень просто и полезно).
Использовать будем вот такой датчик:
Этот датчик просто одевается на силовой провод (обязательно на один провод!) и имеет токовый выход, уровень сигнала с которого прямо пропорционален протекующему через силовой провод току. Датчик позволяет измерить ток до 100А.
Как и в предыдущей статье, мы будем использвать комплектующие серии Grove. Нам понадобится:
- Ардуино (или любой клон) с 168 или 328 "камушком" - 1 шт.
- Grove Base Shield - 1 шт.
- Дисплей OLED (серии Grove) - 1 шт.
- Модуль кнопки (серии Grove) - 1 шт.
- Датчик переменного тока 100А - 1 шт.
- Протоплата (серии Grove) - 1 шт.
- 3 резистора (33 Ом - 1 шт., 10 кОм - 2 шт.)
- 1 конденсатор (10 мкФ х 16В)
- Разъем jack 3.5мм - 1 шт.
- 4-х контактный кабель (серии Grove) - 4 шт.
- Крепление для ардуино - 1 шт. (необязательно, но очень удобно)
На этом можно ограничиться. Но если захочется сделать беспроводную передачу данных, дополнительно потребуется:
- Ардуино нано (или любой клон) с 168 или 328 "камушком" - 1шт.
- RF-кит (приемник и передатчик) на частоту 433МГц (серии Grove) - 1 шт.
- Беспаечная макетная плата - 1 шт.
- Перемычки и кабель для подключения RF-приемника.
Аппаратная конфигурация
Сначала необходимо разобраться с подключением датчика тока. Выход датчика является токовым и напрямую подключить его к ардуине нельзя.
Подключение такого датчика (и многих подобных) можно осуществить по схеме:
В схеме нет ничего сложного. Номиналы резисторов - 33 Ом (тот, что параллельно датчику тока - самый левый на схеме) и 10 кОм (одинаковые - образуют делитель напряжения). Почему выбрана именно такая схема и обоснование номиналов можно прочитать в первоисточнике.
Чтобы нам было удобно - разместим все элементы на модуле протоплаты. Сначала удобнее распаять разъем для подключения датчика, а затем произвести монтаж остальных навесных элементов. Получается вот такая конструкция:
У нас в хозяйстве не нашлось резистора в 33 Ом, но нашлись резисторы по 100 Ом - воспользовались законом Ома (поставили три резистора в параллель и получили необходимое сопротивление).
После этого несложного подготовительного этапа можно приступать к сборке нашего "прибора".
Подключаем в следующем порядке:
- Выход датчика тока - на вход A0
- Модуль кнопки - D5
- RF-передатчик - D2
- OLED-дисплей - к шине IIC (SDA - A4, SCL - A5).
"Прибор" в сборе (на фото хорошо видно расположение разъемов, к которым производится подключение):
Программная часть
Основная составляющая кода - библиотеки для работы соответствующих устройств (OLED-дисплей, библиотека VirtualWire для беспроводного модуля), основу же для работы датчика тока мы возьмем из проекта OpenEnergyMonitor (библиотека EmonLib).
В функции setup() мы производим инициализацию всех подключенных элементов (дисплей, датчик, RF-передатчик) и в три шага проводим калибровку нашего прибора:
- С помощью дисплея просим пользователя подключить датчик (пока датчик на кабель не одеваем) и после этого - нажать на кнопку
- Прибор производит измерение "нулевых" значений (которые на самом деле - ненулевые), высчитывает среднее значение и запоминает его как поправочное значение (переменная delta)
- Предлагаем пользователю подключить датчик на провод и подтвердить свое действие нажатием на кнопку.
Датчик лучше подключить после стабилизатора питания |
Таким образом, в функции 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 и открыть монитор порта, чтобы убедиться, что данные успешно принимаются:
На этом мы закончим с нашей системой мониторинга потребления электричества.
Примечание: большая часть из приведенного списка комплектующих, что мы использовали сегодня, входят в следующие наборы:
- Grove "стартовый набор" (или расширенная версия "стартовый набор плюс")
- Набор перемычек
- Набор электронных компонентов 20в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))'
Прорвете, есть ли в /libraries библиотека SPI и digitalWriteFast
ОтветитьУдалитьЗдравствуйте. Собрал схему все работает. Только, как можно получить график изменения нагрузки используя такой трансформатор тока? Работаю через АЦП zetlab-210.
ОтветитьУдалитьЯ хочу подключить несколько датчиков тока ко входам A0 - A5
ОтветитьУдалитьКак изменится схема?
Могу ли я использовать один общий делитель напряжения?