Прилетело НЛО и опубликовало эту фразу
Пусть эта ламповая статейка даст немного радости в столько серые будни не только белорусов, но и всех остальных.
Обзор реле давления первого поколения с дополнениями
Первая версия моего электронного реле [статья: https://habr.com/en/post/408933/] была большой, толстой и с кнопками по бокам, торчащими как рога у быка. Вот так всегда, когда нет ограничений по размерам, что уж нам мелочиться то...
Версия 1.0 вышла на всеобщую критику 4 года назад на базе Arduino (не оригинальной) с большим синим экраном на 4 строчки. Тогда это казалось волшебством, а сейчас обыденностью. Как быстро мы привыкаем к хорошим вещам и забываем радоваться мелочам. Итак: "погнали наших городских!"
Флешбэк
Кстати, помните фотку бани с прошлого поста? Загляните ради интереса https://habr.com/en/post/408933/, посмотрите. Спустя годы, сейчас у нас вот так:
Как пела в детстве наша дочь: - И пусть летят гага... мы не забудем Вас никогда..."
Исправления, улучшения, обновления в процессе эксплуатации v1.5
Под шумок прилетело много обновлений со стороны пользователей, которые помогли улучшить код и натолкнули на мысль: «а нафиг столько всего… надо упрощать».
По факту перешел на mini Arduino, упростил экран, взяв меньший по габаритам и убрал боковые кнопки, которые выставляли верхнее и нижнее давление (нижнее давление говорит когда насос надо включать, верхнее - когда его надо выключать). А накой они, когда давление выставляешь один раз. Настройки начали "залетать" с прошивкой в виде статических переменных. В целом я решил пойти по пути разработки через тестирование прототипа. Внутри каждого из нас живет свой маленький дорогой наш, Маск Илонович:) - который периодически просыпается и подкидывает пищи для размышлений, надо лишь поверить в него и не оборачиваться на лица с "вопросами".
В процессе понял, что реле на 25А греется от 1kW насоса, который колошматит на три дома. Заменил на 40А и посадил на радиатор. Боковые кнопки почти не использовал, поигрался и вырезал из прототипа. А придуманный мной алгоритм предварительного включения реле даже не запускал в продакшен. Придумал же себе такое дело, если скорость падения давления в баке превышает "некий" порог, не дожидаясь падения до нижнего давления, включать насос на опережение.
Arduino прошивка доступна здесь: https://github.com/abogdanovich/pressure_sensor_arduino
Фобии, ужастики и отказы за 4 года v1.5
За 4 года эксплуатации произошел только один отказ. Ошибки свои надо признавать и не давать другим их повторять. Данный отказ вылез через 2 года эксплуатации и чуть не стоил мне гидроаккумулятора и мокрых штанов. Глаза округлились, когда я увидел в гараже, как из-под гидроаккумулятора капает водичка...
Кто видел, как производят гидравлическое тестирование ракет на разрыв, тот поймет всю картину происходящего. Ну так вот… хорошо, что мой насос максимально 8Bar накачивает, а гидроаккумулятор способен выдерживать до 10Bar. Это и стало ключевым моментом спасения на максималках.
Ошибка закралась в коде, где идет проверка показания давления с дополнительной проверкой, для проверки выхода за пределы установленного значения. Так сказать, двойная проверка самого себя. И вот… случилось так, что я прошляпил в коде такой редкий случай, когда показания давления вызвали сбой, установилась ошибка датчика, и при этом, заблокировалась вторая проверка на выключение насоса, когда он выходит за пределы максимально допустимого давления.
Недоглядел Михалыч ? и словил "гидротест" бака. А сам бак у горловины поднялся на 1см от давления. Металл горловины, где сужение, выдавило немного наружу. Бак по-прежнему работает и не жалуется, только краска на нем облезла после испытаний :)
А теперь самое ценное за 4 года - 2 фотографии сенсора, который под давлением 4-5Bar проработал 4 года в водной среде. Изготовитель Китай. Датчик до сих пор работает!
Вода у нас чистая (60 метров скважина) и я прям не ожидал, что под давлением могут сформироваться такие экскременты :). Твердые кальцинированные образования с черно зеленоватым оттенком. Подозреваю в этом медь и латунь в контакте с другими металлами дают некую "контактную коррозию". Если у Вас есть мысли - напишите их в комментарии. Миф о том, что это чудо проработает месяц - разрушен официально :) - хаха! Mythbusters прям получился. Заменил на новенький, прокачал бак и получил значения такие же, как на механическом манометре.
Других нареканий не было. Показания по давления совпадают с манометром с небольшим отклонением, которое заложено в самом датчике. Включение и выключение происходят тихо, насос работает исправно, ничего не греется, Ардуина не зависает, не поржавела, не замерзла (+2..+5 градусов зимой без отопления в гараже). Из функционала включения и выключения, оставил ещё хранение данных на самой Ардуина и загрузкой из памяти eeprom. Знаю, знаю... с eeprom баловаться можно до поры до времени, поэтому запись организовал с редким интервалом записи. И тут мне пришла мысля…
Cейчас народ подкатит с фразами "чем проще устройство тем надежнее..." - ну так они до сих пор и летают на аппаратах производства СССР.
Надо пробовать двигаться вперед!
Переход на новое реле давления v2.0 – MicroPython на базе ESP8266
И чего мне не спалось то....
Все бы хорошо… Шел бы тандыр коптить, да плов жарить, но нет, душа рвется в бой, да ещё с ESP8266, да MicroPython "намазывая". И в доме все на них, управляется, да через телефон. Приятно ж то, как ?.
Как раз на замену надо второе реле давления, на всякий случай. А то пишут вурдалаки, китайское реле давления проживет у тебя месяц, да все прогноз сбыться не может. А я спать не могу теперь. А им тоже не спиться, вот так все и ждут…
Решил я податься во все тяжкие, да запилить на базе ESP8266 + MicroPython. Ещё данные хорошо бы в mongodb складывать и красивые графики рисовать. А потом много возможностей для анализа данных и генерации статистики. Полезно и лишним не будет. С такими набором данных можно будет и прогнозы подкачки давления в гидроаккумуляторе планировать. … опять спать не буду спокойно. Ай ну и ладно – интересно же!
Плюсы перехода на модуль esp8266
А что из плюсов и зачем на ESP8266, да ещё с каким-то MicroPython? А тут все просто: попробовал ESP8266 через телефон хоть раз, уже на Ардуино и смотреть не хочется. Не то что делать что-то там...
ИМХО, ESP8266 – это как электрокар против ДВС. Возможности обратной связи c выходом на просторы интернета, оперативность выполнения задач. Я молчу уже про монстра ESP32. Arduino хорош для пробы, этакий старый добрый корвет, с возможностью нарисовать «квадратики» и поморгать светодиодами, для старта автоматизаторов.
Схема нового реле давления на базе MicroPython
Перейдем к исполнению нового устройства и рассмотрим поближе, какие компоненты у нас будут, что требуется установить и как мы будем код писать. Я вот сидел и думал, а как обозвать это устройство, а то устал писать "замена механического реле на электронное" - вот Вы подскажите вариант названия этого устройства в комментарии, будет интересно почитать Ваши предложения!
Пока я дописывал статью и тестировал датчик, спалил одну ESP8266 (причины не известны... такое бывает). Так же у меня развалился mini oled дисплей, а старый (4*20) дисплей отказался работать.
И что Вы думаете? Да я плюнул, выкинул обвес дисплея и решил идти дальше, по хардкорному, а точнее - NodeMCU + реле + датчик давления. Все, хватит эти красивые синие экранчики, теперь все будем смотреть через MQTT протокол на экране нашего телефона!
Итак у нас есть:
датчик давления, который мы купили на aliexpress
реле на 40А,
мини дисплей OLED I2C 128*32,насос (автоматика)
ESP8266. Покупайте 12e\f модификацию на базе NodeMCU, сразу распаянный чип со всем обвесом. Раньше я покупал чистый чип и занимался ерундой, пытался припаивать нужные резисторы, но это все от лукавого :) - ну его!
ESP8266 состоит из 2 плат. Основа "бутерброда" NodeMCU (например, модификаций много всяких), это которая с ножками и подписанными пинами, micro-USB входом и кнопочками RST (reset) и FLASH (ранее использовалась при прошивке), а так же самим чипом ESP8266, который питается от 3.3V с wifi антенной и металлизированным панцирем, закрывающим собственно сам чип от вредителей внешнего мира.
Analog-to-digital converter и делитель напряжения
Резко так погружаемся в те места, которые будем использовать при работе, но не те, которые Вы подумали :). Мы рассмотрим лишь то, что касается данной статьи.
Стоит рассказать несколько нюансов чтения данных ESP8266 через аналоговый пин A0 - ADC - он же Analog-to-digital converter.
Что бы замерять напряжение на ESP8266, ADC позволяет измерять интервал от 0 до 1V. Такой глупости нет на Arduino и это автоматически делает Arduino превосходным "безгеморным" бордом для начинающих. А вот кто вкусил ESP8266, тот уже наверняка познакомиться с понижением сигнала (напряжения) от датчика от стандартных 5V до max 1v. Вход A0 на борту NodeMCU, позволяет понижать напряжение с 3.3V до 1V. Там уже встроен делитель напряжения. Но у нас сенсор выдает 0.5 - 5v и нам надо что то с этим делать! Значит надо понизить с 5 до 3.3, а NodeMCU уже подхватит и понизит до 1V. Все просто, нам надо от сенсора припаять резистор 1K и 2K и между ними снимать показания и передавать на A0 pin.
Больше информации, уважаемый читатель, сможет найти в интернете с более подробными объяснениями. Интересно, какие Вы делители напряжения напрягали, делили и применяли и где? Напишите в комментарии, интересно почитать.
C железом все понятно, крутим все провода, паяем, где-то "благим словцом" покрываем. Как соединить реле, сенсор и дисплей, показано на картинке выше. Не ленитесь "гуглить" в случае непонятного подключения. Реле заводим на 14 pin, дисплей на 4 и 5, а сенсор на adc 0. Питаться надо правильно, поэтому мощность блока для ваших устройств рассчитывайте, что бы хватало и для ESP8266 и для датчика давления. Выходное напряжение блока питания 5 вольт с силой тока > 0.5A. Берите с запасом, иначе можно "ловить" глюки и непонятные явления в виде летающих НЛО на вашей базе под названием "ESP8266".
Настройки программного обеспечения
Код писать будем в PyCharm, в котором можно установить библиотеку MicroPython и наслаждаться возможностью "заливать" \ "прожигать" код прямо из PyCharm IDE. Легко, просто и быстро!
Тошним с прошивкой MicroPython в Pycharm
Ставим PyCharm Community IDE https://www.jetbrains.com/pycharm/download/#section=windows
Устанавливаем plugin MicroPython https://plugins.jetbrains.com/plugin/9777-micropython
Необходимо скачать и установить esptool https://github.com/espressif/esptool
Зайти на сайт MicroPython и скачать последнюю стабильную прошивку для ESP8266 https://micropython.org/download/esp8266/
Подключить ESP8266 к USB порту и выполнить в терминале 2 команды, предварительно узнав, какой COM порт был назначен ESP8266, когда Вы её воткнули в USB, выполняем команду:
esptool.py --port COM_PORT erase_flash (сотрет начисто все, что там затаилось)
esptool.py --port COM_PORT --baud 115200 write_flash --flash_size=detect -fm dio 0 esp8266-downloaded-formware-from-web-site.bin (esp8266-downloaded-formware-from-web-site.bin - имя файла, который Вы скачали с сайта MicroPython)
Все готово, что бы спалить наш первый ESP8266, что бы вдохнуть жизнь в Ваш модуль.
Код
Сливаем код https://github.com/abogdanovich/micropython_esp8266_pressure-sensor и открываем проект в PyCharm студии.
Нажимаем магическую комбинацию: Ctrl + Altr + S. Идем в Languages & Frameworks -> MicroPython -> и отмечаем чекбоксы: Enable MicroPython support | Auto-detect device path
Выделяя каждый файл проекта в окошке файлов проекта (слева), выбирайте Run <filename>, что бы залить каждый файл на ESP8266.
Незабываем! Проверить все настройки кода в главном файле main.py: -
выбрать выходные каналы информации: mqtt, display, db (mongodb).
Для mqtt_channels надо вбивать 2 названия, первое будет использоваться для отсылки данных по давлению, второе для экстренного отключения реле (в случае чего).
Указать начальные параметры для сенсора, нижнее и верхнее давление
sensor = SmartWaterSync(
wifi_ssid="",
wifi_pass="",
mqtt_username="",
mqtt_password="",
mqtt_channels=("smarty/water_pressure", "smarty/water_relay",), # write topic, read topic (on\off relay)
output_channels=('mqtt', 'db'), # possible: mqtt, display, db
low_pressure=4, # bottom ON pressure
high_pressure=5, # up OFF pressure
max_sensor_pressure=12, # the max sensor pressure according to specification
sensor_raw_offset=43, # define the default value from sensor
sensor_min_raw_for_error=30 # define this to call ERROR state and disable RELAY \ STOP working
)
После заливки всех файлов, Ваше устройство оживет и на дисплее будут показания и esp8266 начнет моргать каждую секунду. Это индикатор работы модуля. Если он моргает и не горит постоянно - значит с кодом более менее все хорошо. Код я рекомендую разобрать самостоятельно. Если Вы желаете внести улучшения либо оптимизировать - милости прошу в гит реквесты. Весь код построен на асинхронном выполнении нескольких задач:
чтение данных с сенсора и принятие решения о включении \ выключен
попытка подключиться к Wifi сети
попытка подключиться к MQTT серверу
отсылка данных в каналы, которые Вы определили при старте: mqtt, db, display.
При старте, все задачи стартуют и пытаются выполнять все что им велено. Я максимально постарался обвернуть все выполнения задач в свой try блок, что бы при возникновении ошибки, не прерывался общий процесс работы модуля и все шло своим путем. Есть идеи? - Пишите!
Сбор данных
На моем локальном сервере, который успешно пылиться прохлаждается в гараже уже 7-ой год, есть все что мне надо: mqtt сервер, видео сервер (motion), mongoDB и Flask.
Для записи данных я использую mongoDB + Flask связку. Можно отправлять данные напрямую из ESP8266 (честно, ещё сам не пробовал использовать эту библиотеку), а можно через http request "прокидывать" данные во Flask, производить нужные манипуляции и укладывать данные "штабелями" в базу. Это не совсем производительно, но дает возможность в предварительной обработке данных. Да фиг с ним, пусть что-то останется для Вашей оптимизации. Каждому по софтварному пирогу.
Описывать обработку и хранение данных на Flask \ mongoDB нет смысла, так как это выходит за рамки данной статьи, да и Вы уже знатно подустали. Отдельно отмечу мобильное приложение для чтения данных через mqtt протокол.
MQTT Dash - самое достойное приложение с поддержкой MQTT протокола
Сколько себя помню - столько пользуюсь самым крутым приложением поддерживающим напрямую протокол MQTT (только для Android пользователей). Автор - если ты читаешь хабру - от души, огромное спасибо тебе и продолжай развивать проект, фиксить баги. Ты - красавчик. Остальные приложения нервно курят в сторонке. Если кто-то готов возразить, милости прошу в комментарии. Спасибо автору, за возможность без рекламы пользоваться полноценным функционалом. Ссылка на приложение https://play.google.com/store/apps/details?id=net.routix.mqttdash
Если вы используете закрытый MQTT сервер какого либо онлайн сервиса (открытый даже не пытайтесь), или используете свой сервер, как в моем случае. Тогда Вы cможете настроить приложение MQTT Dash и подписаться на свой канал чтения\управления.
Заключение
Спасибо, что дочитали до конца. Произошло "возрождение" электронного реле, которое радует новым функционалом и возможностями. Накапливаю данные, которые я хочу попробовать обработать, проанализировать в дальнейшем. Если у Вас есть идеи и примеры обработки данных такого типа буду рад послушать Вас!
/ Alex B.