Сколько воды в бочке?
Когда всё это началось? Вот знать бы когда... Может быть, когда я провёл воду в дом на даче и понял, что нужно как-то измерять её уровень? А может когда я ещё пацаном делал печатные платы для своих схем и думал, какое бы практичное применение им найти? Или когда ещё раньше у мамы на работе с завистью смотрел, как взрослые умные дяди разводят платы в PCAD-е, а на мой вопрос, как бы мне так научиться, отвечали, мол, ууу, это так сложно, мальчик, тебе ещё расти и расти... Или когда ребёнок, родившийся в семье преподавателей на кафедре радиоэлектроники, в годовалом возрасте получил первый опыт работы с радиоэлектронным оборудованием, заработав ожог от оставленного на столе паяльника старшего брата?
Дача вначале строилась как простая замена ветхому дачному домику, построенному дедом в 60-х годах. Строилась без претензий на что-то особенное. И только тогда, когда она получилась лучше, чем планировалась, я решил подвести воду в дом. На тот момент на дачах воровство было страшное, да и электричество отключали часто, поэтому систему водоснабжения я решил сделать предельно простую: на чердаке размещалась бочка, вода туда заливалась из системы трубопроводов для летнего полива, а оттуда самотёком подавалась на кухню и в санузел. И ворам красть особо нечего, и от электричества не сильно зависит. Сказано-сделано, и жить в доме с водой стало намного комфортнее.
А затем появилась скважина. Хотя назвать её скважиной можно было лишь с большой натяжкой. С одной стороны, удалось попасть в водоносную жилу, которая питает местные родники (а вода в роднике очень вкусная). Но с другой — классический подход к организации скважины оказался тут неприменим — из-за герметичного оголовка насос начинал выкачивать мелкий песок из водоносных слоёв. Поэтому пришлось разгерметизировать скважину, и она стала работать как некий мини-колодец под атмосферным давлением. Из такого мини-колодца насос быстро выкачивал всю воду, но она так же быстро набиралась. Но чтобы насос не забирал песок, остановить его нужно было ещё до того, как вода опускалась ниже критического уровня. Такая вот капризная система получилась.
Для водоотведения был выкопан септик с системой распределения отработанной воды в толще грунта. Но практика показала, что вода в грунт уходит не так быстро, как хотелось бы, и бывали случаи, когда септик переполнялся. Поэтому я поставил фекальный насос для аварийного сброса лишней воды. Насос был оснащён поплавком, и когда вода поднималась выше критического уровня, он включался и сбрасывал воду из септика в небольшой закрытый приямок, откуда вода рассасывалась в грунт. Точка сброса была выбрана рядом с местом для разлагаемых отходов, метрах в трёх от него росла яблоня, а рядом когда-то был посажен куст красной смородины, который никак не хотел плодоносить и был первым кандидатом на вырубку. Но когда насос начал сбрасывать туда воду, яблоки у яблони заметно прибавили в весе, а смородина настолько обалдела от такого счастья, что выросла ростом чуть ли не с меня, и стала приносить самые крупные ягоды из всех кустов на участке. В общем, всё получилось не так уж плохо, и вопрос с аварийным сбросом из септика на том был закрыт.
В итоге я получил следующее водяное хозяйство: на чердаке бочка, питает её насос из капризной скважины, а канализация живёт своей жизнью, которую хотелось бы просто хотя бы иногда контролировать. О насосной станции я тогда не думал — опять же по причине воровства. Но водяное инженерное семейство получилось такое, которым нужно было как-то управлять. И первым встал вопрос — как узнать, сколько воды в бочке?
Начало. Меряем уровень воды в бочке
А какие были варианты? Я рассматривал все, вплоть до самых экзотических (самое время вспомнить Нильса Бора и его способы измерить высоту башни с помощью барометра — кому интересно, погуглите). Рассматривались и версии поплавковых концевых датчиков, и ультразвукового датчика расстояния до водной поверхности, и тензодатчика, измеряющего массу бочки, и индуктивного датчика высоты водяного столба, и оптических дискретных датчиков уровня, и ещё куча всего подобного... Но всё это выглядело либо слишком сложно, либо неэффективно. Я был в раздумьях, пока мне не попался на Алиэкспрессе гидростатический датчик уровня жидкости с интерфейсом токовой петли. Мне он показался интересным, и я решил попробовать поиграться с ним.
Из Википедии:
"То́ковая петля (англ. current loop) — способ передачи информации с помощью измеряемых значений силы электрического тока. Для задания измеряемых значений тока используется, как правило, управляемый источник тока. По виду передаваемой информации различаются аналоговая токовая петля и цифровая токовая петля.
Аналоговая токовая петля используется для передачи аналогового сигнала по паре проводов в лабораторном оборудовании, системах управления производством и т. д.
Применяется смещённый диапазон 4—20 мА, то есть наименьшее значение сигнала (например, 0) соответствует току 4 мА, а наибольшее — 20 мА. Таким образом весь диапазон допустимых значений занимает 16 мА. Нулевое значение тока в цепи означает обрыв линии и позволяет легко диагностировать такую ситуацию.
Интерфейс аналоговой токовой петли позволяет использовать разнообразные датчики (давления, потока, кислотности и т. д.) с единым электрическим интерфейсом."
Токовая петля — очень грамотный интерфейс. Датчик работает как источник тока, изменяющий значения тока в зависимости от его показаний. То есть, 4 мА — нулевой уровень жидкости, 20 мА — максимальный уровень (для этого датчика это примерно 5 метров). Поскольку датчик меняет ток, а не напряжение, его показания не зависят от длины соединительных проводов и их сопротивления. А для снятия этих показаний достаточно включить последовательно в цепь датчика эталонный резистор и измерять падение напряжения на этом резисторе. Я заказал этот датчик, и когда он пришёл, подключил его, опустил в воду и проверил. Результаты порадовали, и я решил остановиться на нём.
Но как превратить его показания в удобочитаемый вид? Если на выходе мы в итоге получаем напряжение, может просто повесить какой-то вольтметр? По случаю, на том же Алиэкспрессе мне попался на глаза дешёвый индикатор заряда аккумулятора. Изображение на нём очень напоминало мою бочку :), а стоил он тогда всего сто рублей с какими-то копейками. Исходя из концепции максимально дешёвого устройства я решил попробовать прикрутить его к гидростатическому датчику и посмотреть, что из этого выйдет.
Как их подружить между собой? А как работает этот индикатор? Инженерное чутьё подсказывало, что ничего сложного в нём нет. Я задумался — как бы я сам его сделал? Ну, наверное, реализовал бы каскад, формирующий эталонное опорное напряжение, запитал бы с него аналогово-цифровой преобразователь (АЦП), сделал бы резистивный делитель входного напряжения, и с этого делителя подал бы измеряемое напряжение на вход АЦП. Ну а далее осталось бы его только обработать и показать на дисплее. А значит мне нужно всего лишь найти тот самый делитель и в эту точку подать напряжение с моего датчика. Конечно, нужно откалибровать напряжение с датчика так, чтобы нулевой уровень показывал на индикаторе 0, а определённый, соответствующий максимальной высоте воды в бочке — 100%. Для этого я рассчитал свой резистивный делитель, который повесил на датчик, обнаружил нужную точку подключения на индикаторе, подпаялся к ней и — вуаля! — индикатор стал показывать нужный уровень воды в бочке!
Вдохновлённый успехом, я решил оформить всю эту неприхотливую водяную систему в небольшой электрический щиток из четырёх DIN-единиц. Там я разместил общий автомат, питающий всю систему, кнопку включения водяного насоса, кнопку включения насоса канализации (снабжённую отдельно дополнительным выключателем в сарайке, чтобы не жать на кнопку постоянно), и автомат включения насоса повышения давления (приобретённый подешёвке в одном из магазинов сантехники — ужасный агрегат, который при включении верещал так, что вороны на соседней ёлке со страху падали. Но своё дело он делал исправно, и я до поры до времени решил его оставить). И внизу всего этого хозяйства красовался тот самый индикатор уровня заряда аккумулятора, который теперь показывал уровень воды в бочке.
Делаем по-взрослому. Контроллер
В таком виде система просуществовала лет семь или восемь. Индикатор более-менее справлялся со своей задачей, хотя и начали у меня появляться мысли, что он подвирает. Вода в бочку до сих пор набиралась вручную — с кнопки. Момент отпускания кнопки контролировался на слух :) — как перестало течь (когда насос выкачивал всю воду из псевдоскважины) — так кнопку отпускали. Канализация продолжала жить так, как ей вздумается, изредка сбрасывая воду на радость яблоне и смородине, да ещё и бурно разросшемуся рядом вьюнку. Но со временем стало ясно, что нужно что-то менять.
Многое изменилось за эти годы. Мы поняли характер работы всей этой водяной системы и приспособились к ней. Но параллельно были разработаны неплохие системы управления умным домом. И что самое главное — на рынке появились дешёвые микроконтроллеры, мощные и функциональные, и при этом стоящие сущие копейки. И я осознал, что настало время для более серьёзного подхода к системе водоснабжения дома.
Визжащий в истерике насос повышения давления был заменён на тихий и аккуратный агрегат. В моём распоряжении появились новые датчики с интерфейсом токовой петли — датчик давления в водяной магистрали и ещё один гидростатический датчик уровня жидкости. И появилось большое желание объединить всё это в единую умную систему. Так я стал проектировать собственный контроллер для управления водой.
Технические требования к контроллеру
Требования к контроллеру я заложил следующие:
Он должен измерять и показывать уровень воды в бочке
Нужно реализовать измерение уровня воды в скважине
Необходимо поддержать автоматическое наполнение бочки, избегая опустошения скважины и длительной работы водяного насоса
Нужно вывести сигнальный индикатор критического уровня воды в скважине. Включать индикатор при падении уровня ниже критического. Насос не должен работать, если уровень опустился ниже критического
Нужно поддержать мониторинг давления в магистрали водяного насоса (чтобы фиксировать засорение фильтров или недостаточную мощность насоса)
Требуется организовать мониторинг включения насоса канализации, чтобы фиксировать моменты аварийного сброса
Нужно поддержать достойный вывод результатов на пользовательский монитор
Контроллер должен быть интегрирован в систему умного дома с возможностью удалённого мониторинга и управления. Протокол интеграции должен быть максимально простым и надёжным
Контроллер должен быть собран по модульной схеме с целью быстрой замены вышедших из строя модулей
Контроллер необходимо разместить в имеющемся щитке без его переделки
Первым желанием было спроектировать полностью собственный контроллер. Но позже я всё же решил пойти немного другим путём и остановился на модульной архитектуре. Идея была в том, чтобы обеспечить быструю замену модулей в случае выхода из строя. Кроме того, модули можно отладить на прототипе и даже просто на проводах, без прототипа. С этими мыслями я начал подбирать для своего контроллера элементную базу.
Элементная база
За основу контроллера я решил взять микроконтроллер rp2040-zero, построенный на чипсете rp2 от RaspberryPI. Подкупало то, что у этого микроконтроллера была продуманная шина ввода/вывода GPIO, он имел буквально крохотные размеры, стоил всего около 300 рублей, а код писать для него можно (и нужно!) было на MicroPython — клоне стандартного Python 3.4 с некоторыми функциями 3.5, адаптированном под микроконтроллеры. Из наиболее важных возможностей было также наличие uasyncio (asyncio для микроконтроллеров). Ну и писать код на Python мне просто нравится.
Для вывода графического изображения я приобрёл дисплей красивого голубого цвета на основе микросхемы ssd1306. Дисплей имеет разрешение 128х64 и работает по шине I2C, которая легко управляется контроллером.
Для управления насосами и прочим внешним оборудованием был выбран блок с четырьмя твердотельными реле на основе Omron G3MB-202P. Эти реле (по сути представляющие собой управляемые оптопарой мощные симисторы) позволяют держать ток до двух ампер по переменному току (мои насосы как раз укладывались по мощности в этот предел), но что ещё более интересно — имеют функцию zero-cross, то есть включаются только тогда, когда синусоида переменного тока проходит через ноль, снижая таким образом опасность выхода из строя от скачка напряжения при включении.
Для снятия показаний водяной системы я решил использовать уже знакомые мне датчики с интерфейсом токовой петли. Один из них уже давно исправно работал в бочке. Второй я смонтировал в скважину, прямо на водяной насос. Третий датчик — давления в водяной магистрали — смонтировал на выходе из насоса на поверхности. Сигнал с этих датчиков нужно было преобразовать в напряжение и подать на вход АЦП микроконтроллера (поначалу я хотел использовать внешний АЦП, подключаемый по шине I2C, но потом решил — зачем оно мне надо, если rp2 имеет четыре встроенных 12-битных АЦП, вполне подходящих для моих задач). Для этого в цепь этих датчиков я включил резисторы номиналом в 150 Ом, которые при 4 мА дают падение напряжения 0,6 В, а при 20 мА — 3 В. Это вполне укладывается в измеряемый диапазон напряжения АЦП контроллера (опорное напряжение этого АЦП — 3,3 В, выше подавать нельзя). Да и 20 мА я никогда бы не получил с моих датчиков, но запас по параметрам я решил не превышать.
А как фиксировать включение насоса канализации? Поплавковый выключатель у него размещён прямо на насосе, и насос никак не сообщает о том, что он включился. Никак... разве только тем, что через насос начинает протекать переменный ток. А что если фиксировать переменный ток в цепи насоса? И как это сделать? Я нашёл интересный датчик, основанный на трансформаторе тока ZMCT, снабжённый двухкаскадным операционным усилителем. В этом трансформаторе в середине есть отверстие, куда пропускается проводник с измеряемым током. На выходе датчик выдаёт переменное напряжение, соответствующее протекающему через проводник току.
Сразу подать его на вход контроллера нельзя, поэтому я выпрямил его по полумостовой схеме и сгладил конденсатором. А для разрядки конденсатора после снятия напряжения поставил нагрузочный резистор. На выходе получился вполне пригодный сигнал, который уже можно подавать на цифровой вход контроллера. Датчики купил сразу 10 штук (так дешевле получилось), и поэтому бонусом задействовал ещё один такой же датчик, включённый по такой же схеме, для фиксации питания водяного насоса. Так сразу можно будет диагностировать неисправность насоса в случае выхода его из строя.
Датчики токовой петли работают от напряжения 24 В. Микроконтроллер и смежные модули — от 5 В. Я решил запитать контроллер от источника питания 24 В, размещённого на DIN-рейке, а для питания микроконтроллера использовать понижающий преобразователь на основе LM2596S, и разместить его непосредственно в контроллере. Модуль простой до невозможности, но тем не менее преподнёс некоторые сюрпризы (напишу об этом далее).
Для интеграции контроллера с системой умного дома я решил использовать старый, дубовый, надёжный и простой протокол MODBUS RTU. Этот протокол работает через шину RS485. Поэтому потребовался преобразователь TTL (UART) в RS485. Я нашёл недорогие преобразователи hw-0519 на основе микросхемы max485. Их и заложил в схему.
Контроллер я решил оснастить тремя кнопками со светодиодной индикацией. Первая должна включать автоматику контроля уровня воды в бочке, вторая — насос канализации, а третья — насос повышения давления. Мне нравятся кнопки со свечением. Я стал искать их, но нашёл только очень большие (они не влезали в корпус контроллера). Поэтому я придумал "пользовательскую реализацию" — взял самые обычные тактовые кнопки, и эпоксидным клеем приклеил на них сверху светодиоды, взятые от завалявшейся платы невесть какого устройства. Решение понравилось. Хотя признаюсь, что большие кнопки со светодиодами я всё же купил. Может пригодятся в каком-нибудь из дальнейших проектов.
А как же быть с индикатором заряда батареи — тем самым, который долгое время показывал мне уровень воды в бочке? Как не хотелось мне оставлять его мёртвым чёрным пятном! А почему бы не заставить контроллер показывать на нём нужные мне значения? Добраться до электронной схемы контроллера, чтобы передать ему цифровой сигнал, у меня не получилось. Разработать свою схему для управления LCD-индикатором мне показалось слишком сложным (может потом как-нибудь, если будет желание)... И я решил пойти простым путём по уже известной и проверенной схеме — подать ему на уже известную мне точку сформированный аналоговый сигнал, и пусть он показывает его на своём дисплее. Сказано — сделано. Но для этого мне потребовался внешний цифро-аналоговый преобразователь. Ножки на микроконтроллере уже закончились (осталась всего одна свободная), да и встроенного ЦАПа микроконтроллер не имеет. Поэтому я заказал внешний ЦАП на базе микросхемы MCP4725.
А что использовать в качестве сигнальной лампы критического уровня воды в скважине? Вот не хотелось мне вешать штатную оранжевую сигнальную лампу. Тоже мне, мигалка полицейская. Пусть вместо этого будет какой-то приятный элемент интерьера, на который будет просто любо-дорого посмотреть. И попалась мне на глаза бра в виде птички, по форме напоминающей кукушку. А что? Раньше у людей были часы с кукушкой. А у меня будет контроллер с кукушкой :) Тем более что стоит тоже недорого, а смотрится очень даже красиво.
А куда всё это хозяйство разместить? Вариантов у меня осталось совсем мало. Я хотел использовать уже имеющийся щиток, в котором ранее был размещён индикатор уровня воды в бочке. А там всего четыре DIN-единицы. Одна уходит на вводный автомат, вторая — на блок питания. Остаются две единицы. И в них нужно уместить контроллер... Звучит как вызов, но интересно же! Поэтому для контроллера я приобрёл пластиковый корпус, в который и собрался всё упаковать. Конечно, кроме силового блока, который решил разместить прямо в щитке, рядом с контроллером.
Теперь, разобравшись с элементной базой, я приступил к разработке прототипа контроллера на макетных платах.
Разработка прототипа контроллера
Как я уже упомянул, контроллер я решил сделать из двух частей — собственно модуля контроллера, который объединил бы в себе всю слаботочную электронику, и силового модуля, на котором планировал разместить блок с твёрдотельными реле и датчиками тока. С самого начала было ясно, что модуль контроллера будет состоять из нескольких уровней, на которых будут размещены соответствующие элементы. Никакие соединительные провода внутри уже не поместились бы, поэтому в итоге контроллер должен был получиться неким многоярусным монолитом.
На верхнем уровне, прямо под верхней панелью корпуса, я расположил блок дисплея и кнопочных переключателей. Ниже под ним расположился блок микроконтроллера, на котором помимо самого микроконтроллера также уместились цепи обработки сигнала с датчиков тока и резисторы, с которых брались показания датчиков токовой петли. Туда же поместился модуль ЦАПа mcp4725 для поддержки старого индикатора. Следующим уровнем стала базовая плата, на которой расположились модуль преобразователя интерфейса, блок питания (понижающий преобразователь) и фильтрующие питание конденсаторы. Прототип получился страшненьким, но вполне рабочим. А значит можно было приступать к дальнейшей разработке. Разработке печатных плат.
Разработка печатных плат
Вначале я решил разработать именно печатные платы, чтобы было время на их изготовление. А пока они изготавливались, я успел бы закончить разработку программного кода. Платы я решил развести в KiCad-е. Сколько раз в это время я вспомнил тех добрых дядей из детства! Как далеко шагнула разработка печатных плат за это время... Появился бесплатный KiCad в альтернативу платному и недоступному PCAD-у. Появилась возможность промышленного изготовления печатных плат для частных лиц, и не нужно было искать по блату возможность проникнуть на производство, как в старые советские времена, чтобы тебе втихаря сделали твою плату. Больше не нужно корпеть с рейсфедером над текстолитом, разводя дорожки вручную. Разработка плат превратилась в сплошное удовольствие! И я с удовольствием в это удовольствие погрузился.
Разработка плат для моего контроллера имела определённые особенности. Прежде всего, он состоял по большому счёту из готовых модулей, а, следовательно, для них нужно было разработать свои символы и посадочные места. Символом в терминологии KiCad-а называется элемент принципиальной схемы, а посадочным местом — посадка этого элемента на печатную плату. Тут снова меня ожидал приятный сюрприз — некоторые символы и посадочные места для моих компонентов уже существовали в интернете (правда, с критическими ошибками типа перепутанных местами ножек питания :) ). И мне нужно было лишь взять их, проверить и немного подправить. Другие, правда, пришлось разработать с нуля, но справился с этим быстро. В итоге у меня вскоре оказался полный набор символов и посадочных мест для всех элементов контроллера. Осталось только составить из них принципиальную схему, после чего разместить на печатной плате.
Когда всё готово, разработка печатной платы становится очень приятным процессом. Нужно лишь расположить компоненты на схеме, соединить между собой их выводы, подсоединить питание и расписать названия цепей (в последнем вопросе я принципиален и считаю, что каждая цепь должна быть подписана — это снижает количество ошибок. Более того, на печатной плате каждая точка (и иногда дорожка, если позволяет место) тоже подписываются, и тебе лишь нужно проследить, что в конкретной точке стоит нужная цепь). Помимо этого, я снабдил схему комментариями с описанием всех разъёмов на плате. Затем можно проверить правильность схемы при помощи внутреннего валидатора. И всё — схема готова.
Далее идёт этап разводки печатных плат. На этом этапе нужно расположить на плате посадочные места и прорисовать им дорожки. И вновь KiCad предоставляет массу удобств для этой работы, включая опять же валидатор, позволяющий легко находить ошибки. В моём случае из-за высокой плотности монтажа некоторые ошибки пришлось подавить (например, наложение шелкографии или выход шелкографии за пределы контура обрезки платы). Но неподключённые дорожки или их замыкание игнорировать нельзя. И всё это легко отследить с помощью валидатора.
KiCad предоставляет ещё одну замечательную возможность. Если у посадочных мест есть 3D-модели, можно даже посмотреть 3D-вид готовой платы! По счастью, мне удалось найти готовые 3D-модели даже для модулей, из которых я собрал контроллер, в частности для rp2040-zero. Смотрится обалденно!
Точно так же были разработаны платы главной панели, панели кнопок и силового модуля. Затем осталось только сформировать файлы для производства и отправить на изготовление.
Программный код
Пока изготавливались печатные платы, я занялся программным кодом. Для каждого отдельного компонента я создал отдельный класс, в котором реализовал методы и свойства компонента — всё как по науке. Появился класс водяного насоса, класс насоса канализации, класс насоса повышения давления, класс дисплея, классы бочки и скважины, класс MODBUS-интеграции и даже класс ЦАПа для поддержки старого дисплея. В контексте классов бочка и скважина отвечают за свои уровни воды, водяной насос — за давление в своей магистрали и автоматику включения/выключения, и т.д. Каждый делает своё дело. И есть базовый модуль, в котором крутится цикл uasyncio с корутинами, в которых производится расчёт классами текущих значений, обработка нажатия кнопок, MODBUS-интеграции и отрисовки на дисплее.
Дисплей и отображение данных на нём потребовали отдельной проработки. С одной стороны, мизерное разрешение 128х64 заставило проработать каждый пиксель. С другой стороны, имеющиеся шрифты стандартной библиотеки мне категорически не нравились. Поэтому я нарисовал макет дисплея и разработал свои шрифты для отображения. На дисплее разместились символы скважины, бочки и под ними полоска, показывающая давление в магистрали. На фоне бочки я нарисовал букву "А", показывающую, что включена автоматика наполнения бочки. Крупными цифрами показывался процент воды в бочке (по опыту предыдущего индикатора именно такое отображение было наиболее информативным) и высота воды в скважине в сантиметрах. Слева от процента я разместил стрелочку, указывающую прохождение тока через цепь водяного насоса (честный признак того, что насос работает — ведь если бы я просто фиксировал напряжение на насосе, этого было бы мало — а вдруг он сгорел? :( ). Ну и в правом верхнем углу я разместил мигающую точку, указывающую на то, что контроллер живой.
В классе, отвечающем за интеграцию, я реализовал MODBUS-сервер, в котором (согласно терминологии протокола) появились "катушки" (coils), соответствующие кнопкам включения автоматики водяного насоса, насоса канализации и насоса повышения давления на передней панели контроллера. Для передачи значений процента высоты воды в бочке, высоты водяного столба в скважине и процента давления в магистрали (да, процента — мне было достаточно просто качественного отображения давления) использовались "входные регистры" (input registers), а для фиксации работы насосов — водяного и канализации — были задействованы "дискретные входы" (discrete inputs).
Сборка
Код в итоге был написан и проверен на прототипе. К тому времени пришли печатные платы, и настало время сборки боевого контроллера. Распаять панельки и компоненты труда не составило, и в итоге я получил собранные панели и объединил их в единый итоговый модуль.
Ошибки
Да, не обошлось без ошибок. Одна из них выяснилась при сборке основной панели контроллера. Я обнаружил, что перевернул на 180 градусов один из разъёмов, соединяющий основную панель с панелью контроллера. Отругав себя, я удалил ошибочные дорожки и аккуратно распаял так, как нужно, с помощью откушенных ножек резисторов. Получилось в итоге неплохо, хотя осадочек, конечно, остался.
Кроме того, обнаружилось, что я ошибся в диаметре металлизированных отверстий в одном из посадочных мест. При разработке посадочного места я совсем забыл, что это силовая цепь, и туда пойдёт толстый проводник. Ок, сверло в руки, и прощай металлизация. К счастью, дорожки подходили к этим точкам только с задней стороны, поэтому распаял я их без проблем. Но в посадочном месте, конечно, ошибку сразу исправил.
Ряд ошибок был найден уже во время проверочных прогонов собранного модуля ещё до установки в щиток. Как я писал ранее, я реализовал вывод значений процента высоты воды в скважине на старом дисплее, и сделал это через аналоговый сигнал, который подавался на вход LCD-индикатора уровня заряда аккумулятора. Включив контроллер, я обнаружил, что показания бешено скачут. Долго искать причину не пришлось. На плате понижающего модуля напряжения были распаяны фильтрующие конденсаторы входной и выходной цепи питания. Я поставил их побольше. Но как выяснилось, выходной конденсатор категорически не справлялся со своей задачей. Вздохнув, я поставил максимально возможный по размерам конденсатор на 3300 мкФ взамен тех "жалких" 220 мкФ, которые стояли вначале. Проблема была решена, но огромный конденсатор уже не вставал на прежнее посадочное место. Ох... Ок. Плюс два монтажных проводника на плате.
Ну и последнее, что обнаружилось при прогоне — это то, что зависимость показаний индикатора напряжения заряда аккумулятора от "входного" сигнала оказалась нелинейной. Что-то подобное я подозревал с самого начала, но так и не удосужился построить функцию взаимозависимости этих параметров. Разработчики индикатора оказались умнее меня. Теперь мне окончательно стало понятно, почему индикатор с самого начала "подвирал". В итоге я решил проблему, создав банальную XLAT-таблицу, которая преобразовывала значение процента в требуемое напряжение на входе. И индикатор стал честным.
Интеграция
В качестве системы управления умным домом я выбрал HomeAssistant. По описаниям имеющихся возможностей и наличию поддержанных интеграций, а также по честному поведению (умный дом не лезет в непонятное облако, когда его об этом не просят), он понравился мне больше всего. Чтобы особо не думать, я заказал прямо нативную разработку контроллера умного дома непосредственно от HomeAssistant-а (она называется HomeAssistant Green), настроил и успокоился. А когда мне потребовалось интегрироваться с моим контроллером, я всего лишь установил USB-преобразователь RS485 с гальванической развязкой (который, кстати, сразу определился контроллером и без проблем настроился сам) и прописал конфигурацию своего MODBUS-сервера в yaml-файле настроек. Этот умник сразу подцепил все мои настройки, и после небольших дополнительных действий (в основном, по переименованию параметров в человеческий вид) я получил итоговую интеграцию своего контроллера.
Итоги
В общем, получилось ровно то, что я хотел. Контроллер был смонтирован в уже имеющийся щиток, и исправно работает в боевых условиях. Мы с женой быстро забыли, как нажимали кнопку набора воды в бочку — контроллер справляется с этой задачей на отлично. Теперь можно включить насос повышения давления прямо с телефона, удалённо посмотреть, сколько воды у тебя в бочке и в скважине. А также проследить, когда дренажный насос канализации вдруг решил порадовать яблоню и смородину. А о прежнем полёте инженерной мысли напоминает лишь сохранившийся и вполне себе рабочий индикатор заряда аккумулятора, всё так же показывающий процент уровня воды в бочке. Только теперь он это делает честно.
По итогу я не только собрал необходимое в доме устройство, но и получил бесценный опыт в разработке собственных контроллеров. Приятно смотреть на результат своего труда, особенно когда он такой, как ты хотел. А в качестве подведения итога я и решил написать эту статью. Может и вам покажутся интересными какие-то подходы, которые я использовал. Многое я изложил чисто описательно, без технических подробностей, поскольку интересными мне показались именно архитектурные решения, а не детали реализации. А что дальше? Дальше новые идеи, проекты, разработки... Кто знает, какими они будут? Время покажет...