Всем привет!
Наконец-то завершилась моя маленькая эпопея с изготовлением блока уровня и температуры воды в баке. Проведены испытания и теперь мне есть что Вам сказать на этот счет.

Сразу скажу, что проект довольно сырой и требует доработки в каких-то моментах. Но все упирается в мои возможности, знания и умения. Быть может, помощь сведущих мне поможет. Приветствую комментарии и замечания.
Пишу максимально подробно для тех, кто захотел бы как-то его повторить.
Итак, вступление.
Думаю, не сильно редкая проблема на даче, когда есть где-то бак с водой, но непонятно сколько в нем воды осталось (что очень важно, например, когда есть ТЭН и нежелательна его работа в воздухе), либо когда воды набралось уже чрезмерно (напр. когда заполняешь бак).
Пока у нас был бак в душевой в даче прямо над головой, это не было особой проблемой, т.к. можно было залезть в бак рукой и пощупать (бак прямоугольной формы, высотой всего в 20 см).
Но с прошлого года мы его переместили на чердак в баню и пощупать воду уже стало невозможно. К баку подведены выводы с теплообменника на печке, встроен электрический ТЭН для помощи печке при необходимости, ну и его налив осуществляется просто открытием крана на трубе в помещении моечной.
Соответственно, самым важным было понимать какой уровень воды сейчас в баке, ибо незнание этого грозит перегоранием ТЭНа и (или) переливом воды из бака.
Последняя проблема была решена прямо при установке бака по совету строителей, кто его туда ставил. Под самый верх стенки был врезан вывод и с него через пространство между крышей и стенкой была выведена труба на улицу. Полилась из этой трубы вода — вырубай кран! — все довольно просто и понятно.
Но все же хотелось чего-то большего, руки чесались сделать что-то эдакое. Но непонятно что и как. Особых идей не было.
Но вот прошлой зимой я как-то наткнулся на ардуино. Побаловался с ней. Попрограммировал немного. Попытался сделать какие-то простенькие устройства и так вышел на идею в целом реализации таких задач через микроэлектронику.
Первое, что я сделал, это полез в интернет с запросом типа "уровень воды в баке" и так далее. Находил примеры реализации просто на радиодеталях без каких-либо микроконтроллеров и программирования.
В принципе, меня эти примеры устраивали. Заморачиваться с программированием не хотелось. Хотелось сделать что-то простое и надежное как топор. Поэтому-то я на ардуину сразу и не заглядывался.
Так, я уже начинал понемногу закупать детальки, смотреть как делают печатные платы и так далее. Но чем дольше я копался и искал, тем больший функционал "нарастал" на моем будущем устройстве. И в один момент мои требования уперлись в мои возможности. А точнее, в умение что-либо делать такое самостоятельно.
Ведь я особо не соображаю в микроэлектронике. Я могу повторить что-то, что кто-то придумал без меня. Но вот самому додуматься припаять еще сверху конденсатор или что-то такое, чтобы исправить какой-то косяк, я не могу. Или, во всяком случае, сделаю это неверно.
Наконец, на том этапе, когда я уже захотел прикрутить датчик температуры в бак, чтобы понимать, когда вода будет уже "готова", я все же пришел к выводу о необходимости устраивать все именно на ардуине.
Разница в устройстве с ардуиной и без нее заключалась в том, что некоторые задачи можно было бы решать уже известным мне способом — через программирование.
Ну а теперь про самое то.
Задачи придуманного мной устройства сводились к следующему:
1. Отслеживать уровень воды в баке и как-то сигнализировать об этом;
2. Отслеживать температуру воды в баке и сообщать об этом;
3. Программно отслеживать различные состояния воды и сообщать об этом.
По первой задаче.
Отслеживать воду я решил через усмотренный в интернете способ:
опускаем в бак на разный уровень воды по проводу (или чему-то электропроводящему) — "датчику";
также опускаем один общий контакт, на который подаем постоянно "+".
Как только вода замыкает "+" и провод определенного уровня, ардуина понимает, что вода достигла этого уровня. Всего мною было задумано уровней на 10, 25, 50, 75 и 100 % воды.
Индикация состояния уровней была придумана через светодиоды. Причем через RGB светодиоды. Т.к. по моей изначальной задумке, они позволяли более широко реализовать различные схемы индикации разных состояний.
По второй задаче
Здесь все просто. Был куплен датчик температуры на Али. Для показа температуры также был куплен 4-х разрядный мониторчик. Соответственно ардуино снимает показания с датчика и выдает их на мониторчик постоянно.
По третьей задаче
Все упирается в возможности программирования. По факту, потратил больше месяца, чтобы написать хоть что-то.
Так, мною были придуманы такие алгоритмы, как отслеживание и сигнализация о том, что:
Вода нагревается и нагрелась до нужного уровня;
Вода набирается и набралась до 100%;
Вода закончилась.
Но работают они не очень хорошо. Крайний раз вообще пришлось их отключить до лучших времен :) Но об этом ниже.
Делаем устройство.
Я закупил следующее (постарался вспомнить все, что покупал):
1. Собственно, ардуино нано;
2. Пассивный пьезоизлучатель;
3. Цифровой датчик температуры DS18B20;
4. Мониторчик;
5. Клеммники для провода на плату 2 штучки;
6. Пачку RGB светодиодов (понадобилось 5 штук);
7. Микро понижающий модуль питания;
8. Кнопка с фиксацией, встраиваемая в корпус;
9. Кабель витая пара до бака;
10. Телефонный кабель для питания устройства;
11. Блок питания 12v на дин рейку (Артикул: HDR-15-12);
12. Резисторы:
10кОм — 13 штук (подключил ножки светодиодов через них, а также "датчики уровня на землю");
4,7 кОм — 1 шт для датчика температуры;
220 Ом — 1 шт для желтого (сервисного) светодиода;
13. Переменный резистор (крутилка) 10 кОм;
14. Всякое для подключения витой пары D-SUB:
Разъем на плату;
Разъемы и вилки на кабель 3 штуки (с другой стороны поставил такой разъем на корпус). Соответственно выбирал, чтобы сошлись "мамы" с "папами".
15. Всякое для обеспечения питания типа штекера на провод "L-KLS1-DCP-02-2.1A" и разъем для него на плату "DS-201, Гнездо питания 2,1х5,5на плату";
16. Корпус "G311C, Корпус для РЭА 115х90х55 мм" подбирался так, чтобы туда влезла печатная плата 75х100 мм (немного подпиленная).
17. 6 велосипедных спиц из нержавейки;
18. Небольшой корпус на бак, где сделана разводка кабелей на датчики;
19. Также использовал вот такой (где 3 провода) разъем на этом же корпусе для подключения датчика температуры.
20. Всякое разное не счесть. Типа стойки для платы, болтики, гаечки и т.д.
Итак, пара слов по изготовлению.
Делать я решил сразу качественно в меру своих сил. Поэтому решил изготовить печатную плату, все контакты делать на разъемах.
Принципиально схема такая.

Ставим на ДИН рейку в щито блок питания на 12v. В принципе, можно было бы решить задачу питания и просто через розетку + блок питания от какого-нибудь телефона. Здесь тогда даже не понадобился бы понижающий блок питания на плату, а ардуину можно было бы питать через USB разъем. Но мне проще было кинуть телефонный кабель, плюс, изначально я планировал ставить блок в моечную, куда лишние 220v вести не хотелось. Кроме того, те самые 12v я смогу использовать и для других проектов. Пока в задумке у меня что-то типа пожарной сигнализации на ардуине.
В блок приходит провод с 12v и заходит в микро блок, понижающий их до 7v. Между входом и микро блоком сделан разрыв кнопкой для возможности выключения с кнопочки.
Дальше 7v идут на ардуину.

От ардуины идет разводка соответственно на:
1. "Датчики" — спицы к D-SUB разъему. Все "датчики" подтянуты 10кОм резисторами к "-";
2. RGB светодиоды. Но первые 3 к "красным" и "зеленым" ножкам. Еще два только к зеленым (т.к. пинов не хватило). Все пины также через 10кОм резисторы;
3. Плюс и минус также к D-SUB разъему для датчиков. Также отдельный пин к D-SUB разъему для датчика температуры. К этому же пину также подтянут "+" через 4,7кОм резистор;
5. Пин, плюс и минус к пищалке;
6. Два пина, плюс и минус к экранчику;
7. Пин, плюс и минус к переменному резистору;
8. Пин (через 220Ом резистор) и минус к желтому светодиоду.
Непосредственно на баке, а точнее в его крышке:

Просверлено 6 дырок, в которые вставлены резиночки, купленные в автомагазине (какие-то резинки от дворников ВАЗА). В резиночки вставлены спицы и залиты силиконом термостойким. Все спицы порезаны на разную высоту.

На все это посажена коробочка с "ушками", которая фиксируется к крышке болтиками. Основные провода в нее заходят через D-SUB разъем. Затем разводятся на датчик температуры и датчики уровня воды. На датчик температуры провода выходят через другой отдельный разъем.

Сам датчик температуры врезан в бак примерно на высоте 30 % от дна. К датчику потребовалось еще докупить контргайку на 1/2 (в леруа), фторопластовую прокладку и фум-ленту. Дырку сверлил специальной коронкой на 20мм (если не ошибаюсь).
Пара слов о выборе коробки для основного блока.
Изначально планировал использовать любую рандомную коробку, в корпусе которой хотел вырезать дырки для светодиодов и экранчика. Но, зная откуда у меня растут руки, я был на 146% уверен, что дырки вырезал бы криво. Поэтому в процессе изготовления родилась идея использовать блок с прозрачной крышкой. Таким образом, мне не пришлось мудрить с вырезанием дырок. Разве что экранчик я поставил на "Ножки" — стойки для платы, чтобы был повыше.
Разное
Изначально хотел реализовать весь функционал RGB светодиодов. Думал, что если будут гореть одновременно зеленый и красный диоды, то на выходе получу желтый. В итоге получил одновременно горящие внутри корпуса одного светодиода красный и зеленый огоньки )) Ни намека на желтый.
Кроме того, как писал выше, мне не хватило пинов для подключения всех ножек светодиодов. Я не смог побороть пины 0 и 1 (RX TX) и поэтому вынужден был подключать на последних двух светодиодах только 2 зеленые ножки.
Зачем тут нужен переменный резистор?
Учитывая, что вода не является супер-стабильным проводником электричества, ожидалось, что уровень сигнала будет меняться в зависимости от разных факторов. Примесей в воде и т.д. Поэтому датчики все были подключены к аналоговым входам (чтобы отлавливать весь диапазон возможного сигнала от 0 до 1023), а также в схему включен переменный резистор, с помощью которого можно было бы настроить чувствительность блока. Программно было установлено, что "вода есть" тогда, когда сигнал, получаемый датчиком, превышает какое-то значение. Вот это самое значение ("порог срабатывания") как раз и зависело от положения ручки переменного резистора.
На практике как это работает. Вот стоит у вас порог, допустим "500". Вы налили воду. Все ОК. Уровень сигнала сильный и стабильный. Но потом вода отстоялась. На датчики налип какой-то осадок. Тогда уровень сигнала падает и ардуино считает, что воды нет. Тогда вы подкручиваете крутилкой уровень, допустим, 400. И все снова работает.
Почему бы сразу не задать уровень, скажем, 100? Потому что, чем меньше порог срабатывания, тем больше шанс словить наводки и помехи и ловить ложные срабатывания. Т.е. нужно как-то обеспечивать золотую середину в этом всем.
Ну а теперь немного об алгоритмах работы и программировании.
Как же все это программно работает. Опишу просто кратко логику процесса.
По уровню воды.
Итак, к нашей ардуине подведено 5 контактов от разных датчиков. Каждому контакту присвоен свой уровень воды. Также, как описано выше, установлен некий порог срабатывания, при превышении сигналом которого, ардуина считает, что вода достигла соответствующего уровня.
Когда сигналов нет вообще, ардуина зажигает 3 красных светодиода (все имеющиеся).
Когда есть 10%, то горит только самый нижний красным цветом.
Когда есть уже 25%, то горят 2 нижних зеленым.
Когда есть 50%, то три нижних зеленым и так далее.
На этом основной алгоритм собственно закончен.
Также мною была сделана попытка прикрутить некоторые программные фишки.
Например, есть сигнал с датчика 25%, затем он пропадает и остается 10%, затем пропадает и он.
Это означает, что вода была, но вся утекла.
Значит, можно об этом пропищать звуком что-то типа мелодии. Один раз. В следующий раз пищать такое только, если вода опять набралась до 25% и снова опустилась.
Аналогично все тоже самое и с перенабором воды. Но в обратном порядке.
Также, я вот только сейчас подумал, я бы сюда еще прикрутил дополнительный провод, снимающий наличие/отсутствие напряжения на проводе ТЭНа. Если уровень воды меньше положенного (ТЭН не закрыт водой), то при наличии напряжения на проводе, пищать что есть силы. Типа защита от дурака.
По температуре.
Здесь все довольно просто. Ардуина все время считывает показания температуры с датчика и выдает их на мониторчик.
Также сюда прикручен алгоритм отслеживания нагрева. Если последовательно температура была в пределах от 30 до 40, затем от 40 до 50, а затем 95 градусов, то значит вода "нагрелась" до нужной кондикции и можно также об этом пропищать.
Сервисный режим.
Здесь есть только один сервисный режим — это режим настройки порога уровня срабатывания датчиков.
Работает так. Как только крутилкой мы повысили уровень порога, а затем понизили, то устройство заходит в "Режим настройки уровня срабатывания датчиков" на 10 секунд и вместо температуры показывает уровень того самого порога срабатывания. Соответственно, крутите крутилку — видите какой порог задаете.
На этом все.

На а теперь о практической реализации и испытаниях.
Для того, чтобы привести устройство в более-менее рабочий режим мне потребовалось 1 раз полностью перепаять его с переделкой платы, а также более 2 месяцев программирования.
Однако и сейчас я не решил кое-какие проблемы. Их решение упирается в мои знания (а точнее их отсутствие). Возможно, дают о себе знать какие-то косяки, о которых не знаю до сих пор.
Основной косяк, вылезающий из особенностей реализации именно описанной схемы датчиков — это ложное срабатывание/несрабатывание датчиков.
Так, частенько по работе устройства (миганию диодов) вижу, что датчики ловят какие-то наводки. Не так, чтобы все датчики моргали как гирлянда на елке, но иногда происходят ложные срабатывания. То ли пар это, то ли хз что. Так то притягивание резисторами на 10кОм к "-" было как раз и призвано бороться с этим, но что-то не особо это помогает.
Именно эти наводки и делают невозможной работу программных режимов, т.к. они сбивают все флаги и устройство не способно реально понять текущее состояние дела. Так, крайний раз оно с периодичностью раз в 10 минут все время мне орало про окончание воды, хотя должно было проорать только 1 раз (это было из-за срабатывания 10 и 25 % датчиков одновременно) до следующего ее реального набора и слива. Поэтому пришлось все это отключить до лучших времен))
Как это точно забороть, пока не знаю. В коде были заданы алгоритмы расчета среднего показателя уровня сигнала (10 раз считывает показание датчика и выбирает из них среднее значение), но если это и помогает, то не сильно. Возможно, стоит там покопаться и увеличить время или количество считываний для расчета этого среднего показателя. Также, надо, наверное, постараться переделать алгоритмы, учитывая именно такие "помехи".
Относительно потери чувствительности также есть что сказать. Я даже было подумал, что придется сразу все выкидывать.
Так, установил я спицы в бак 2 недели назад. Через неделю после переделки я привез блок, вставил его и обнаружил отсутствие сигнала вообще.
Поднялся к баку с мультиметром и обнаружил две вещи:
спицы обросли каким-то налетом типа извести (как дно чайника) и с трудом прозванивались. Пришлось их чуть-чуть пошкурить от налета;
внезапно вода у поверхности также не прозванивалась. Видимо, отстоялась, и реально опускание щупов в воду даже рядом друг с другом ничего не давало.
После того, как пошкурил контакты и перемешал воду, все заработало.
На этом моменте я уже думал, что все. Работа устройства накрылась медным тазом. Ведь не будешь же каждую неделю лазить и шкурить эти спицы.
Однако, внезапно, еще через неделю устройство продолжило работать и показывать уровень воды. Без шкурки. Посмотрим дальше сколько продержится оно :)
Если же проблема все же станет актуальной, придется что-то придумывать другое. Например, реализовать отслеживание уровня через поплавковые датчики на герконах.
Температура показывается стабильно, но за некоторым исключением. Почему-то через пару часов работы устройства температура как бы зависает на одном месте. Помогает перезагрузка устройства. Возможно, где-то переполняется переменная или что-то такое. Думаю, вопрос программный и поэтому решаемый.
В общем, устройство худо-бедно работает, но его надо еще допиливать конечно. Прилагаю ссылки на схему разводки по плате для программы Sprint Layout и скетч с кодом так как есть.


Комментарии 5
Вот такое устройство работает без проблем с водой разнообразной жёсткости и рН-фактора.
Блин вот это ты заморочился!))
Когда-то делал датчики уровня на эффекте теплопроводности. На металлическом (как обладающем хорошей теплопроводностью) основании крепится нареватель (не мощный, главное чтобы нагрел основание выше окружающей среды. Для Вас — более 100°С) и датчик температуры. Пока конструкция в воде, датчик покажет температуру среды (все лишнее вода снимет). Как только он оголится, датчик температуры покажет температуру нагревателя…
Да, датчик работает как пороговый (есть/нет воды). В принципе, алгоритмом можно измерять +- около датчика.
Интересная идея! Но, наверное, требует подгонки и точной настройки по месту. Плюс, у меня вот бак низкий. Всего 20 см. А "рабочей" зоны и того около 15 см. Насколько тогда, в таком случае, близко можно располагать датчики и нагревательные элементы? Наверное, как минимум, можно реализовать пороги — нет воды, есть вода сколько-то, есть вода 100%. В принципе, именно так работают вроде как герконовые поплавочные. Типа таких ru.aliexpress.com/item/Si…o&ws_ab_test=searchweb0_0, searchweb201602_2_10152_10065_10151_10344_10068_10342_10343_10340_10059_10341_10696_100031_10084_10083_10103_524_10618_10624_10307_10623_10622_10301_10621_10620, searchweb201603_31, ppcSwitch_2&algo_expid=85e9cd89-3607-4b7a-8e97-d582ea5dfbd1-1&algo_pvid=85e9cd89-3607-4b7a-8e97-d582ea5dfbd1&priceBeautifyAB=0
Еще есть идея реализовывать через ультразвуковой датчик (который расстояние меряет типа как от парктроника). Повесить его на крышку и пускай себе меряет расстояние от поверхности воды до датчика (если она, конечно, отражает сигнал :)). Но меня вот гложат сомнения насчет надежности его и долговечности. Тем более в очень влажной и теплой среде.
Я располагал датчик и нагреватель с разных сторон пластинки. Диапазон срабатывания около 5-10мм (как отладить алгоритм). Если бак не металл, можно поплавковый-индуктивный (наружный) попробовать. Если металл, то можно внутрь встроить, только катушки герметизировать.Ультразвуковой уравнемер есть промышленный. На работе стоит на баке с радиоактивной средой — работает уже много лет.
Вообще-то 20 см не такой и большой диапазон изменения, может проще будет поплавковый-резистивный (как в бензобаке) пристроить.