Уменьшаем потребление ESP8266 при автономной работе с датчиками

    Вот уже более пяти лет WiFi модули на основе SOC ESP8266(ESP8285) успешно используются в автономных устройствах для измерения различных параметров объектов и окружающей среды с передачей по WiFi полученных данных.


    В заметке «Как уменьшить потребление wifi модулей в десять и более раз» рассказывал о некоторых способах уменьшения времени активности WiFI сеанса таких модулей, что позволяет существенно сократить потребление энергии во время передачи данных. При этом типовое время сеанса передачи короткого сообщения удается уменьшить с 1-4 секунд до 0.12-0.3 секунды.


    Однако в устройствах с медленными датчиками или с большим их количеством существенно возрастает время получения информации от датчиков. В этом случае потребление энергии при опросе датчиков становится соизмеримым с затратами энергии на передачу данных по WiFi.


    В то же время, если контролируемые датчиками параметры существенно не изменились, либо результаты измерений можно использовать автономно, то необходимость передачи данных по WiFi отпадает. Например, если измеряемая температура объекта осталась прежней, то передавать ее значение не обязательно, что позволяет экономить энергию на WiFi сеансе.


    Более того, модуль измерения температуры на основе ESP8266 может периодически переключаться в режим глубокого сна, при котором ток потребления составляет менее 20 мкА. Просыпаясь, модуль читает показания датчика, сравнивает эти показания с предыдущими данными. Если показания изменились незначительно или находятся в допустимом интервале рабочих температур, то модуль вновь переключается в режим сна без сеанса связи.
    Если показания датчика заметно изменились или вышли за пределы допустимого интервала, то модуль передает данные и / или сигнал тревоги по WiFi и переключается в режим глубокого сна.


    В простейшем варианте, который часто встречается у большинства пользователей, модуль просыпается с включенным WiFi модемом. В таком случае ток потребления модуля во время опроса датчиков составит 70 мА. Если по итогам опроса передавать ничего не требуется, то затраты энергии на бездействующий WiFi модем будут избыточными.


    Можно сделать иначе: При выходе модуля из режима сна отключить WiFi модем на время опроса датчиков, тогда ток потребления составит 15мА, что обеспечит экономию энергии во время работы с датчиками примерно в 5 раз.


    Но есть одна проблема и она состоит в том, что отключение WiFi модуля существующими средствами SDK приведет к необходимости полностью восстанавливать соединение с точкой доступа, когда потребуется передать данные. В типовом варианте это увеличит время соединения до 1 секунды и более, вместо 0.3 секунды и менее. Таким образом, уменьшение потребления энергии путем отключения WiFi модема во время опроса датчиков будет перекрыто дополнительным расходом энергии при восстановлении WiFi соединения для передачи данных.


    В качестве решения указанной проблемы предлагаю следующий способ отключения и включения WiFi модема. Этот способ не вносит изменений в параметры модема, что, в частности, позволяет сохранить параметры подключения к точке доступа.


    В данном способе, в начале тела функции void user_pre_init(void), которая является обязательной для NONOS SDK, начиная с версии 3.0 и выше, необходимо сохранить в рабочую переменную значение из ячейки с адресом 0x60000704 и очистить ее. В результате этого действия WiFi модем отключится, а ток потребления модуля составит не более 15 мА.
    Затем в тело этой функции помещаем код, который выполняет опрос датчиков и принимает решение о необходимости передачи данных по WiFi.


    Если передача данных необходима, то сохраненное ранее значение восстанавливается в ячейке 0x60000704. После этого выполняются типовые действия для передачи данных, которые исполнялись бы и без отключения WiFi модема.


    В отличие от типового способа по отключению WiFi модема с помощью функции SDK wifi_get_opmode(), предлагаемый способ отключения / включения не увеличивает время сеанса передачи данных. Таким образом, время передачи данных остается неизменным, как и в случае работы WiFi модема без отключения.


    Фрагмент данной функции будет таким:


    uint32 *RT= (uint32_t *)0x60000700;
    void  user_pre_init(void)
    {
        uint32 xRT=RT[4]; RT[4]=0;
    // опрос датчиков и принятие решения о необходимости передачи данных
    …
    // если передача необходима, то восстанавливаем ячейку:
       RT[4]=xRT;   
    }

    Пример работы данного способа:
    На картинке четыре интервала выхода модуля из режима сна.


    В первых трех интервалах нет надобности в WiFi сеансе.


    В четвертом интервале модуль передает данные по протоколу UDP.


    image


    Существует недокументированный режим управления режимом сна без перезагрузки.
    В этом режиме ток потребления составляет 2 мА вместо 15 мА при отключенном WiFi модеме (или вместо 70 мА при включенном). В итоге уменьшаем потребление ESP8266 при работе с датчиками в 10 и более раз.


    В последней версии SDK, после исправления ошибок, есть документированные функции c префиксом fpm.
    Эти функции позволяют реализовать режим сна без перезагрузки с током потребления 0.5 мА.
    Время выхода из этого режима в активный составляет 5 ms.
    Время передачи сообщения по протоколу ESP-NOW составляет 13 ms.

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 12

      0
      Если показания изменились незначительно или находятся в допустимом интервале рабочих температур, то модуль вновь переключается в режим сна без сеанса связи.

      А если модуль не вышел на связь из-за севшей батарейки, или, допустим, поломки?
        0
        Передавать допустимые значения с максимальным приемлемым интервалом.
          0
          Как вариант, собирать посылку из нескоьких измерений в ПЗУ и отправлять за один сеанс. Или если допустимо пропускать незначительно изменившиеся значения (результат измерений) в такой посылке, а на сервере уже выравнивать.
          +1
          Сколько же он в пике-то потребляет. По собственному опыту 200-300 мА минимум ему надо обеспечить, и может не будет отваливаться сессия. У меня стабильно работал только при прямом подключении литиевого аккумулятора.
          При этом основная логика была на атмеге, а модуль только в качестве wifi модема работал.
            0
            Чтобы уменьшить ток в пике использую супер конденсатор до 1 фарады.
            Один заряд супер конденсатора в 1 фараду обеспечивает до 20 сеансов передачи коротких пакетов ESP.
            Кроме того, перед включением передатчика, отключаю ESP от аккумулятора и оставляю лишь супер конденсатор. Во время сна супер конденсатор заряжается от аккумулятора ограниченным по максимальному значению током.
            Например, в экспериментах с СR2032 ток заряда ограничивал до 10 ма.
            0
            Что, ESP8266 научился нормально из сна выходить?
            Без перезагрузки через GPIO16?
              0
              значение из ячейки с адресом 0x60000704
              Хорошо бы объяснить эту недокументированную магию, за что отвечают биты в этой ячейке. Тем более RTOS SDK явно не менее популярен, а про него вы ничего не сказали. И, думаю, добровольно использовать non-OS SDK не все хотят в своих проектах.

              начиная с версии 3.0
              И заканчивая 3.0.2 (от марта 2020) включительно? Или не проверяли? Просто вдруг через 1.5 года ещё выпустят.

              в устройствах с медленными датчиками или с большим их количеством существенно возрастает время получения информации от датчиков
              А почему бы в таких устройствах не использовать другой МК (самый простой и дешевый вариант для DIY — загуглить «AVR picoPower»), который включит и разбудит ESP8266. Например, через биполяный транзистор и повышающий преобразователь до 3.3
                0
                Последняя версия SDK 3.0.4 работает без проблем.

                Для внешнего запуска использовал таймер TPL50XX, который управляет ESP через пин CH.
                Ток потребления этих таймеров составляет 30 нА.
                Ток потребления ESP при управлении через CH составляет 10 мкА.

                Но в этом режиме нельзя использовать память RTC для хранения параметров во время сна.
                  0
                  И какой смысл в этих 30нА при наличии 10мкА? Будите уж лучше этим таймером AVRку, в которой RAM не теряется, а ESP обесточивать целиком.
                0
                В следующей заметке расскажу, как организовать работу модулей ESP8266 с датчиками в режиме ожидания прерываний от таймера или GPIO, но с током потребления 2 мА вместо 15 мА при отключенном WiFi модеме (или вместо 70 мА при включенном). В итоге уменьшаем потребление ESP8266 при работе с датчиками в 10 и более раз.

                Что-то я не понял смысл всей этой затеи.

                Для питания от батареек 2 мА это неприемлемо много, а если питать от сети, то не очень важно 2 мА потребляет контроллер или 70 мА.

                В чём смысл сей оптимизации (кроме чисто теоретического), от чего питаются ваши контроллеры с током потреблением 2 мА и сколько они живут от этого источника в таком режиме?
                  0
                  Кстати, конкретно случай «2мА vs 70мА» всё-таки имеет практическое право на жизнь, например, если делаем что-то, питающееся от автомобильного АКБ.
                    0
                    Этот режим вполне работоспособен при питании от солнечной панельки, либо иного маломощного источника.

                    Добавил в статью информацию о документированном режиме с током в режиме сна в 0.5 мА.

                    Отличается от недокументированного с током в 2 мА максимальным током при пробуждении. 70 мА вместо 15 мА в первые 5 ms активности.

                  Only users with full accounts can post comments. Log in, please.