Велосипед из энергомонитора PZEM004T и ESP8266, с Народным мониторингом

Свой неудавшийся проект контроллера температуры (Фиаско. История одной самоделки IoT) я решил оставить в качестве только монитора. И следующим шагом прикрутил энергомонитор PZEM004T, за одно реализовал отправку данных на Народный мониториг.
Добро пожаловать под кат…
Задался я вопросом — куда девается ток из проводов? Вроде топим дом газом, в доме все лампы диодные, посудомойку включаем в ночь, бани с электропечкой пока нет, а электричество все время куда-то девается. Непорядок. Надо бы за ним проследить.

Первый шаг — общий мониторинг потребления


Задачи


Я решил затеять охоту на стадо зайцев. Зайцами были выбраны:

  • Мониторинга электросети через интернет. Моментальный контроль параметров сети у меня присутствует — в коридоре, в щитке есть энергомонитор PZEM061, на экране можно увидеть напряжение, ток и мощность. А вот на месте отображения потребляемой энергии — какая-то абстракция, слишком мало разрядов. Но в коридоре не удобно. Хочу на экране телефона.
  • График потребления электричества. Хотелось бы узнать когда же возникает чрезмерное потребление?
  • Показания счетчика через интернет. Это боль — передача показаний счетчика в энергосбыт. Передавать им показания надо с 15 по 25 число месяца. Я об этом часто забываю и они начинают звонить роботом и писать спамом. При этом когда они о себе напоминают — я как правило на работе, а счетчик у меня на столбе на улице. Хочу на экране телефона.
  • Мониторинг температуры стабилизатора. В нашей деревне зимой больше 200в на входе в дом не бывает, доходит до 140в. Поэтому у меня на есть стабилизатор на 12кВт, но при таких параметрах и длительной нагрузке от 2кВт и с учетом расположения стабилизатора в нише стены — стабилизатор перегревается и отключается, пришлось добавить пару вентиляторов (с ними температура остается в допустимых пределах) — ранее они были включены постоянно, сейчас под замес — поставил термостаты KSD9700 на 65 гр, ждем зимы. Следить за этим параметром я не хочу, т.к. влиять на него не могу. Но после добавления термостатов — надо проконтролировать результат.


Железо


Для решения поставленных задач было выбрано:

  • PZEM004T — энергомонитор с UART. Позволяет получать параметры электросети — один параметр раз в 0.6сек: напряжение, ток, мощность, потребленную энергию, а так же не нужные мне частоту и коэффициент мощности. Используется с измерительным трансформатором 1:1000. Чтобы модуль понимал логику 3.3в, на резистор R17 1кОм напаял сверху еще один такой же, уменьшив сопротивление до 0.5кОм (или можно было заменить R17 на 470Ом).
  • ESP8266 NodeMCU — универсальный микроконтроллер с WiFi, по размеру хорошо сочетается с PZEM004T — можно соединить стойками с использованием имеющихся отверстий на платах. Так же на плате NodeMCU есть полезная кнопка Flash (соединена с GPIO0) — ее удобно использовать для управления режимом работы — например для включения SoftAP.


С учетом того, что девайс будет размещен в металлическом корпусе стабилизатора — припаял на ESP внешнюю антенну. Пытался запитать ESP от PZEM004T (подпаяв провода к круглому конденсатору — на нем примерно 7в) — не получилось, при подключении ESP напряжение просаживается до 2в. Но в стабилизаторе уже есть БП на 5в — для вентиляторов, значит он и будет использован (я думал он на 12в, поэтому долго мучился, чтоб подключить к нему ESP — не работало ни в какую, перепробовал кучу DC-DC преобразователей, пока не перевернул БП и не прочитал на нем надписи).

568syzaphx5e7gg62uqjuyjqkua.png

Прошивка


Посмотрел имеющиеся в сети. Как обычно не нашел подходящей и решил написать свою.
За базу взял свой же проект для реле Sonoff (простейший функционал, по HTTP и по кнопке включается и выключается, больше ничего не умеет; используется совместно с MacroDroid для щадящего питания телефона c постоянно включенным экраном — у предыдущего от постоянного заряда аккумулятор вздулся и выдавил экран). Но кроме функционала реле, сборка имеет http сервер, настройки WiFi, NTP, работает с кнопкой GPIO0 — разные действия от длительности нажатия, моргает по-всякому лампочкой (например отсчет секунд нажатия кнопки, отражение состояния реле и WiFi)…

Естественно несколько доработал настройки:

6noy274t8yivlrtxybopipepba4.png

Посмотрел имеющуюся библиотеку для работы с PZEM004T — не понравилось. Она отправляет запрос, а потом в замкнутом цикле ждет ответ. Не правильно это. Написал свою библиотеку, асинхронную — указываю ей из основной программы какие параметры хочу получить, а потом периодически проверяю, получены ли требуемые данные:

Код
static PZEM004Tnb::flags flags = PZEM004Tnb::flags::all;
static unsigned long lastReadEnergyTime = 0;

if (Pzem004t.isDataUpdated()) {
	setLedState(3); // радостно поморгаем по поводу получения данных

	// ...

	unsigned long currentTime = millis();
	if ((currentTime - lastReadEnergyTime) > 6000) { // раз в 1 мин читаем счетчик
		flags = PZEM004Tnb::flags::all;
		lastReadEnergyTime = currentTime;
	}else{
		flags = (PZEM004Tnb::flags)(PZEM004Tnb::flags::all ^ PZEM004Tnb::flags::energy);
	}
}
Pzem004t.updateData(flags);


Учел, что PZEM004T считает максимум 99кВт*ч, потом сбрасывается — реализовал учет переполнений. Реализовал двухтарифный счет. Так же реализовал учет средних значений параметров — показания считываются примерно раз в 2сек, а на Народный мониториг надо передавать данные раз в 5 мин, естественно средние.

Добавил в систему работу с массивом датчиков DS18B20. Данные считываются поочередно с периодом 2сек на датчик. Т.е. ищем датчик, нашли — получаем данные, через 2сек ищем следующий и т.д. Кончились датчики — начинаем с начала. Т.е. при использовании только одного датчика период его опроса 4сек. Для этих датчиков так же сделан расчет средних значений.

Актуальные данные энергомонитора можно получить по HTTP:

l_ucjyu_dm6b55ovjt1dw2dapqe.png

Все данные хранятся в целых числах, когда нужно (например при передаче в Народный мониториг) — в нужную позицию добавляется точка.

Реализовал публикацию данных по протоколу MQTT/UDP. Добавил поддержку этого протокола и датчика PZEM004T в свой монитор:

88obdsb96ewvmu611ufwsxqs_ns.png

Реализовал публикацию данных на Народном мониторинге:

8_g9mews2dgsubfu31gclmdnhnq.png

Естественно, добавил настройки публикации данных:

xj5m7fdmyeolxcuxczmfoqlzmxi.png

Итоги


В результате мониторинга в реальном времени уже отключил один из двух постоянно включенных миникомпьютеров, настроил на компьютере дитеныша гибернацию, в BD плеере (используется только для караоке) перенастроил режим сна.

Когда наберется статистика для графиков — буду дальнейшие шаги предпринимать.

Кто захочет заиметь себе такой энергомонитор — велкам в личку за прошивкой (Халява, сэр!).

P.S.


При разработке девайса столкнулся с мистикой — при питании ESP от USB компа, от любой зарядки телефона — все работает. При питании от встраиваемого БП — не работает. Привлек для расследования логический анализатор и симплескоп — питание от синего блока вроде в порядке, сигналы от ESP идут корректные, а обратно — тишина. Другой блок питания — все отлично работает.

Методом научного тыка осознал, что когда я использую встраиваемый БП — я подключаю его к питанию PZEM004T, то есть в этом случае два устройства стартуют одновременно (с другими БП одновременное включение не возможно). А я для коммуникации использую аппаратный UART, на который ESP при старте выкидывает кучу мусора. PZEM004T не может это переварить при старте и зависает. Если же PZEM004T уже включен — старт ESP и мусор в порту он переживает без проблем.
Решением стало использование SoftwareSerial, с ним все работает отлично.

© Habrahabr.ru