Привет, меня зовут Евгений Кузнецов, я много лет работаю в сфере автоматизации предприятий. В качестве хобби занимаюсь поделками в сфере электроники для «малой автоматизации» дома. 

Сегодня хочу описать одно из устройств такой автоматизации – счетчик литража для фильтра питьевой воды.

Не секрет, что картриджи для систем отчистки воды, мягко говоря, совсем не дешевые «расходники». К тому же рассчитать, когда настал тот самый момент замены картриджа, обычно определяется примерно. Например, в инструкции сказано, что замену надо производить через 10000 литров расхода. Когда заканчиваются это количество, сказать весьма и весьма затруднительно. Поэтому, менял картриджи 1 раз в год, полагая что в год очень примерно, я столько трачу. Но эта замена производилась не день в день, а всегда откладывается на потом, пока качество отфильтрованной воды и напор не станут отвратительными.

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

Получилось следующее техническое задание:

  • Получить количество расхода воды.

  • Сигнализировать о наступлении предельного расхода воды. После каждого использования фильтров, после наступления предела расхода напоминать о необходимости замены фильтров (например, издавать звуковой сигнал после каждого использования фильтров после наступления предела).

  • Хранить журнал расхода воды по датам (для дальнейшего анализа).

  • Размер устройства должен быть относительно миниатюрным.

В качестве счетчика воды был выбран датчик потока YF-S402B.

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

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

Для решения задачи необходимо подключить:

  • Дисплей. В качестве дисплея был выбран LCD 1602 дисплей.

  • Постоянная память для хранения настроек и журнала. В качестве такой памяти была выбрана EEPROM память на 1Мбит AT24CM01.

Конечно, всего 8 ног контроллера создавало некоторые проблемы по коммуникациям. Для меню требуется 4 кнопки, которые тоже надо куда-то подключить. Также, необходимо подключить пищалку. Можно было использовать макетную плату bluepill, но габариты устройства сразу же увеличиваются.

Т.к. из 8 выводов контроллера 2 используются для питания, 2 для программирования, 1 для сигнала RST, то для реализации остаются только 2 ноги.

Решил, что буду использовать шину I2C для коммуникации памяти, дисплея и кнопок. Последние подключаются через 2 расширителя портов PCF8574T, для которого в сети интернет можно найти множество схем подключения дисплея. Для подключения дисплея использовал схему проверенной платы подключения дисплея 1602 через I2C:

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

В итоге была получена следующая конфигурация выводов микроконтроллера:

TIM1_ETR используется для входа импульсов с датчика потока.

Разработал схему, сформировал печатную плату:

Датчик, дисплей питается от 5 Вольт, а микроконтроллер, память от 3.3 Вольт, поэтому в схеме предусмотрел два линейных преобразователя AMS1117 для питания разных частей схемы. Общее питание схемы 7-9V. Так как все входы микроконтроллера толерантны к 5V, то импульсы с датчика подаются на вход ETR как есть.

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

Заказал платы и распаял.

Разработал корпус, распечатал, доработал напильником)

В первой версии платы использовал подключение кнопок через триггер Шмита, в дальнейшем пришлось от него отказаться, т.к. он нарушал логику работы прерывания от внешних кнопок… невнимательно читал datasheet  на расширитель портов(

Также устранил «косяк» с подтяжкой вывода прерывания и его «буферизацией» через конденсатор. В итоге прерывание на микроконтроллер заработало как надо.

Разработка программной части

Программная часть выполнялась в CubeIDE 1.7. В качестве программатора использовался ST-LINK V2 с AliExpress.

Для расчета количества расчета жидкости использовал 2 таймера:

  • TIM3 используется для генерирования прерывания каждую секунду

  • TIM1 используется для счета импульсов поступающих на ножку ETR2 микроконтроллера с датчика потока воды

Логика работы таймеров:

  • Каждую секунду происходит прерывание

  • В прерывании таймера отсчета секунд производится считывание текущего количества импульсов

  • Импульсы пересчитываются в литры, согласно настройке пересчета:

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

Общий алгоритм работы приложения построен на «машине состояний»:

Этап запуска:

  • Настройка таймеров TIM1 и TIM3 для обработки потребления

  • Настройка прерывания по внешнему событию

  • Настройка встроенного RTC для формирования записей журнала потребления

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

  • Настройка шины I2C и периферии на ней (память, расширители портов)

  • Чтение настроек. Проверка, что настройки заданы. В структуре настроек содержится ключ, по которому убеждаемся, что настройки были заданы:

Если настройки не были заданы, то формируем их:

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

Рабочий цикл:

  • Расчет потребление воды (прерывание от TIM3 каждую секунду)

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

Интерфейс взаимодействия сделал с помощью библиотеки «micromenu»:

SET_ALARM – установка предельного количество литров до замены фильтра.

SET L/PLS – установка количества импульсов на литр

CALIBRATE L/PLS – тоже установка количества импульсов на литр, но в полуавтоматическом режиме.  После запуска данного режима, в мерную емкость набирается 1 литр воды – при этом устройство считает количество импульсов. При нажатии кнопки «ОК» количество импульсов на 1 литр запоминается в настройках.

NEW FILTER RST, в отличии от FULL RESET, не очищает журнал и настройки, а только обнуляет текущее количество потребления и формирует запись в журнале активную запись в количеством потребления 0 литров.

Основной интерфейс имеет 3 idle-экрана:

  1. На первом отображается текущее общее потребление на комплекте картриджей

  1. Экран с последним потреблением и остатком на комплект картриджей

  1. И экран с данными часов реального времени:

Итог

В результате получилось довольно удобное устройство. Уже поменял 1 раз фильтры – постоянный писк после использования фильтром начал мерзеть, и пришлось идти и устанавливать новые фильтры почти вовремя, причем при точном учете количества израсходованной воды)

Просмотр журнала:

В ходе «промышленной эксплуатации» всплыли необходимые доделки на будущее:

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

  • Считать не литры, а миллилитры, для большей наглядности

  • Вместо машины состояний использовать ОСРВ (это с точки зрения современного подхода)

  • Возможно использовать микроконтроллер с бОльшим количеством выводов, например, 20, чтобы можно было подключить RTC с помощью цифрового кварца, для больше точности часов. Или использовать внешнюю микросхему для часов.

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

  • 10000 литров — это минимальное значение из 3х картриджей, 1 из картриджей имеет больший ресурс – 15000 литров, возможно усложнить учет и вести учет по каждому картриджу отдельно.

Исходный код, файлы схемы (печатной платы) и проект корпуса для Компас3D на github

Используемые библиотеки:

Меню (частично)

PCF8574T использование для кнопок и пищалки

LCD1602 – библиотека переделанная с Arduino

EEPROM – стандартная библиотека ST, которую можно найти в ресурсах CubeMX

Спасибо за внимание.

Комментарии (39)


  1. nikkadim
    17.03.2022 21:00
    +1

    все-таки спрошу - а вы уверены что этот датчик потока Food Grade или для питьевой воды?


    1. gaba_m
      17.03.2022 21:19
      +1

      А какая разница. Скоро ни датчиков, ни стм, ни фильтров.


      1. nikkadim
        17.03.2022 21:37
        +3

        ну датчик-то лежит на ali


    1. Jury_78
      17.03.2022 22:12

      Есть такие можно и визуально контролировать :), но наверно дороже пластмассового.


      1. nikkadim
        17.03.2022 22:43

        YF-S402B = 796,61 руб (Ali@2022-03-17)
        пластик не значит плохо, пластиков много, просто для питьевой воды я бы не поставил не "food grade", даже перед фильтром обратного осмоса


        1. 13werwolf13
          18.03.2022 07:36

          а можно чуть подробнее почему? ладно если речь идёт про обычные фильтры грязной отчистки, но если стоит осмотический то чому бы и да?


          1. nikkadim
            18.03.2022 16:15
            -1

            для ОС, хотя бы потому что вы срок службы мембраны уменьшаете т.о., не говоря о том что высоко очищенная вода в принципе "ничегохорошего"


        1. bigfoot_tmn
          19.03.2022 11:18

          Перед фильтром от будет учитывать и воду которая в слив уходит.


    1. sBager
      18.03.2022 18:04

      так его можно установить до фильтров и не задумываться об этом.


      1. nikkadim
        18.03.2022 18:06
        -1

        если дистиллированная вода это новый трэнд, тогда да


  1. nUser123
    17.03.2022 22:06
    +5

    Думаю, что нет большого смысла менять картриджи каждые условные N литров, гораздо полезнее оценивать состояние самих картриджей, либо состояние воды на выходе. Бывает, пройдет три месяца, посмотришь картриджи и вроде ничего. А вот прошлым летом два раза пришлось менять.


    1. nikkadim
      17.03.2022 22:45

      угу, TDS сенсор (два электрода в поток), но тогда это после фильтров


    1. Ivanii
      17.03.2022 23:50

      У меня первый комплект прожил 5 - 7 лет до появления накипи.

      Но TDS нужен емкостной или индуктивный иначе вода будет с продуктами электролиза на выходе.

      Наверно можно как альтернатива pH измерять если из крана жесткая вода.


      1. Iv38
        18.03.2022 03:27

        Нет особой необходимости контролировать TDS прямо непрерывно. Я сейчас мониторю TDS вручную, делая измерения раз в месяц. Планирую это дело автоматизировать и передавать данные в Home Assistant. Если даже измерение будет раз в сутки или раз в час, оно очень кратковременное и вряд ли способно оказать сколь либо заметное влияние на качество воды, в остальное время датчик будет обесточен.


      1. bigfoot_tmn
        19.03.2022 11:24

        771,59 руб. 5%СКИДКА | Датчик проводимости воды TDS, датчик для обнаружения жидкости Arduino, модуль контроля качества воды, онлайн-Монитор TDS «сделай сам»
        a.aliexpress.com/_AszZTV


    1. d2ab
      17.03.2022 23:58
      +1

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


      1. shadson
        18.03.2022 00:19

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


        1. nikkadim
          18.03.2022 16:16

          хорошая идея


    1. koresh_spb
      18.03.2022 16:57

      По-моему если подобрать "датчик/реле перепада давления" можно гораздо точнее оценивать состояние картриджа при постоянном внешнем давлении и открытом на полную каком-то кране. Может быть к "внешнему давлению" и "расходу воды/ сек" (открытость кранов) можно привязаться для выбора времени измерения падения давления для автоматизации процесса? А общий расход воды в этом случае только дополнит картину об изменении качества воды в течении года. В городских условиях качество воды может быть стабильным, а в загородном доме в зависимости от колодца/скважины, времени года и обилия осадков картина может меняться довольно сильно.

      Получается измерения перепада давления осложняется:

      • в городе: перепадом внешнего давления от нагрузки на линию,

      • за городом: фильтры до насоса оцениваются при наборе воды и после насоса в диапазоне работы насосной станции (3-4 атм).

      • + "открытость кранов" в обоих случаях.


      1. nUser123
        18.03.2022 18:02

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


  1. j_aleks
    18.03.2022 02:58
    +1

    В принципе можно просчитать "забитость" фильтра по связке давление+расход, но это с учетом открытия расходного крана на полную, а это обычно так и есть...


    1. dm_deko
      18.03.2022 10:41

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


  1. steanlab
    18.03.2022 03:25

    Спасибо за статью. Делал похожее устройство пару лет назад для нужд своей лаборатории (я адсорбционщик, нужно было проверять изменение состояния сорбента после N литров воды). Правда так как STM32 не люблю и не знаю, то лепил все на Arduino Uno + шилд с экраном и кнопками. Скетч брал первый попавшийся из интернета, модифицировал под свои нужды. Т.к. тест проводился на фильтрах-кувшинах то стенды модифицировались еще и датчиками уровня, т.е. когда вся вода из кувшина вытекала — автоматические клапаны открывались и подливали воду из буферного аккумулятора-накопителя (чтобы избежать гидроудара). Расходомер считал выход воды после кувшина. В целом работало нормально, все считало. Свою задачу выполнило, обошлось в порядка 10-15$ (вместе с кувшинами).


  1. soul32bit
    18.03.2022 09:59
    +2

    Извините, а поставить обычный механический водомер уже не модно? Как по мне — жуткий оверинженеринг.


    1. kvazimoda24
      18.03.2022 10:25

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

      Плюс, человеку нужна была раздражающая напоминалка.


    1. Anti-antivakser
      18.03.2022 11:03

      Реально) мужик конечно молодец так заморочиться, но не легче ли было купить обычный механический счётчик с винтиком который вращается в потоке воды и передаёт усилие на простейший мех. счётчик?)


      1. eugene_vk Автор
        18.03.2022 11:06

        Цель была как раз напоминать противным писком, что "пойди и замени". Считать воду можно много чем. Даже ставил фильтр-монитор от Корейцев HM Digital FM-2, да лампочка меняет цвет. Но этой лампочки как нет)


  1. gvtret
    18.03.2022 11:06

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


    1. eugene_vk Автор
      18.03.2022 11:08

      Да, нелинейность, кстати приемлемая. Отклонение от скорости потока не превышает 50мл на литр при дельте 0.1-0.3 л/мин, чего вполне достаточно. В среднем ошибка на 10 тыс. литров - 100 литров, на мой взгляд, не критична.


      1. gvtret
        18.03.2022 12:31

        Ну для больших объемов может и приемлема. Но 100 литров это 100 ЛИТРОВ. Почти 10 полных накопительных баков. 33 раза макарошки сварить))


  1. andrey_ssh
    18.03.2022 11:36

    Это клепсидра (водяные часы). Очень сложная микропроцессорная клепсидра, с годовым интервалом.

    Автоматика это устройство построенная по схеме: ВХОДНЫЕ ДАННЫЕ -> ОБРАБОТКА -> УПРАВЛЯЮЩЕЕ ВОЗДЕЙСТВИЕ. Здесь нет входных данных - целевой параметр не измеряется.


    1. iig
      18.03.2022 12:00
      +2

      Очень сложная микропроцессорная клепсидра, с годовым интервалом.

      ++++ ;)

      Я эту задачу решаю с помощью бумажки с 2 датами: дата замены и дата предполагаемой замены. Бумажка клеится на корпус фильтра. +- пара недель ошибки особой роли не играет. Хотя, конечно, можно добавить хайтека и внести эти даты в гуглокалендарь.


    1. vvzvlad
      18.03.2022 18:34

      Входные данные — RTC и поток. Управляющее воздействие — писк. Внутри происходит обработка — не просто считается поток, а еще и записывается расход.


      1. andrey_ssh
        20.03.2022 13:42

        Какое отношение поток и часы имеют к ресурсу фильтра?

        Автор сделал машину голдберга - очень сложное устройство, выполняющее очень простое действие.


        1. vvzvlad
          20.03.2022 18:46

          О, вы из тех людей, что считают, что наилучшее решение каждой задачи — наименее сложное и как можно меньше оверинжиниринговое? Типа, зачем брать МК, если подойдет 555 или логика, зачем RTOS, если можно на суперцикле?
          С чего вы решили, что можете судить за автора, какой уровень сложности будет соразмерен его задаче? Это имеет значение только в контексте продажи или воспроизводства таких систем.


  1. radonx201
    18.03.2022 17:45
    +2

    Если стоит ОС, то всё это вот зачем? ) Как перестало течь - так и меняй.


    1. MVN63
      20.03.2022 08:20
      +1

      Поддерживаю. Для систем обратного осмоса этот критерий самый эффективный - затраты нулевые.


  1. ABATAPA
    19.03.2022 09:21

    Есть счётчики (в том числе DIY) импульсов, которые могут интегрироваться в "умный дом", это гибче и удобнее. Есть (были) готовые устройства. Сам сделал на ESP с интеграцией в "умный дом", совместив с функционалом учёта показаний счётчиков (известной компании на V с импульсным выходом) и контроля протечек (в дополнение к беспроводным контролируется датчиками на трубах и фильтре).


  1. nickolas059
    19.03.2022 20:44
    +1

    Мне кажется, имеет смысл проверять давление до и после фильтров. Как делают на производстве. Обычно на новом комплекте фильтровальных картриджей перепад 0.1-0.2 кг, а при достижении 1-2 кг, можно смотреть на удобство пользования водой, надо менять. Но это касается фильтрования от частиц. Для всего остального надо мерить pH, много чего ещё.