Рубрики
Проекты на ESP32

Как использовать спящие режимы в модуле ESP32

ESP32 в настоящее время является одним из самых популярных микроконтроллеров с поддержкой технологии Wi-Fi и широко применяется в различных проектах, относящихся к тематике интернета вещей (IoT). ESP32 – достаточно мощный микроконтроллер, который поддерживает двухъядерное программирование и имеет встроенную поддержку технологии BLE (Bluetooth Low Energy), которая делает его отличным решением для использования в портативной электронике. Но для устройств, запитываемых от батареек/аккумуляторов, энергопотребление является весьма критичным фактором и одной технологии BLE для снижения потребления энергии часто бывает недостаточно. В этих условиях значительного снижения энергопотребления устройств, построенных на основе модуля ESP32, можно добиться за счет использования спящих режимов в модуле.

В данной статье мы рассмотрим программирование модуля ESP32 для его работы в режиме глубокого сна (deep sleep mode) и сравним его энергопотребление в обычном (активном) режиме и режиме глубокого сна. Ранее на нашем сайте мы рассматривали использование спящих режимов в плате Arduino и в модуле ESP8266 NodeMCU.

Необходимые компоненты

  1. Модуль ESP32 (купить на AliExpress).
  2. Светодиод (купить на AliExpress).
  3. Кнопка (тактильный переключатель) – 2 шт.
  4. Резистор 4,7 кОм – 2 шт. (купить на AliExpress).
  5. Резистор 680 Ом (купить на AliExpress).
  6. Адаптер 5V.
  7. Кабель micro-USB.
  8. Компьютер/ноутбук с установленной Arduino IDE.
  9. Макетная плата.
  10. Соединительные провода.

Для проекта необходима версия модуля ESP32 на основе Devkit V4.0 (или аналогичная) от компании Espressif, которая содержит преобразователь (мост) из USB в UART. Программировать модуль ESP32 мы будем с помощью Arduino IDE.

Требования для нашего проекта будут следующие:

  1. Модуль ESP32 должен переходить в режим глубокого сна при нажатии кнопки.
  2. Модуль ESP32 должен выходить из режима глубокого сна при нажатии другой кнопки.
  3. Для индикации состояния модуля ESP32 будет использоваться светодиод – в активном состоянии модуля он будет мигать с интервалом в 1 секунду, а в режиме глубокого сна он будет выключен.

Схема проекта

Схема для демонстрации возможностей режима глубокого сна в модуле ESP32 представлена на следующем рисунке.

Как видите, схема достаточно проста и содержит модуль ESP32 и две кнопки – для перехода модуля в режим глубокого сна и выхода из него. Кнопки подключены к контактам 16 и 33 модуля ESP32. При нажатии кнопок на соответствующий контакт модуля будет подаваться уровень low, поэтому для подключения кнопок необходимы дополнительные подтягивающие резисторы. Светодиод, который будет показывать в каком режим (спящем или активном) будет находиться модуль ESP32, подключен к его контакту 4.

Краткий обзор спящих режимов в модуле ESP32

В модуле ESP32 есть несколько режимов энергопотребления:

  • активный режим (active mode);
  • режим сна модема (modem sleep mode);
  • «легкий» спящий режим (light sleep mode);
  • режим глубокого сна (deep sleep mode);
  • режим пониженного энергопотребления/»спячки» (hibernation mode).

В нормальных условиях эксплуатации модуль ESP32 работает в активном режиме. В этом режиме центральный процессор модуля, аппаратное обеспечение WiFi/BT, память часов реального времени (RTC memory), периферийные устройства реального времени (RTC peripherals) и ULP сопроцессоры активированы и их работа зависит от текущей загрузки модуля. Но в некоторых режимах часть этих устройств может отключаться, как показано в следующей таблице.

Аппаратные средства Active Mode Modem-sleep Mode Light Sleep Mode Deep-sleep Mode Hibernation
CPU ON ON PAUSE OFF OFF
WiFi/BT ON OFF OFF OFF OFF
RTC and RTC Peripherals ON ON ON ON OFF
ULP-Co Processor ON ON ON ON/OFF OFF

Режим глубокого сна (deep sleep mode) в модуле ESP32 часто называют шаблоном мониторинга датчиков (ULP sensor monitored pattern) – в этом режиме включены только память RTC и периферийные устройства RTC, а CPU, WiFi/BT и ULP сопроцессоры – выключены.

Чтобы выйти из режима глубокого сна модуль ESP32 должен получить «пробуждающий» (wake-up) сигнал от какого-нибудь источника. И, поскольку, периферийные устройства RTC в режиме глубокого сна включены, модуль ESP32 может «пробудиться» при помощи контактов, доступных для использования устройствами RTC (реального времени). Но существуют и другие способы «пробудить» модуль, например, при помощи внешнего прерывания на одном из контактов или по таймеру. В данном проекте мы будем использовать пробуждение модуля ESP32 из режима глубокого сна при помощи сигнала внешнего прерывания (ext0), подаваемого на его контакт 33.

Объяснение программы для модуля ESP32

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

В начале программы объявим необходимые переменные и инициализируем используемые контакты.

В функции void setup() инициализируем последовательную связь со скоростью 115200 бод, зададим режимы работы используемых контактов (на ввод или вывод данных), назначим функцию обработки прерывания и создадим необходимую нам задачу.

Прерыванием мы будем считать спад импульса (уровня напряжения) на контакте pushBtn.pin. Для обработки прерывания будет вызываться функция isr_handle. Более подробно о работе с прерываниями в модуле ESP32 вы можете прочитать в этой статье.

Таким образом, при нажатии кнопки уровень на контакте обработки прерывания будет изменяться от логической 1 (3.3V) до логического 0 (0V). Модуль ESP32 будет обнаруживать это изменение уровня. Далее создадим задачу для мигания светодиодом.

Контакт 33 конфигурируется с помощью следующей команды чтобы принимать внешний сигнал пробуждения, обозначенный как ext0.

В функции void loop() мы будем выполнять следующие операции:

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

А при нажатии кнопки внешнего прерывания ext0 модуль ESP32 будет немедленно выходить из режима глубокого сна и возобновлять выполнение задачи мигания светодиодом.

Код функции для мигания светодиодом с интервалом 1000 мс выглядит следующим образом:

Тестирование работы модуля ESP32 в режиме глубокого сна

После сборки схемы проекта на макетной плате мы использовали мультиметр для измерения тока. В активном режиме ток, потребляемый схемой, составил почти 58 mA.

А в режиме глубокого сна (deep sleep mode) он оказался равен 3.95mA (4.10 mA).

В режиме глубоко сна энергопотребление модуля ESP32 должно составлять примерно 150 мкА. Но измеренное энергопотребление платы ESP32 Devkit в этом режиме оказалось равным 4.10 mA. Это произошло из-за микросхемы CP2102 и линейного регулятора в составе платы модуля, которые оба подключены к шине 5V. Также у нас в схеме присутствует светодиод, который потребляет почти 2mA тока.

Тем не менее, по результатам проведенного теста можно отметить, что модуль ESP32 в режиме глубокого сна потребляет очень небольшое количество электроэнергии, что является его весомым преимуществом для использования в устройствах, питаемых от батареек/аккумуляторов.

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

Источник статьи

2 ответа к “Как использовать спящие режимы в модуле ESP32”

Статья интересная. Но мне кажется, что строки:
Serial.printf(«Resume the ‘blinkLed’ Task \n»);
// возобновляем задачу мигания светодиодом
vTaskResume( taskBlinkled );
должны идти ниже закрывающей фигурной скобки.
И что будет происходить в loop(), если кнопка не нажата? Всё равно будем вызывать esp_sleep_get_wakeup_cause(), и vTaskResume( taskBlinkled ) ??? Скорее всего надо добавить else и выходить в нём из функции.

Да, спасибо, насчет этих двух строк скорее всего это опечатка у автора. Насчет else и выхода из функции пока не готов сказать

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *