Pull to refresh

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

Reading time6 min
Views17K

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

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

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

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

Tags:
Hubs:
Total votes 33: ↑33 and ↓0+33
Comments41

Articles