Устройство отслеживания замены картриджей в фильтре питьевой воды на STM32

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

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

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

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

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

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

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

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

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

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

8d0026dd9fdedb5fd366db794e672ca8.jpg

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

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

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

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

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

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

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

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

1b941a48c2583b2c23869b20a939d5c4.png

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

3959e00288f490f4a92fb1c1d694cd42.png

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

496255e94bf94c2d430960ddc2c3ad75.png

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

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

1537c313a7cba582ad231e65ca013aa0.png6fb3dc015a7d5b8d565f928af8c28020.png3f0e9cdee86127d80ce45a8b6e67c1aa.png

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

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

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

5a6ec843b4e37a04ba56751a73d0eec5.pngbaad83beff9aeb5e235db3de317d5f77.pngdec7fa775a0ed861ce0cd34103de90e9.png

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

4ab15af07bf85b3a6f968efc6144c74f.png

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

999a87cbc4fc9c80c91e1d3989da4650.png

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

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

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

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

ee9be489367f8068991fec4efadadca9.pngaa98bcbf3884ec6563258f89da742336.png

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

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

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

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

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

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

763ef17fa46f5f1372cb77baa503b1b5.png

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

a71c597ff8fba200ed4b8c2fdd933448.png

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

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

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

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

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

28b267ce23e9666af4d9b3d58139b093.png

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

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

143af12abe584390b37176ec6fab0cdc.png

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

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

c701a3f2bb34c0a06c126c3830692a13.png

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

ca4a629f9cb79bb199f1d598a02d4540.png

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

77036e080ec816efa85003e3cb22369e.pngd4c8d8c933555bc3911ffd5d7287bdbe.png

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

bf5298150b8c5f39647ef2a1f627be6e.png

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

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

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

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

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

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

def73d6e7fe059f37e41822a6d06d8b5.png

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

2d94eaa203174a8a281d294fc2fd86aa.png

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

17d7f56d022daf7e12af8d3d97b837dd.png

Итог

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

dd95cbf890697f159b001f028812c60e.png42724c1d7cbf0bc6ccaa3aee3fb9cb6f.png81ea27a55bab76a9e04ce44e305f1861.pnga831f3f500f69d1daba073253917daba.png9fa0cee526c2b97f53d9e84ca773b30b.pngc1938927c7b0d85194c16e779278da44.png

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

bf185a2c756f1a1cfd54a04827244a80.png96d9b69f414609c74cb8e8504996ef6b.png

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

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

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

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

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

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

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

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

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

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

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

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

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

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

© Habrahabr.ru