Для фильтрации водопроводной воды я использую проточный фильтр Барьер, установленный под раковиной. Фильтр-элементы этого устройства имеют ограниченный ресурс, и их нужно время от времени менять, а стоят они недешево. Ресурс задан в литрах, и мне не хочется менять их раньше времени – а значит нужен счетчик расхода воды через фильтр.
Готовых решений я особо не нашел – только в Леруа-Мерлен был подходящий прибор по цене порядка 4 тысяч рублей, поэтому решил собрать устройство самостоятельно. Ну и сразу сформировались дополнительные «хотелки»:
- Сбор данных со счетчиков холодной и горячей воды
- Звуковая индикация наполнения стандартного кувшина из фильтра
- Передача данных в облако, с возможностью контроля через приложение на телефоне
- Опционально – подключение датчиков протечки и автоматическая блокировка подачи воды при протечке (пока не реализовано)
- Измерение температуры горячей воды (пока не реализовано)
Выбор «железа»
Собственно, особо выбирать и не пришлось. Модуль MP3509 имеет достаточное количество выводов для подключения счетчиков, пищалки, силовые реле позволят реализовать отключение воды. Для измерения расхода через фильтр был куплен вот такой счетчик на известном китайском сайте за 300 руб:
Ну и потребовался блок питания (можно использовать старую зарядку от телефона), звукоизлучатель, немного дискретных компонентов. Счетчики холодной и горячей воды уже имеют готовые контактные группы для подключения к контроллеру, осталось немного удлинить провода. Сигналы от счетчиков подключаются к контроллеру (MP3509 уже имеет встроенную защиту на некоторых входах) и обрабатываются прерываниями.
Выбор «софта»
Я решил остановить свой выбор на Mongoose-OS в качестве операционки для контроллера. Раз в 5 секунд, если сработал хотя бы один из счетчиков, событие отправляется по протоколу MQTT в Google IOT, а оттуда в Firebase. Раз в месяц Firebase отправляет емайл сообщение с текущими показаниями счетчиков, а в приложении на Android можно посмотреть текущий расход воды.
Почему такой набор софта - Mongoose-OS это RTOS, может быть запущена на нескольких видах контроллеров. Имеет хорошую интеграцию с несколькими облачными сервисами, встроенное OTA обновление прошивки, API хорошо документировано. Интеграция c Google IOT и Firebase обеспечивает защищенную передачу данных, аутентификацию, разграничение доступа, при этом для домашних проектов она останется бесплатной.
Схемотехника
Схема подключения очень проста:
Счетчики для холодной и горячей воды подключаются к выводам GPIO12 и 14 (эти выводы имеют встроенную защиту). Подключение лучше выполнить с помощью витой пары, для симметрии в земляной провод добавить резистор на 330 ом. Динамик, управляемый через ключевой транзистор, подключается к выводу GPIO2 (транзистор подойдет любой с N-каналом, открывающийся от напряжения 3,3В). Счетчик для фильтра требует питания, его выходной сигнал подключается к выходу GPIO13. Нам потребуется перепрошить контроллер, для этого добавим перемычку между GPIO0 и землей, а ко входам TX,RX подключим USB-UART преобразователь, например BM8051. Ну и, естественно, потребуется источник питания 5В от любой старой зарядки.
Программирование контроллера
Программирование контроллера производим при помощи USB–UART адаптера BM8051
- Внимание! После программирования исходная прошивка будет стерта
- Скачайте и установите инструмент mos для работы с Mongoose os. Вы можете повторить приведенные на странице скачивания шаги, чтобы попрактиковаться в работе с этим инструментом. Для переключения контроллера в режим программирования замкните переключатель SW1 на схеме и выполните сброс.
- Клонируйте репозиторий с файлами проекта https://github.com/sergkit/WaterMeter. В репозитории несколько папок, к Mongoose- OS относятся папки fs, data-original и файл mos.yml.
- Измените конфигурацию в mos.yml в соответствии со схемотехникой устройства:
- startPin задает начальный вывод контроллера для подключения счетчиков
- countPin задает общее количество подключенных счетчиков (может быть до 5)
- filterPin вывод, к которому подключается счетчик фильтра
- filterDivider делитель для счетчика фильтра, который определяет, как часто будут передаваться показания в облако
- filterSize количество импульсов счетчика фильтра, после которых включается зуммер
- pickPin вывод, к которому подключается зуммер
- Загрузите прошивку в контроллер (mos build и mos flash)
- Посмотрите список wifi сетей. Найдите сеть с именем типа Mongoose_?????? и подключитесь к ней (пароль Mongoose, вы можете задать собственное имя устройства и сети в файле конфигурации). Зайдите на адрес 192.168.4.1 и задайте параметры домашней сети (не забудьте вставить имя устройства). Контроллер перезагрузится и подключится к домашней сети
Google IoT
- Установите Google Cloud SDK, так как многие действия удобнее выполнять из терминала, вводя команды gcloud в командной строке.Скачать SDK можно со страницы загрузки Google Cloud SDK.
- Загрузите бета версию команд из консоли gcloud components install beta
- Если у вас нет учетной записи Google, создайте ее
- Последовательность настройки проекта Google Cloud приведена на сайте Mongoose OS. Ниже краткая выжимка команд, которые надо выполнить из консоли:
# Приведенные ниже команды нужно выполнить всего один раз для настройки Google Cloud project! Они могут быть выполнены из любой папки
# Запрос авторизации в Google Cloud. В открывшемся окне нужно будет выбрать нужную учетную запись Google и разрешить доступ:gcloud auth login
# Создание проекта. Например, выберем sensor-project как PROJECT_IDgcloud projects create sensor-project
# Предоставление Cloud IoT Core прав на публикацию в Pub/Sub-теме:gcloud projects add-iam-policy-binding sensor-project \--member=serviceAccount:cloud-iot@system.gserviceaccount.com --role=roles/pubsub.publisher
# Установка проекта по умолчанию для gcloud:gcloud config set project sensor-project
# Создание тем Pub/Sub для отправки телеметрии:gcloud beta pubsub topics create main-telemetry-topic
# Создание подписки Pub/Sub на созданную тему:gcloud beta pubsub subscriptions create --topic main-telemetry-topic \main-telemetry-subscription
# Создание хранилища для устройств (devices-registry)
# Определение топика Pub/Sub для публикации сообщений, в том числе для подпапки
# Запрет подключения по протоколу HTTP: gcloud iot registries create devices-registry --project=sensor-project \--region=europe-west1 --event-notification-config=topic=registry-topic,subfolder=registry \--event-notification-config=topic=main-telemetry-topic --no-enable-http-config
# На запрос разрешения API нужно отвечать «да»
# Команда не будет работать, если на аккаунте не настроен биллинг
# В этом случае нужно перейти по ссылке, настроить биллинг и повторить команду
Обратите внимание, нужно будет настроить биллинг (Но для проектов с небольшим трафиком использование сервиса останется бесплатным)
- Регистрация устройства в проекте Cloud IoT Core. Программа mos предоставляет удобную команду для выполнения этой задачи. Следует просто набрать следующую команду с идентификатором проекта и именем регистра:
# Регистрация устройства в Cloud IoT Core (выполнить для каждого устройства!):mos gcp-iot-setup --gcp-project sensor-project --gcp-region europe-west1 --gcp-registry devices-registry
Результаты работы команды выводятся на консоль mos. В папке проекта появятся два ключа – закрытый и открытый. Закрытый ключ (xxx.key.pem) – для ESP, а открытый (xxx.pub.pem) – для Google IoT Core. Они будут использоваться во время процесса аутентификации с использованием JSON Web Token в Google IoT Core. Теперь контроллер должен начать передавать данные в IoT Core.
Firebase
- Перейдите в консоль Firebase (https://console.firebase.google.com/). Выберите в ней созданный ранее проект. Примечание: После подключения проекта от вас потребуется выбрать тарифный план Firebase. В большинстве случаев для небольших и тестовых проектов план Blaze с оплатой по факту использования ресурсов даст достаточно бесплатных квот.
- Перейдите в папку firebase, выполните в консоли firebase login (откроется страница в браузере, где можно выбрать учетную запись Google) и выполнить команду инициализации firebase init. В процессе инициализации выберите созданный ранее проект, на все остальные вопросы подходят ответы по умолчанию. Обратите внимание: загруженные из репозитария GitHub файлы firebase/functions/index.js и firebase/public/index.html перезаписывать не нужно.
- Подключите авторизацию OAuth2 для вашего проекта. В консоли google cloud перейдите в меню API и сервисы, учетные данные. Создайте учетные данные для клиентов OAuth 2.0. Сохраните полученные идентификатор и ключ клиента.
- Определите переменные окружения
firebase functions:config:set googleapi.client_id="CLIENT_ID" googleapi.client_secret="SECRET" googleapi.mailto="MAILTO" googleapi.email="MAILFROM"
- Выполните деплой подготовленных функций
firebase deploy --only functions
- Перейдите в панели управления firebase в раздел Function, скопируйте адрес функции В настройках OAuth добавьте домен в список разрешенных.
- Перейдите по адресу функции authgoogleapi, авторизуйтесь, разрешите использования API Gmail в облачных функциях.
- Добавьте в базе Firebase узел config, в него добавьте следующие настройки:
Они имеют следующие значения:
- a,b,c,d,f – делители для пересчета импульсов счетчиков в отображаемые значения.
- Stat – включает сохранение передаваемых с контроллера сообщений в узле stat
- Day – день, в который отправляется письмо с показаниями счетчиков
- M, Y – месяц и год с последними сохраненными данными
Приложение для Android
- Установите Android studio, откройте в нем проект из папки WaterMeter1
- Подключите firebase к проекту. На главной странице проекта в консоли Firebase нажмите кнопку Добавить приложение, выберите платформу Android, введите название пакета sergkit.watermeter сформируйте файл json и сохраните его в папку WaterMeter1\app.
- Теперь вы можете собрать и запустить приложение. После запуска зайдите в настройки, задайте имя устройства и тарифы на воду.
Все готово. Теперь показания счетчиков отображаются в телефоне и раз в месяц отправляются на электронную почту.
Делись с друзьями, переходи по ссылкам на сайт, подписывайся на наш канал Мастер Кит DIY и жми лайк, чтобы не пропустить новые публикации.