Привет, меня зовут Евгений Кузнецов, я много лет работаю в сфере автоматизации предприятий. В качестве хобби занимаюсь поделками в сфере электроники для «малой автоматизации» дома.
Сегодня хочу описать одно из устройств такой автоматизации – счетчик литража для фильтра питьевой воды.
Не секрет, что картриджи для систем отчистки воды, мягко говоря, совсем не дешевые «расходники». К тому же рассчитать, когда настал тот самый момент замены картриджа, обычно определяется примерно. Например, в инструкции сказано, что замену надо производить через 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)
nUser123
17.03.2022 22:06+5Думаю, что нет большого смысла менять картриджи каждые условные N литров, гораздо полезнее оценивать состояние самих картриджей, либо состояние воды на выходе. Бывает, пройдет три месяца, посмотришь картриджи и вроде ничего. А вот прошлым летом два раза пришлось менять.
Ivanii
17.03.2022 23:50У меня первый комплект прожил 5 - 7 лет до появления накипи.
Но TDS нужен емкостной или индуктивный иначе вода будет с продуктами электролиза на выходе.
Наверно можно как альтернатива pH измерять если из крана жесткая вода.
Iv38
18.03.2022 03:27Нет особой необходимости контролировать TDS прямо непрерывно. Я сейчас мониторю TDS вручную, делая измерения раз в месяц. Планирую это дело автоматизировать и передавать данные в Home Assistant. Если даже измерение будет раз в сутки или раз в час, оно очень кратковременное и вряд ли способно оказать сколь либо заметное влияние на качество воды, в остальное время датчик будет обесточен.
bigfoot_tmn
19.03.2022 11:24771,59 руб. 5%СКИДКА | Датчик проводимости воды TDS, датчик для обнаружения жидкости Arduino, модуль контроля качества воды, онлайн-Монитор TDS «сделай сам»
a.aliexpress.com/_AszZTV
d2ab
17.03.2022 23:58+1Да, количество литров не показатель, все сильно зависит от воды. До замены труб подводящих холодную воду в нашем квартале, входной фильтр полностью забивался через несколько месяцев, сейчас за несколько лет фильтр по-прежнему чистый.
koresh_spb
18.03.2022 16:57По-моему если подобрать "датчик/реле перепада давления" можно гораздо точнее оценивать состояние картриджа при постоянном внешнем давлении и открытом на полную каком-то кране. Может быть к "внешнему давлению" и "расходу воды/ сек" (открытость кранов) можно привязаться для выбора времени измерения падения давления для автоматизации процесса? А общий расход воды в этом случае только дополнит картину об изменении качества воды в течении года. В городских условиях качество воды может быть стабильным, а в загородном доме в зависимости от колодца/скважины, времени года и обилия осадков картина может меняться довольно сильно.
Получается измерения перепада давления осложняется:
в городе: перепадом внешнего давления от нагрузки на линию,
за городом: фильтры до насоса оцениваются при наборе воды и после насоса в диапазоне работы насосной станции (3-4 атм).
+ "открытость кранов" в обоих случаях.
nUser123
18.03.2022 18:02Наиболее надежный и простой способ, мне кажется - это прозрачная колба. Но если делать ради процесса делания - то можно мерять и разницу давлений до и после картриджей, или даже расход электромагнитным расходомером. Но без умного дома смыла наверное нет особого. Вообще ожидал от статьи что-нибудь по обработке сигналов. Ни в коем случае не осуждаю, просто мои ожидания.
j_aleks
18.03.2022 02:58+1В принципе можно просчитать "забитость" фильтра по связке давление+расход, но это с учетом открытия расходного крана на полную, а это обычно так и есть...
dm_deko
18.03.2022 10:41для фильтра механической очистки наверное правильней мерять соотношение давления на вхоже к давлению на выходе в каком-то ежесуточном округлении, чтобы нивелировать уровни открытия кранов.
steanlab
18.03.2022 03:25Спасибо за статью. Делал похожее устройство пару лет назад для нужд своей лаборатории (я адсорбционщик, нужно было проверять изменение состояния сорбента после N литров воды). Правда так как STM32 не люблю и не знаю, то лепил все на Arduino Uno + шилд с экраном и кнопками. Скетч брал первый попавшийся из интернета, модифицировал под свои нужды. Т.к. тест проводился на фильтрах-кувшинах то стенды модифицировались еще и датчиками уровня, т.е. когда вся вода из кувшина вытекала — автоматические клапаны открывались и подливали воду из буферного аккумулятора-накопителя (чтобы избежать гидроудара). Расходомер считал выход воды после кувшина. В целом работало нормально, все считало. Свою задачу выполнило, обошлось в порядка 10-15$ (вместе с кувшинами).
soul32bit
18.03.2022 09:59+2Извините, а поставить обычный механический водомер уже не модно? Как по мне — жуткий оверинженеринг.
kvazimoda24
18.03.2022 10:25Попробуй ещё найди водомер, который будет адекватно считать такой маленький поток. Те, что ставят в квартиры для учёта потребления, большинство либо вообще не чует поток от фильтра, либо считает сильно меньше реального расхода.
Плюс, человеку нужна была раздражающая напоминалка.
Anti-antivakser
18.03.2022 11:03Реально) мужик конечно молодец так заморочиться, но не легче ли было купить обычный механический счётчик с винтиком который вращается в потоке воды и передаёт усилие на простейший мех. счётчик?)
eugene_vk Автор
18.03.2022 11:06Цель была как раз напоминать противным писком, что "пойди и замени". Считать воду можно много чем. Даже ставил фильтр-монитор от Корейцев HM Digital FM-2, да лампочка меняет цвет. Но этой лампочки как нет)
gvtret
18.03.2022 11:06У данного датчика не линейная характеристика, как пишут в даташите. Где-то на просторах находил формулу пересчета, когда делал систему проточной фильтрации для аквариума. Но уже потерял...
eugene_vk Автор
18.03.2022 11:08Да, нелинейность, кстати приемлемая. Отклонение от скорости потока не превышает 50мл на литр при дельте 0.1-0.3 л/мин, чего вполне достаточно. В среднем ошибка на 10 тыс. литров - 100 литров, на мой взгляд, не критична.
gvtret
18.03.2022 12:31Ну для больших объемов может и приемлема. Но 100 литров это 100 ЛИТРОВ. Почти 10 полных накопительных баков. 33 раза макарошки сварить))
andrey_ssh
18.03.2022 11:36Это клепсидра (водяные часы). Очень сложная микропроцессорная клепсидра, с годовым интервалом.
Автоматика это устройство построенная по схеме: ВХОДНЫЕ ДАННЫЕ -> ОБРАБОТКА -> УПРАВЛЯЮЩЕЕ ВОЗДЕЙСТВИЕ. Здесь нет входных данных - целевой параметр не измеряется.
iig
18.03.2022 12:00+2Очень сложная микропроцессорная клепсидра, с годовым интервалом.
++++ ;)
Я эту задачу решаю с помощью бумажки с 2 датами: дата замены и дата предполагаемой замены. Бумажка клеится на корпус фильтра. +- пара недель ошибки особой роли не играет. Хотя, конечно, можно добавить хайтека и внести эти даты в гуглокалендарь.
vvzvlad
18.03.2022 18:34Входные данные — RTC и поток. Управляющее воздействие — писк. Внутри происходит обработка — не просто считается поток, а еще и записывается расход.
andrey_ssh
20.03.2022 13:42Какое отношение поток и часы имеют к ресурсу фильтра?
Автор сделал машину голдберга - очень сложное устройство, выполняющее очень простое действие.
vvzvlad
20.03.2022 18:46О, вы из тех людей, что считают, что наилучшее решение каждой задачи — наименее сложное и как можно меньше оверинжиниринговое? Типа, зачем брать МК, если подойдет 555 или логика, зачем RTOS, если можно на суперцикле?
С чего вы решили, что можете судить за автора, какой уровень сложности будет соразмерен его задаче? Это имеет значение только в контексте продажи или воспроизводства таких систем.
ABATAPA
19.03.2022 09:21Есть счётчики (в том числе DIY) импульсов, которые могут интегрироваться в "умный дом", это гибче и удобнее. Есть (были) готовые устройства. Сам сделал на ESP с интеграцией в "умный дом", совместив с функционалом учёта показаний счётчиков (известной компании на V с импульсным выходом) и контроля протечек (в дополнение к беспроводным контролируется датчиками на трубах и фильтре).
nickolas059
19.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
если дистиллированная вода это новый трэнд, тогда да