В предыдущей части рассмотрели постановку задачи, что из железа было для прототипа, общая схема организация системы и первые результаты.
Поскольку основную задача решена – данные передаются, копятся и отображаются, то надо переходить к реализации рабочего образца передатчика с учетом требования “Устройство помещаемое в стояк должно быть энергонезависимым от электросети помещения.” С помещением в стояк проблем нет, а вот с энергонезависимостью проблемы.
Первый прототип.
Прототип передатчика состоит из следующих элементов:
- Arduino UNO;
- Шилд Funduino Extension Board for Arduino Nano;
- радио модуль nRF24L01+;
- самодельный разъем для подключения контактов от водосчетчиков.
Схема подключения
Использование шилда обусловлено исключительно удобством подключения с помощью перемычек.
В основной разъем вставляем Arduino Nano. Радио модуль подключаем с помощью гибких перемычек по схеме:
nRF24L01+ | Arduino |
1 GND | GND |
2 VCC | 3.3V |
3 CE | D7 |
4 CSN | D8 |
5 SCK | D13 |
6 MOSI | D11 |
7 MISO | D12 |
8 IRQ | – |
Необходимые библиотеки для радио модуля nRF24L01+ можно скачать на GitHub.
Для подключения контактов от водосчетчиков собрал небольшую платку с клемниками. Необходимость взять паяльник в руки возникла, когда пришло понимание об организации корректной схемы подключения. Фактически в водосчетчике стоит “кнопка”, которая то замыкает, то размыкает выходные контакты. А это значит, что подключать нужно через сопротивление, их как раз видно на фото выше.
Изначально контакты от водосчетчиков подключал к цифровым разъемом D5 и D4.
Собранная схема потребляла очень много энергии. Основная причина – это не использование спящего режима, а так же наличие на плате Arduino схемы питания, которая потребляет очень много. Как итог, передатчик жил 2.5 дня от трех батареек типа АА.
Второй прототип.
В процессе изучения вопроса работы микроконтроллера в спящем режиме обнаружил, что цифровые вывод D2 и D3 являются так же выводами прерывания, т.е. выводом микроконтроллера из спящего режима. Причем есть разные варианты отслеживания статуса изменения: с 0 на 1, с 1 на 0 и любое изменение. Это то, что надо! Ведь наша задача считать количество изменений на входе.
Самым интересным моментом стало избавление от всей лишней обвязки и сборки прототипа на голом микроконтроллере. Оказывается в Atmega328 есть внутренний тактовый генератор, который позволяет работать микроконтроллеру на 8MHZ. А рабочий диапазон напряжения достаточно широкий, а это значит, что можно работать без дополнительной схемы питания и внешнего кварца. Этими и другой полезной информацией по теме со мной периодически делится Евгений Орлянский, за что ему огромное спасибо!
С точки зрения подключения ничего особо не поменялось, только собрано на макетной плате. Единственно что надо сделать, это закачать новый загрузчик в микроконтроллер, что бы он мог работать на внутреннем генераторе. Достаточно подробно это описано на сайте Arduino, см. раздел Minimal Circuit (Eliminating the External Clock).
Алгоритм получился следующий: пока на входах нет изменения микроконтроллер находится в спящем режиме, радиомодуль переведен в режим пониженного энергопотребления. Если сработало прерывание, то выходим из режима пониженного энергопотребления. Считаем воду, отправляем раз в 30 секунд (перед отправкой включаем радиопередатчик на максимум).
Для управления режимами энергопотребления Atmega328 используется библиотека LowPower. Управление энергопотреблением радиомодуля входит в упоминавшейся библиотеке в предыдущем посте.
Более глубоко по энергопотребление можно найти здесь.
Тестирование показало, что всё работает как требуется. Правда, в результате теста всплыл баг кода, если приемник по каким-то причинам не принимал данные, то передатчик не уходил в сон. Что стоило довольно-таки ощутимой потере. Из-за простоя более чем в 10 часов на полной мощности батарея стала выдавать на пол вольта меньше.
Кстати, обратите внимание, что с такой схемой подключения нужно всего 2 батареи типа АА.
Третий прототип. Пора остановиться.
И вот оно! Поскольку все работает, то можно наконец-то развести и протравить плату! Яху.
Благо схема простейшая, развел её руками в Sprint Layout. И с помощью лазерно-утюжной технологии получаем готовую плату.
Следующий шаг – это насверлить кучу дырок. Хорошо, что у бати есть стойка с мини-дрелью.
На самом деле плат получилась немного избыточной, т.к. я на всякий случай сделал выводы под аналоговые входы (никогда не знаешь какой еще датчик вздумается прикрутить), и контакты для загрузки нового скетча без извлечения микроконтроллера из колодки.
Смонтировал все детали и… не заработало. Оказалось, что ошибся в одном контакте при разводке контактной площадки для радиомодуля. Хорошо, что нужный контакт был рядом, обрезал дорожку и припаял куда требуется.
Размеры платы примерно 5х5 см. К задней стенки прикручен контейнер с двумя батарейками.
Итог: с учетом бага с энергопотреблением схема продержалась чуть меньше месяца.
Три пика в середине месяца – это те дни когда кому-то захотелось полежать долго в ванной. :)
Крайний правый пик – это вручную внесенная компенсация за пропущенные дни между 28 марта и 5 апреля.