У многих сейчас стоят счетчики воды. И большинство сталкиваются с проблемой снятия показаний с этих счетчиков и их своевременной сдачей. Я не стал исключением. Показания у меня было снимать удобно, но вот сдавать я их постоянно забывал и вспоминал в самый неподходящий момент. Было решено автоматизировать процесс снятие показаний, чтобы можно было их просмотреть в любой момент времени. Кому интересно как получить картинку слева у себя на телефоне прошу под кат.
Введение
Идея по реализации мне пришла после прочтения этой статьи. Во время ремонта я сразу поставил импульсные счетчики. Была сделана первая версия устройства на основе ESP-03. Код написан на LUA. Данные также передавались на thingspeak.com.
После 2 месяцев использования были выявлены следующие недостатки:
- Не было световой индикации работы, т. к. модуль пару раз завис, то это было важно
- Сложность настройки, т. к. настройки находились в коде
- Для питания был необходим провод с miniUSB разъемом. У меня такой был только от Sony Playstation
- Не удобно просматривать результаты на thingspeak.com
- Относительная сложность реализации.
Поэтому было решено сделать вторую версию, которая будет отвечать следующим требованиям:
- Разъем питания microUSB
- Осуществлять настройку подключаясь к устройству по WiFi
- Индикация работы
- Удобство просмотра информации
- Легкость повторения
- Эстетический внешний вид
- Маленькая себестоимость
Плата
Схема платы довольна простая. В основе лежит таже ESP-03. С основными особенностями подключения мне помог сайт esp8266.ru.
COLD, HOT — розетки RJ9
LED1 — служит для индикации работы платы (режим настройки — постоянно горит, ошибка — частое мигание, нормальная работа — мигание раз в секунду)
LED2 — индикация наличия питания
R3, R4 — 330Ом
R1, R2, R5, R6, R7 — 6.8кОМ
С1 — танталовый конденсатор на 33мкФ
С2 — керамический конденсатор на 0.1мкФ
LM1117 — для преобразования 5В в 3.3В
J1 — джампер для перепрошивки ESP-03
BTN — для выбора режима работы платы
Для прошивки модуля и записи скриптов добавлен разъем miniUSB. Для питания отдельно добавлен еще один разъем microUSB без подвода к нему выводов RX и TX(на схеме он не отображен). Это сделано из-за того, что если запитать модуль через разъем miniUSB, куда подведены RX и TX, то модуль почему-то зависал. Я пробовал подтягивать RX и TX, но ничего не помогало. Поэтому решил оставить так, к тому же кабелей с microUSB у меня было много.
Размеры составляющих компонентов позволяют легко изготовить плату методом ЛУТ, что и было сделано для отладки скриптов. Позже я заказал изготовление платы у китайцев. Размер платы подгонялся под имеющийся корпус.
Фото до монтажа:
Фото после:
Прошивка
Прошивку собрал при помощи online-конструктора. Он дает возможность сгенерировать прошивку NodeMCU только с необходимыми модулями, что позволяет увеличить объем свободной памяти. Проблему с не хваткой памяти я не испытывал и в итоге у меня на скрипты и вспомогательные файлы ушло примерно 30% свободного пространства. Прошивку заливал с помощью nodemcu-flasher. Для написания и заливки скриптов использовал ESPlorer.
Работа импульсного счетчика аналогична нажатию на кнопку. При прохождении определенных значений контакты замыкаются и размыкаются. Мой счетчик замыкал контакты при цифре 7, а размыкал при цифре 2. Счетчики повесил на порты GPIO12, GPIO13 и землю с подтяжкой по питанию(используется внутренний резистор). Таким образом, когда порт поменяет свое значение на 0, то можно считать, что было потрачено 10л воды.
Устройство может работать в 2 режимах: режим настройки и режим снятия показаний. Для перехода в режим настройки при подаче питания необходимо зажать кнопку BTN. На это дается 2 секунды. В этом режиме ESP начинает работать как точка доступа и представлять из себя простой web-сервер. Появляется доступная сеть ESP-???????, где вместо символов ? будет id ESP. Для настройки необходимо подключиться к этой сети и в браузере перейти по адресу 1.1.1.1. Отобразиться следующая страница:
Если при подаче питания кнопка не была зажата, то запускается режим снятия показаний. В этом режиме каждую секунду проверяются состояния портов GPIO12 и GPIO13. Если где-то появился 0, то увеличивается соответствующее значение. Изначально я сделал проверку на основе прерываний, но этот способ оказался не надежный(ESP периодически зависала). Каждую минуту идет попытка отправить данные на сервер(если были изменения). По каждому счетчику передается 2 значения: текущее показание счетчика и величина изменения с последней передачи данных.
Android приложение
Как я уже говорил, на thingspeak.com мне было неудобно просматривать показания. Я решил написать Android приложение. В итоге получилось приложение, которое позволяет:
- Строить графики потребления по часам, дням, месяцам
- Иметь доступ к данным оффлайн
- Добавить виджет с показателями
Thingspeak.com имеет API, которое дает возможность забирать данные. Используя это API, приложение при каждом запуске или перед обновлением виджета запрашивает последние данные и сохраняет в локальную базу. Дальше работа ведется уже с ней. В приложение добавил 2 типа виджетов: в виде счетчика и в виде графика потребления. Получилось довольно удобно.
Я думал реализовать автоматическую сдачу показаний счетчиков, но не нашел готового API. Можно было проанализировать официальное приложение, но это не надежно. Для Москвы есть ЕМП. Я зарегистрировался там и получил доступ к их API, но он позволяет только просматривать какие показания сдавались, а это мне было не интересно.
Заключение
Себестоимость устройства, без учета корпуса, составила приблизительно 450 рублей. Часть компонентов покупалась во всем известном магазине. Если все брать у китайцев, то себестоимость можно снизить приблизительно до 370 рублей. Данная версия за 4 месяца еще ни разу не зависла и не подвела. Получившееся устройство легко повторить и доработать. При помощи него я узнал, что бачок унитаза медленно, но верно пропускал воду.
Полезные ссылки:
Автор: LAVElek
“Это сделано из-за того, что если запитать модуль через разъем miniUSB, куда подведены RX и TX, то модуль почему-то зависал.” – Это потому что у ESP8266 это UART, т.е. по сути COM-порт, а не USB. Нельзя просто так взять и подключить их в разъем USB. Надо ставить микросхему UART2USB типа FTDI или CP2102, как сделано на NodeMCU.