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