Привет, меня зовут Евгений Кузнецов, я много лет работаю в сфере автоматизации предприятий. В качестве хобби занимаюсь поделками в сфере электроники для «малой автоматизации» дома.
Сегодня хочу описать одно из устройств такой автоматизации – счетчик литража для фильтра питьевой воды.
Не секрет, что картриджи для систем отчистки воды, мягко говоря, совсем не дешевые «расходники». К тому же рассчитать, когда настал тот самый момент замены картриджа, обычно определяется примерно. Например, в инструкции сказано, что замену надо производить через 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 раз фильтры – постоянный писк после использования фильтром начал мерзеть, и пришлось идти и устанавливать новые фильтры почти вовремя, причем при точном учете количества израсходованной воды)






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


В ходе «промышленной эксплуатации» всплыли необходимые доделки на будущее:
- Батарейное питание используется в случае выпадения питания, т.к. заново устанавливать дату и время, после отключения питания, не самый лучший вариант. 
- Считать не литры, а миллилитры, для большей наглядности 
- Вместо машины состояний использовать ОСРВ (это с точки зрения современного подхода) 
- Возможно использовать микроконтроллер с бОльшим количеством выводов, например, 20, чтобы можно было подключить RTC с помощью цифрового кварца, для больше точности часов. Или использовать внешнюю микросхему для часов. 
- Вывести светодиод (т.к. питание сетевое, то потребление не так важно) который будет сигнализировать (мигать) что происходит учет проходящей воды или же включать экран во время потребления воды. 
- 10000 литров — это минимальное значение из 3х картриджей, 1 из картриджей имеет больший ресурс – 15000 литров, возможно усложнить учет и вести учет по каждому картриджу отдельно. 
Исходный код, файлы схемы (печатной платы) и проект корпуса для Компас3D на github
Используемые библиотеки:
PCF8574T использование для кнопок и пищалки
LCD1602 – библиотека переделанная с Arduino
EEPROM – стандартная библиотека ST, которую можно найти в ресурсах CubeMX
Спасибо за внимание.
Комментарии (39)
 - nUser12317.03.2022 22:06+5- Думаю, что нет большого смысла менять картриджи каждые условные N литров, гораздо полезнее оценивать состояние самих картриджей, либо состояние воды на выходе. Бывает, пройдет три месяца, посмотришь картриджи и вроде ничего. А вот прошлым летом два раза пришлось менять.  - Ivanii17.03.2022 23:50- У меня первый комплект прожил 5 - 7 лет до появления накипи. - Но TDS нужен емкостной или индуктивный иначе вода будет с продуктами электролиза на выходе. - Наверно можно как альтернатива pH измерять если из крана жесткая вода.  - Iv3818.03.2022 03:27- Нет особой необходимости контролировать TDS прямо непрерывно. Я сейчас мониторю TDS вручную, делая измерения раз в месяц. Планирую это дело автоматизировать и передавать данные в Home Assistant. Если даже измерение будет раз в сутки или раз в час, оно очень кратковременное и вряд ли способно оказать сколь либо заметное влияние на качество воды, в остальное время датчик будет обесточен. 
  - bigfoot_tmn19.03.2022 11:24- 771,59 руб. 5%СКИДКА | Датчик проводимости воды TDS, датчик для обнаружения жидкости Arduino, модуль контроля качества воды, онлайн-Монитор TDS «сделай сам» 
 a.aliexpress.com/_AszZTV
 
  - d2ab17.03.2022 23:58+1- Да, количество литров не показатель, все сильно зависит от воды. До замены труб подводящих холодную воду в нашем квартале, входной фильтр полностью забивался через несколько месяцев, сейчас за несколько лет фильтр по-прежнему чистый. 
  - koresh_spb18.03.2022 16:57- По-моему если подобрать "датчик/реле перепада давления" можно гораздо точнее оценивать состояние картриджа при постоянном внешнем давлении и открытом на полную каком-то кране. Может быть к "внешнему давлению" и "расходу воды/ сек" (открытость кранов) можно привязаться для выбора времени измерения падения давления для автоматизации процесса? А общий расход воды в этом случае только дополнит картину об изменении качества воды в течении года. В городских условиях качество воды может быть стабильным, а в загородном доме в зависимости от колодца/скважины, времени года и обилия осадков картина может меняться довольно сильно. - Получается измерения перепада давления осложняется: - в городе: перепадом внешнего давления от нагрузки на линию, 
- за городом: фильтры до насоса оцениваются при наборе воды и после насоса в диапазоне работы насосной станции (3-4 атм). 
- + "открытость кранов" в обоих случаях. 
  - nUser12318.03.2022 18:02- Наиболее надежный и простой способ, мне кажется - это прозрачная колба. Но если делать ради процесса делания - то можно мерять и разницу давлений до и после картриджей, или даже расход электромагнитным расходомером. Но без умного дома смыла наверное нет особого. Вообще ожидал от статьи что-нибудь по обработке сигналов. Ни в коем случае не осуждаю, просто мои ожидания. 
 
 
 - j_aleks18.03.2022 02:58+1- В принципе можно просчитать "забитость" фильтра по связке давление+расход, но это с учетом открытия расходного крана на полную, а это обычно так и есть...  - dm_deko18.03.2022 10:41- для фильтра механической очистки наверное правильней мерять соотношение давления на вхоже к давлению на выходе в каком-то ежесуточном округлении, чтобы нивелировать уровни открытия кранов. 
 
 - steanlab18.03.2022 03:25- Спасибо за статью. Делал похожее устройство пару лет назад для нужд своей лаборатории (я адсорбционщик, нужно было проверять изменение состояния сорбента после N литров воды). Правда так как STM32 не люблю и не знаю, то лепил все на Arduino Uno + шилд с экраном и кнопками. Скетч брал первый попавшийся из интернета, модифицировал под свои нужды. Т.к. тест проводился на фильтрах-кувшинах то стенды модифицировались еще и датчиками уровня, т.е. когда вся вода из кувшина вытекала — автоматические клапаны открывались и подливали воду из буферного аккумулятора-накопителя (чтобы избежать гидроудара). Расходомер считал выход воды после кувшина. В целом работало нормально, все считало. Свою задачу выполнило, обошлось в порядка 10-15$ (вместе с кувшинами). 
 - soul32bit18.03.2022 09:59+2- Извините, а поставить обычный механический водомер уже не модно? Как по мне — жуткий оверинженеринг.  - kvazimoda2418.03.2022 10:25- Попробуй ещё найди водомер, который будет адекватно считать такой маленький поток. Те, что ставят в квартиры для учёта потребления, большинство либо вообще не чует поток от фильтра, либо считает сильно меньше реального расхода. - Плюс, человеку нужна была раздражающая напоминалка. 
  - Anti-antivakser18.03.2022 11:03- Реально) мужик конечно молодец так заморочиться, но не легче ли было купить обычный механический счётчик с винтиком который вращается в потоке воды и передаёт усилие на простейший мех. счётчик?)  - eugene_vk Автор18.03.2022 11:06- Цель была как раз напоминать противным писком, что "пойди и замени". Считать воду можно много чем. Даже ставил фильтр-монитор от Корейцев HM Digital FM-2, да лампочка меняет цвет. Но этой лампочки как нет) 
 
 
 - gvtret18.03.2022 11:06- У данного датчика не линейная характеристика, как пишут в даташите. Где-то на просторах находил формулу пересчета, когда делал систему проточной фильтрации для аквариума. Но уже потерял...  - eugene_vk Автор18.03.2022 11:08- Да, нелинейность, кстати приемлемая. Отклонение от скорости потока не превышает 50мл на литр при дельте 0.1-0.3 л/мин, чего вполне достаточно. В среднем ошибка на 10 тыс. литров - 100 литров, на мой взгляд, не критична.  - gvtret18.03.2022 12:31- Ну для больших объемов может и приемлема. Но 100 литров это 100 ЛИТРОВ. Почти 10 полных накопительных баков. 33 раза макарошки сварить)) 
 
 
 - andrey_ssh18.03.2022 11:36- Это клепсидра (водяные часы). Очень сложная микропроцессорная клепсидра, с годовым интервалом. - Автоматика это устройство построенная по схеме: ВХОДНЫЕ ДАННЫЕ -> ОБРАБОТКА -> УПРАВЛЯЮЩЕЕ ВОЗДЕЙСТВИЕ. Здесь нет входных данных - целевой параметр не измеряется.  - iig18.03.2022 12:00+2- Очень сложная микропроцессорная клепсидра, с годовым интервалом. - ++++ ;) - Я эту задачу решаю с помощью бумажки с 2 датами: дата замены и дата предполагаемой замены. Бумажка клеится на корпус фильтра. +- пара недель ошибки особой роли не играет. Хотя, конечно, можно добавить хайтека и внести эти даты в гуглокалендарь. 
  - vvzvlad18.03.2022 18:34- Входные данные — RTC и поток. Управляющее воздействие — писк. Внутри происходит обработка — не просто считается поток, а еще и записывается расход.  - andrey_ssh20.03.2022 13:42- Какое отношение поток и часы имеют к ресурсу фильтра? - Автор сделал машину голдберга - очень сложное устройство, выполняющее очень простое действие.  - vvzvlad20.03.2022 18:46- О, вы из тех людей, что считают, что наилучшее решение каждой задачи — наименее сложное и как можно меньше оверинжиниринговое? Типа, зачем брать МК, если подойдет 555 или логика, зачем RTOS, если можно на суперцикле? 
 С чего вы решили, что можете судить за автора, какой уровень сложности будет соразмерен его задаче? Это имеет значение только в контексте продажи или воспроизводства таких систем.
 
 
 
 - ABATAPA19.03.2022 09:21- Есть счётчики (в том числе DIY) импульсов, которые могут интегрироваться в "умный дом", это гибче и удобнее. Есть (были) готовые устройства. Сам сделал на ESP с интеграцией в "умный дом", совместив с функционалом учёта показаний счётчиков (известной компании на V с импульсным выходом) и контроля протечек (в дополнение к беспроводным контролируется датчиками на трубах и фильтре). 
 - nickolas05919.03.2022 20:44+1- Мне кажется, имеет смысл проверять давление до и после фильтров. Как делают на производстве. Обычно на новом комплекте фильтровальных картриджей перепад 0.1-0.2 кг, а при достижении 1-2 кг, можно смотреть на удобство пользования водой, надо менять. Но это касается фильтрования от частиц. Для всего остального надо мерить pH, много чего ещё. 
 
           
 


nikkadim
все-таки спрошу - а вы уверены что этот датчик потока Food Grade или для питьевой воды?
gaba_m
А какая разница. Скоро ни датчиков, ни стм, ни фильтров.
nikkadim
ну датчик-то лежит на ali
Jury_78
Есть такие можно и визуально контролировать :), но наверно дороже пластмассового.
nikkadim
YF-S402B = 796,61 руб (Ali@2022-03-17)
пластик не значит плохо, пластиков много, просто для питьевой воды я бы не поставил не "food grade", даже перед фильтром обратного осмоса
13werwolf13
а можно чуть подробнее почему? ладно если речь идёт про обычные фильтры грязной отчистки, но если стоит осмотический то чому бы и да?
nikkadim
для ОС, хотя бы потому что вы срок службы мембраны уменьшаете т.о., не говоря о том что высоко очищенная вода в принципе "ничегохорошего"
bigfoot_tmn
Перед фильтром от будет учитывать и воду которая в слив уходит.
sBager
так его можно установить до фильтров и не задумываться об этом.
nikkadim
если дистиллированная вода это новый трэнд, тогда да