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