Счетчик электричества на основе «Ардуино»

В этой статье собраны все данные про счетчик электричества на основе Ардуино, в том числе приведены схемы, прошивки, комментарии по поводу доработки текущей версии прошивки и конструкции.

IMG_1690

Вот так оно выглядит в конечном итоге.

Первоначально я разбил всю информацию по большой куче маленьких статей — что сделало очень неудобным поиск ее и повторение этого устройства вообще. Эта статья исправляет эту ситуацию.

Часть 1. Идея, проектирование и мысли вслух.

Некоторое время назад я установил двухзонный счетчик электроенергии, чтобы воспользоваться более выгодным ночным тарифом(50% с 2300 до 0800). Оказалось, что 45% электрики мы потребляем ночью. Но ответа как происходит потребление в разрезе мест потребления. конечно это устройство не дает.

Поэтому возникла потребность в более детализированном представлении данных про потребление. Первоначально решено сделать устройство показывающее следующие данные:

  1. Текущую мощность нагрузки
  2. Потребление с начала суток
  3. Потребление с начала месяца
  4. Процент ночного потребления в %

Также устройство должно передавать, на настраиваемый интернет-адрес, данные о потреблении за последние 24-ре часа, в виде 24-х отсчетов. Интервал передачи — устанавливается в минутах 1…120.

Задаваемые в меню параметры:

  1. Час в RTC
  2. Минуту вRTC
  3. День в RTC
  4. Месяц в RTC
  5. Год в RTC
  6. Интервал отсчета 1…120
  7. сетевой адрес c указанием позиционно символов: «a-z0-9_-/: «.Редактируемый символ должен быть выделен, чтобы было понятно что именно редактируется.

Первоначальный вариант устройства будет сделан на основе следующего набора модулей:

  1. индикатор 1602 (вот тут уточнение по поводу подключения индикатора к мега 2560)
  2. Ардуино Мега
  3. Модуль сетевого интерфейса на ENC28J60
  4. неразъемный трансформатор тока
  5. Часы реального времени RTC c модулем памяти
  6. Аналоговая клавиатура для управления настройками

schetchik-elektro-energii-arduino

Прибор интересует для уточнения сколько потребляет мастерская, медиа-приспособления, кухонные принадлежности. В итоге надо получить данные в виде графиков, в Интернете или на локальном сетевом сервере (синолоджи ds212)

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

Схему измерений мощности и напряжения я заимствовал вот здесь. Считается средняя мощность, и не только, много других параметров, например частота, поверфактор. Для начала надо собрать вот такой небольшой стенд, для измерения.

pmon

 

Беру макетную плату, ищу подходящий трансформатор, для замера напряжения (беру от дежурки АТХ), и вперед.

UPD. Измерительный узел

Берем макетную плату. Измерительный трансформатор использован — вот такой, неразъемный. То есть придется провод в него вовнутрь провести.

Спаял измерительный узел по указанной выше схеме. С трансформатором для измерения напряжения сети — было весело. Попробовал от АТХ использовать, в итоге пару раз выбило свет. Так и не удалось, взял от блока питания, какого-то устройства. На выходе там было 9В, поэтому немного оно от оригинальных параметров отличается, но это не беда, можно будет подправить коэффициентами в самой программе.

schetchik-elektrichestva-arduino

Ок, следующий шаг — сборка макета на столе. И проверка работоспособности.

Часть 2. Макетирование

Собрал макет электросчетчика. Это устройство, уже будет работать с Интернетом через сетевой модуль для Ардуины. Индикатор — стандартный 1602, по сути служит для конфигурирования сетевого адресса, часов, параметров устройства.

Пока не включал часть с 220в, хотя по сути ничего смертельно тут нет. ведь все разделено гальванически.

schetchik-maket-001Использованы также и часы, это будет первое устройство имеющее внутри задействованное RTC.

Клавиатура включена несколько иначе, резистор 5,6кОм между «+» и питанием. Выводы питания и 0в — поменяны местами. Вывод А1 и 2 — соединены. И все повешано на «прерывание». Как показывает практика так оно отлично работает. В программе есть пару тестовых модулей, в начале loop() — для отладки этого момента, думаю там все понятно без комментариев.

Сетевой модуль включен по схеме отсюда. Вот она:

WebRadio_schematic

 

Продолжение следует. По сути уже все работает. Кстати, довольно интересно, что отладка этого устройства заняло меньше пары часов. И то, с учетом того, что я копался с ШИМ выводов меги 2560.

Начальные тексты ПО — emonitor_002

Часть 2.1 Заметки про удивительные особенности ENC28J60

 

Удивительная вещь. Начал сегодня копать модуль работы с езернетом, для проекта «счетчик». Кто бы сомневался, было весело, и все в итоге заработало.

По подключению. Смотрим где находить SPI интерфейс с Ардуино «Мега», ну или вашей. Подключаем. Вывод CS (выбор чипа) вешаем куда нам угодно, он потом задается отдельно в инициализации библиотеки. Я «повешал» его на 42-й вывод, у вас может быть какой-то другой. Остальные MOSI/MISO/SS/OV/3.3V подключаются к соответствующим выводам Ардуины.

Оказалось, что для уменьшения использования памяти разработчик «замечательной» библиотеки EtherCard решил, и отправил некоторые строки для GET запроса в память программы. То есть, представьте, некий программист-фрилансер решил вдруг сделать себе счетчик. Чтобы все было умно он решил сделать  там редактирование строки-URL, куда отправляются данные. И даже это сделал сегодня:

И вот, он подключает библиотеку, и думает что сейчас легко сделает запрос к внешнему серверу. Ан нет. Ведь сервер он задал в виде строки. А строка, к сожалению, это не память программы. Гарвардская архитектура. Все разделено.

Ничего, быстро слазил в библиотеку, нашел место где заполняется запрос, исковырял его, забрал все «лишнее» на мой взгляд, конечно. В итоге отлично все работает.

Прилагаю библиотеку и пример работы с сервером, который работает для строк. а не только для не изменяемых в программе значений. Вместе с примером — ethercard_corrected

По ходу проекта остается решить только проблему с измерительной частью, все остальное уже решено. Наиболее сложным в программе — было редактирование строки URL.

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

Часть 3. Начальная отладка программного обеспечения счетчика

Сегодня немного повозился с отладкой ПО счетчика. Дело в том, что ошибочно не установил понижающий резистор, на СТ-датчик и в итоге на вход проникало слишком большое напряжение, равно как и слишком много помех. Поправил, припаял 150 ом параллельно СТ-датчику, в общем вышло около 100 ом.

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

В итоге замер расхода ЕН на закипание чайника показал тоже самое что и на китайском ваттметре. Уже хорошо, но придется проверить и по основному счетчику, как-то.

elektro-schetchik-maket На дисплее не поместилась буква h после kW, но следует понимать что она там есть. Число показывает расход с начала текущего часа. В конце часа передается на сервер и сбрасывается в ноль. Потом, наверное сделаю чтобы сбрасывалось раз в сутки.

Дальше можно делать корпус. Поскольку более тонкий полистирол или капролон пока не появился у меня — буду делать аналогичный корпус, из 10мм полистирола.

ПО счетчика, в текущем виде — emonitor_003

Часть 4. Делаем первую часть корпуса

 

Продолжаю делать счетчик.

Сделал сегодня корпус, материал, такой же как и в прошлый раз — капролон 11 мм. Крепление правда на имбусных винтах М4, в прошлый раз было м3 везде. Это слабовато для корпуса.

korobka-dlja-arduino-chetchika

Для масштаба положил мышку «эйр» вовнутрь.

Остается сделать переднюю панель, закрепить модули, сделать выфрезеровки под USB и питание 12В. В случае с этим приборчиком, достаточно, наверное 0,7А будет, то есть можно применить нечто малогабаритное.

Часть 5  Делаем переднюю панель

 

 

Ок, продолжаю со счетчиком-показометром электроенергии. Вчера , кстати, у нас опять подняли цену на электрику. И таких поднятий будет еще несколько за следующие полтора года. Поэтому конструкция такого прибора-показометра стала более актуальной. Вот сегодня решил продолжить и приделал к корпусу переднюю панель.

Корпус электросчетчика, передняя панель

Корпус электросчетчика, передняя панель

Красота получилась. Теперь все это надо «испортить» — сделав отверстия под клавиатуру и индикатор 1602.

ПО отлажено, кстати, оказалось, что в ардуино мега 2560 отлично работает и сторожевой таймер, так что пропадания Интернета — не критичны. Первоначально при отсутствии подключения DHCP макет зависал. Но теперь все ок — 8-мь секунд и пере-запускается.

И наметилась одна проблема — к сожалению пока сложно обеспечить сохранение мгновенных показаний электросчетчика — так как EEPROM имеет ресурс только около 100 тыщ.записей. То есть если в течение часа он  включиться- выключиться, показания будут потеряны. С этим надо будет обязательно разбираться.

UPD. Пару фото, как оно делается, вначале разметка отверстий, потом на минисверлилке зацентрую кнопки и сделаю отверстия по углам окна индикатора

korpus-shetchika2--002 Сверлю Ф12-м сверлом. korpus-shetchika2--003 Фрезерую и получается вот такое:korpus-shetchika2--004Собираю на потайные винты, в этот раз

korpus-shetchika2--001

 

Сверху крышки еще не закручено ничего, но общий вид уже понятен.

Часть 6. Доделан макет счетчика
Ок, сегодня доделал макет электросчетчика на основе Ардуино. Купил  блок питания от какого-то прибора, вроде планшета. Но он вел себя очень странно, раз в пять секунд сбрасывался. Поэтому пришлось найти другой блок, уже от мобильного. Потребление было при 12В менее 0,2А, что совсем немного.

Вот так оно выглядит в финальном варианте

shetchik-maket-t2--001 Внутри упаковка не самая плотная, есть немного места.shetchik-maket-t2--002Езернет включается сбоку
shetchik-maket-t2--003 Монтаж можно сделать сняв нижнюю крышку. Прикручивать буду за заднюю стенку. shetchik-maket-t2--004Остается — установить и подключить провода.

 

 

Часть 7. Установка счетчика

Сегодня устанавливал счетчик. Как всегда крепление за дно, на пару дюбелей. Сразу понял что это неудобно, надо в дальнейшем клеммы для подключения делать верхними с фальш-колпаком. Самое сложное в установке — было провести на кухню Интернет, кабель около 15-ти метров. Слава богу половина «дороги» уже была сделана, то есть был канал. Это значительно упростило жизнь.

IMG_1690 Теперь надо сделать страничку с отображением статистики потребления. Ну это совсем несложная задача. Завтра и сделаю.

Сразу стало понятно что какая-то кухонная техника «кушает» в режиме сна около 20 Вт. Вывод простой — надо делать отключение всех приборов. И вероятно прямо с этого счетчика. Благо дело, он то у нас в Интернете.

Прошивка данного устройства вот она, пользуйтесь смотрите — emonitor_001. Впрочем она будет меняться, так как будет отладка, по результатам сбора данных.

Смета изготовления счетчика:

Всего 954-00 стоимость материалов и запчастей.

Часть 8. Отладка ПО

Ок, продолжаю со счетчиком. Сегодня вроде как окончил отладку прошивки счетчика электрики с выходом в интернет.

По сути. С++ ошибок не допускает. Три дня искал почему данные передаются то через час, то через раз, то вообще не передаются. Оказалось, что все просто. Первый раз программа допускала заполнение буфера путем добавления из другого.

strcat(buffh,buf);

А второй раз длины буфера явно не хватало и происходило зависание с последующей перезагрузкой. Не доходя до отправки http get-запроса.

А я уже начал было ругаться на ENC28J60. Хоть микросхема тут не виновата, совершенно. Вот такое:

buffh[0]=’\0′;

Помогло. А основная проблема в том, что Arduino тяжко перепрошить удаленно. Даже 10-ть метров это уже проблема. USB кабель длинноват для такого.

Надо обязательно найти решение проблемы удаленной прошивки.Тогда можно и удаленную автоматику «ремонтировать» не выходя от компьютера. А сейчас приходиться скидывать это дело на ноутбук.

Последняя версия ПО по счетчику-на-ардуине — emonitor_001

Часть 9. Обновлено ПО, по результатам эксплуатации устройства

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

Upd 2015-09-23. Написал сегодня интерфейс для просмотра данных мониторинга. Заодно и оптимизировал прошивку, нашел ошибочек в ней. Поднял внутренний ДНС сервер, на «микротике» это минуты дело.

emonitoring_01

Просто показал последние 48-м часов (потер статистику, поэтому там меньше на графике) в виде заглаженного графика. Всплеск — это начало работы стиралки, по У — цена в гривнах за текущий час, с учетом ночного тарифа, конечно. По Х — дата/время.

Теперь можно немного посмотреть что происходит. Маленький нюанс — расположил все в домашней сети, для большей устойчивости.

Ранее уже писал, что попробовал одно стандартное ПО, чтобы показывать расход электрики (emoncms). Непонятная мне парадигма и подход. Там раз в три секунды отсылает на сервер данные, и показывает что-то. Я сделал по другому — устройство накапливает данные 1 час, потом отсылает за последние 24-ре часа. Веб=-сервер на Synology DS212 запустил, это NAS, с низким энерго-потреблением.

UPD. Выяснилось, что это не Интернет у меня такой, это устройство иногда не передает данные. Не понятно, с чем связано, и отловить сложновато, поэтому пошел другим путем — подсчетом промежуточных показаний на основании текущего расхода. За сутки гдето 1-2 раза происходит сбой. Такая схема позволяет отказаться от хранения почасовых данных в еепром, которое также почему-то работает не совсем корректно.

UPD. Доделал немного ПО сайта показывающего данные. Теперь там есть вольтаж по часам, почасовой и посуточный расходы.

u_after_servo

 

Подумываю над размещением ПО на гитхабе. Наверное. так оно и будет.

UPD. Очередная прошивка. Добавил перезагрузку после отсылка данных — emonitor_008

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Счетчик электричества на основе «Ардуино»: 23 комментария

  1. Уведомление: Завершенные проекты | Хроники фрилансера

  2. Здравсвуйте. Спасибо вам очень интересная статья!

    А можно код добавить интерфейса для просмотра данных ?

  3. Вітаю, щось не вдається запустити ваш проект.. Після старта ,на дисплей видається:
    publikz.com
    EMON v1.1
    за декілька секунд
    Connecting via
    DHCP for 60 sec

    і за 8 сек борд йде в ребут, все повторюється. Бачу, в коді є досить багато дебаг інфи ,яка має виводитись в послідовний порт, але її теж нема…

    Щось порадите?

    • У вас все работает верно. Просто если за 8-мь секунд не подключается, идет перезапуск. Настройте роутер (DHCP сервер). Смотрите логи роутера. Смотрите пакеты сниффером.

      • Борд успішно отримує IP адресу:
        Serial console каже наступне:

        [webClient]
        IP: 192.168.101.7
        GW: 192.168.101.1
        DNS: 192.168.101.1
        ÿ…
        Debug1

        В той самий час борд відповідає на ICMP пакети з іншого компа… Але ребут надалі відбувається…

          • Виглядає що не в кабелі справа,закоментував я перевірку DNS і все запустилось, що це за перевірка?

            void connect_eth()
            {

            • Дружище, если вы не понимаете что это, это повод — изучить эту библиотеку более пристально…

              • пане Жорж, я не програміст… та й з Ардуіно знайомство почав зовсім недавно.
                Wireshark показав у чому проблема ;) — борд відправляв порожній DNS запит, відповідно й отримував fail …
                Як що б коло цієї стрічки:
                char c_emon_host[50] =»»
                стояв відповідний коментар,то такої ситуації можна було б уникнути… ;) . Виходить код ви дали «сирий» — «…после зборки — тщательно обработать напильником»

                Зарас наступна проблема, клавіатура не реагує, калібровку зробив окремим скетчем, потім ті значення переніс в основний код… В якому напрямку далі рити?

              • » В якому напрямку далі рити?»

                Наверное в том, почему у вас не обрабатываются прерывания?

  4. А можете подсказать к каким контактам вы подключали неразъемный трансформатор тока (их там 4)? а то как-то в статье вы именно свою схему подключения и не показали

    • Берете тестер, и смотрите какие два контакта в трансформаторе тока соединены. Остальные два — это просто выводы для припаивания на плате, чтобы держался и они никуда не подсоединены.

      «Схема» 1:1 вот эта — http://publikz.com/wp-content/uploads/2015/08/pmon.png

      Верхняя часть, чтобы было понятно СT — current transformer.

      Провод нагрузки — просто пропускается через отверстие трансформатора тока и никуда не подсоединяется.

      • а у вас насколько точным получился прибор? у меня при нулевой нагрузке ток скачет от 0.07 до 0.33 А, что в итоге очень сильно сказывается на результатах (14-70 Вт). более-менее точно можно считать только большую нагрузку (~2кВт), как такого избежать? (все собрано по схеме)

        • Я не проверял точность (в плане тарирования по всему диапазону), для меня это был показометр, который позволил сократить (и вообще понять) потребление на кухне. Например что сколько какой режим стиралки потребляет.

          Точность около 25 ти ватт была. По сути 1024 отсчета на 2.5 квт. Советую сместить схему в низ, думаю все эти СТ — немного отличаются. Может и я применил другие детали в делителе, сложно уже вспомнить, я помню — подгонял значение под ваттметром, по паре разных резистивных нагрузок.

        • спасибо вам за такие быстрые ответы, удалось решить проблему подключением доп питания от блока питания, видимо проблема была в питании от usb.

          • Высылайте фото готового изделия как сделаете. Интересно также какая надежность отсчетов и длина линии сетевого подключения у вас будет при этом.

  5. Добрый день.

    Собрал схему для мониторинга (высоковольтную часть), но в качестве трансформатора тока DL-CT1005A применил AC-1020. Трансформатор взял с 220 на 9 вольт. Все остальные компоненты — согласно приложенной схеме.
    После первого включения программа выдала (примерно): 168 вольт и 75 ампер. Внес корректировку в коэффициент напряжения. Получилось 0.823 вместо 0.592.
    По току ещё не проверял, но тестером показало потребление 0,2-0,5 ампер.
    Возможны ли такие большие интервалы при корректировках коэффициентов?
    Подскажите, как правильно проводить подсчет частоты электросети при 50 Гц, а то приложенная форма считается при 60 Гц:
    //Used to filter out fringe vPeriod readings.
    //Configured for 50Hz
    //- If your 60Hz set expPeriod = 16666
    unsigned long expPeriod = 16666;
    unsigned long filterWidth = 2000;

    • Коэффициенты подбираются по чисто резистивной нагрузке.

      Большие интервалы возможны.

      50гц
      unsigned long expPeriod = 20000;
      unsigned long filterWidth = 2000;

  6. Предварительно думаю про подобную штуку, принципиальное отличие в сетевой части — хочу делать что-бы мониторилка на сетевом интерфейсе (Wifi) был MQTT протокол — вроде как есть ардуино реализации, тоесть мониторилка никуда ничего не шлет а ее могут читать те кто хотят. Вроде как универсальнее, собственно вопрос — про такое не думали? Может есть какие подводные камни которые пока не вижу )

    • Я не очень пока могу ответить, так как не завершил текущий проект. Вероятно буду применять там визнет 5100 или 5500 контроллер.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *