Учет расхода холодной и горячей воды и ресурса проточного фильтра при помощи модуля MP3509. Разработка Android приложения для телефона.
Для фильтрации водопроводной воды я использую проточный фильтр Барьер, установленный под раковиной. Фильтр-элементы этого устройства имеют ограниченный ресурс, и их нужно время от времени менять, а стоят они недешево. Ресурс задан в литрах, и мне не хочется менять их раньше времени, а значит – нужен счетчик расхода воды через фильтр.
Готовых решений я особо не нашел – только в Леруа-Мерлен был подходящий прибор по цене порядка 4 тысяч рублей, поэтому решил собрать устройство самостоятельно. Ну и сразу сформировались дополнительные «хотелки»:
- Сбор данных со счетчиков холодной и горячей воды
- Звуковая индикация наполнения стандартного кувшина из фильтра
- Передача данных в облако с возможностью контроля через приложение на телефоне
- Опционально – подключение датчиков протечки и автоматическая блокировка подачи воды при протечке (пока не реализовано)
- Измерение температуры горячей воды (пока не реализовано)
Выбор «железа»
Собственно, особо выбирать и не пришлось. Модуль MP3509 имеет достаточное количество выводов для подключения счетчиков, пищалки; силовые реле позволят реализовать отключение воды. Для измерения расхода через фильтр был куплен вот такой счетчик на известном китайском сайте за 300 руб:
Ну и потребовался блок питания (можно использовать старую зарядку от телефона), звукоизлучатель, немного дискретных компонентов. Счетчики холодной и горячей воды уже имеют готовые контактные группы для подключения к контроллеру, осталось немного удлинить провода. Сигналы от счетчиков подключаются к контроллеру (MP3509 уже имеет встроенную защиту на некоторых входах) и обрабатываются прерываниями.
Выбор «софта»
Я решил остановить свой выбор на Mongoose-OS в качестве операционки для контроллера. Раз в 5 секунд, если сработал хотя бы один из счетчиков, событие отправляется по протоколу MQTT в Google IOT, а оттуда – в Firebase. Раз в месяц Firebase отправляет e-mail сообщение с текущими показаниями счетчиков, а в приложении на 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:[email protected] --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 с оплатой по факту использования ресурсов даст достаточно бесплатных квот.
- Установите Node.js и Firebase Cli.
- Перейдите в папку 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 и сохраните его в папку WaterMeter1app.
- Теперь вы можете собрать и запустить приложение. После запуска зайдите в настройки, задайте имя устройства и тарифы на воду.
Все готово. Теперь показания счетчиков отображаются в телефоне и раз в месяц отправляются на электронную почту.