Алгоритм энергосбережения на практике

От автора


Это моя первая статья — жду конструктивной критики, мнений, замечаний, вопросов.

Предисловие


Эта статья посвящена решению проблемы энергосбережения, которая присутствовала при разработке ПО радио-модуля под нужды детектирования разрыва\замыкания цепей и получения температуры.

Что имеем




Был разработан радио-модуль на «борту» которого: «мозг» — atmega128rfa1, со встроенным радиопередатчиком и датчик температуры FM75. Питается устройство от 1-ой батарейки CR2032 (3.3 В, ~200 мА*час).


Функции, которые выполняет модуль

  • при замыкании\размыкании контактов, заведенные на внешнее прерывания — отсылка данных о событии серверу, с подтверждением о приеме;
  • при приеме команды от сервера — выполнить необходимые действия, отправить результат выполненных действий, получить подтверждение о приеме (для рассматриваемой задачи, такими действиями было — получение текущей температуры, получение состояния контактов, управление состоянием модуля);


Применимость модуля

  • как дополнение к бытовым датчикам движения
  • как радио-кнопка (для включения\включения освящения: закладывается в обычные выключатели, вместо подведения разрыва одного из проводов 220 В; также наличие напряжения в сети 220 В, при подключении датчика ноля; положение дверей и тд.)
  • для периодического сбора данных о температуре


Проблема


Потребление модуля:
  • со включенным радиопередатчиком ~9.4 мА
  • при непрерывной передачи данных по радио на полной мощности ~14 мА
  • с выключенным радиопередатчиком ~5.4 мА
  • при получении температуры ~25 мА
  • в режиме глубокого сна (power down mode) ~200 нА

Таким образом, если не выключать радиопередатчик, и ничего не передавать и не принимать, то батарейки 200мА теоретически должно хватать на 20 часов, на практике порядка 16 часов. А если говорить о том, что модулю нужно выполнять еще и какие то функции ?!

Приведем два примера эксплуатации модуля: обычной и экстремальной.
Обычная эксплуатация (предполагаемая):
  • 1 раз в час получение текущей температуры, по запросу от сервера
  • 1 раз в час включение\выключение, допустим — света (т.е. модуль сообщает серверу о состоянии выключателя, отвечающего за свет)

Практическое время работы модуля изменилось не существенно и составило все те же 16 часов.

Экстремальная эксплуатация, для поиска решения проблемы энергосбережения и для наглядности:
  • 1000 раз в час получение текущей температуры, по запросу от сервера
  • 1000 раз в час включение\выключение, допустим — света (т.е. модуль сообщает серверу о состоянии выключателя, отвечающего за свет)

Практическое время работы модуля составило скромные 4 часа.

Тут кончено есть существенная погрешность в оценке, т.к. батарейки имеют широкий разбег емкости от 190 до 250 мА в одной партии, но тем не менее, для грубой оценки времени работы этого достаточно.

Преследуемые цели


Необходимо, чтобы модуль от батарейки емкостью 200 мА в комнатных условиях работал не меньше года в режиме нормальной эксплуатации (описан выше).

Решение


Решение очевидно — использование спящих режимов и не просто спящих, а именно «глубокого сна» (power down mode). Предлагаемый ниже алгоритм применим для микроконтроллеров разных производителей, поэтому будет приведен лишь алгоритм (без кода) — составить код, используя datasheet нужного микроконтроллера, не составит труда.

И так, у микроконтроллеров (далее «МК») есть разные режимы сна и способы выведения из этих режимов.
Но, нам важно, чтобы МК откликался на сообщения от сервера! — а это значит что радиопередатчик должен быть включен — есть режим когда МК спит, но «слушает» эфир на предмет сообщений для него и просыпается, если таковые есть — для нас не подходит, т.к. энергопотребление порядка ~10 мА.

Что тогда делать ?! Ведь в режиме «глубокого сна», радио отключено (т.е. МК уже ничего не будет принимать или передавать), и вывести его из этого режима, можно только по сигналу с внешнего прерывания, ЛИБО по «собачьему таймеру» (Watch Dog), который умеет работать как в режиме сбрасывания МК, так и в режиме вызова прерывания — вот он то нас и спасет!

Алгоритм

И так, для решения поставленной цели был разработан, отлажен и протестирован следующий алгоритм:
1) МК все время находится в режиме «глубокого сна» (power down mode).
2) При срабатывании внешнего прерывания (изменение положения выключателя), МК просыпается, отсылает сообщение серверу, получает подтверждение приема и снова ложится в сон.
3) Т.к. нам необходимо, ко всему прочему, выполнять команды с сервера, необходимо периодически включать радио и прослушивать эфир на предмет сообщений для МК. Ставим Watch Dog в режим прерывания с периодичностью 0.016 до 8 секунд (для наших нужд достаточно периода в 8 сек). В прерывании слушаем эфир, если для MK ничего нет, то снова ложимся в сон.

Разберем пункты подробнее

Находясь в «глубоком сне», МК потребляет ~200 нА (если бы не было саморазряда батарейки, то 200 мА хватило бы на много… лет). Не будем сейчас учитывать саморазряд.
Тогда, на время «жизни» влияет лишь то, насколько часто отрабатывают пункты 2 и 3.
При срабатывании внешнего прерывания на пункте 2, МК работает порядка 20 мс — что тоже можно не учитывать в режиме «нормальной эксплуатации».
Основной потребитель энергии у нас пункт 3. Для наших задач, нам достаточно чтобы МК откликнулся на сообщение от сервера в течении 8 сек. Поэтому настраиваем «собачий таймер» именно так, что бы он проверял эфир раз в 8 сек и сканировал эфир на протяжении 20 мс, затем снова падал в сон. Т.о. если нет сигнала с пункта 2 и нет сообщений от сервера, то наш МК работает 20 мс за 8 секунд, что выливается в 0.0235 мА*час.
Чтобы достучаться до МК, сервер непрерывно в течении 8 секунд посылает пакеты для него, МК отвечает по разному — может мгновенно, а может и в конце 8 секунд — но отвечает!

Результат


Воплотив алгоритм в код, модуль (вообще их несколько) на текущий момент проработал больше 378 дней. Остаток емкости на батареи 40 мА — так что еще будет работать. Режим эксплуатации правда более щадящий, чем предполагалось в описанном выше режиме «обычной эксплуатации» — но такова жизнь, готовились к худшему, надеясь на лучшее.

P.S.


Надеюсь статья кому нибудь пригодится в решении подобной задачи.

Развитие проекта


Эта статья вызвала живой интерес к разработке как «железа» так и ПО среди хабровчан, чему я несказанно рад. Сейчас я закончил разработку модуля под один из проектов на хабре — DIY-диммер «Умного дома» (это взаимодействие результат, как раз, этой статьи).
Метки:
COOLRF 62,74
Компания
Поделиться публикацией
Похожие публикации
Комментарии 16
  • 0
    Нужно отметить, что не во всех контроллерах AVR есть возможность генерировать прерывание по срабатыванию Watchdog — только в тех, где есть Enhanced Watchdog.
    • 0
      Спасибо, это действительно важный комментарий, не будь такой возможности, решить проблему было бы сложнее, если вообще возможно.
    • 0
      >> Был разработан радио-модуль на «борту» которого: «мозг» — atmega128rfa1, со встроенным радиопередатчиком и датчик температуры FM75. Питается устройство от 1-ой батарейки CR2032 (3.3 В, ~200 мА).

      А можно схему, если не секрет? Спасибо.
      • 0
        вот чуть подробней
        pir.tscorp.ru/radiobrain.html
        • +1
          Схема будет, как правильно заметил shtirlitsus, по ссылке есть некоторая информация… но я только начал выкладывать и приводить все в порядок. Предварительно, могу сказать, что схема подключения взята с datasheet, ничего особенного не придумывали. Только с антеннами экспериментировали, брали и керамические, и фрактальные, и вот как на фото, просто по периметру — об этом тоже возможно напишу когда нибудь статью, к тому же тут еще будут эксперименты.
        • +1
          может кнопку на сброс повесить, а не на прерывание?
          • 0
            зачем ждать команду от сервера, чтоб отослать температуру? не лучше просыпаться и отсылать её самостоятельно? если МК просыпается раз в 8 сек на 20 мкс, это значит, что сервер должен загаживать эфир на протяжении 8-ми секунд? В случае нескольких исполнителей — это бяка. Может раз в час отсылать на сервер температуру с подтверждением? ну и еще во время нажатия кнопки заодно.
            • 0
              Логично, такая реализация тоже есть и так же успешно работает — МК обращается на сервер с заданным интервалом пересылая полезные данные и запрашивая от сервера какие действия ему еще необходимо совершить, некоторые просто обращаются к серверу — сообщить о своем присутствии.
              Описал ту реализацию, когда можно обратится к МК в ЛЮБЫЕ 8 сек — а это уже просто интересно было реализовать, потому как нигде не нашел подобного решения.
            • 0
              Печальнее, когда надо не инфу собирать, а, скажем, управлять твердотельным реле. Которому нужен 10мА ток, чтобы оно находилось в проводящем состоянии. Тут уже вотчдогом не обойтись…
              • 0
                Да такую задачу пытался как то решить, к сожалению — пока не нашел решение… основная проблема, как удержать симистор в откыртом состоянии при прохождении через 0. Т.е. по сути нужно организовать логику на переменке, ну или на выпрямленном — чтобы МК один раз засветил оптопару, симистор открылся, и держался открытым до тех пор, пока не поступит следующий сигнал. А так приходится либо постоянно засвечивать, либо с частотой переменки.
              • 0
                Не нашел на сайте информации о том, можно ли купить уже собранные модули «PIR»?
                • 0
                  На сегодняшний момент — это не главная цель. Хочется до конца года довести схему до ума по расположению элементов, определится с самими элементами и удобной распиновкой разъемов.
                  Ко мне уже обратились несколько человек с таким вопросом — от всех я стараюсь получить информацию о том, как планируется применить — что бы учесть это при изменении платы (сделать ее удобной и, на сколько это возможно не в ущерб другим характеристикам, универсальной) — так что можете написать в скайп или на почту — буду благодарен.
                  Затем я сделаю пробники, если все будет в порядке, то в начале года закажу платы на заводе (для себя и тех кто изъявит желание).
                  Если есть острая необходимость — будущие пробники новых модулей мне особо не нужны (только убедится что все встает как нужно и измерить некоторые характеристики), могу их выслать по договоренности — но их будет очень мало, поэтому, у кого нетерпеж и не будет отвращения к их внешнему виду (все таки метод ЛУТа неидеален, да и оборудование для запайки у меня далеко не самое лучшее, но радует — что вроде руки от туда растут =) ) — милости просим.
                  • 0
                    где можно подписаться на новости проекта?
                    • 0
                      ммм, пока нет ленты новостей на сайте, думаю лучший, на текущий момент, способ быть в курсе реализации проекта — подписаться в хабре, в любом случае я буду делится любыми достижениями тут, как только они будут.
                • 0
                  Пока не стал выделять целую о завершении следующего шага (оставил материал до момента поступления плат), но кому интересно pir.tscorp.ru/tasks.html
                  • 0
                    Ох, уж сколько прошло с этого момента… Платы пришли… уже опробованы, сейчас пишу софт… Плат 3 вида —
                    1 непосредственно сам радиомодуль — вот его платка habrahabr.ru/company/coolrf/blog/208396/
                    2 USB обвязка для него (протестирована — работает)
                    3 Переходник на программатор (в последствии откажемся от него т.к. уже есть возможность программировать по радио, и еще добавим возможность программировать через usb переходник)

                    Пред заказы уже выполняются… Следите за нашим блогом habrahabr.ru/company/coolrf/

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое