- Требования
- Принципиальная схема спящего режима ESP32
- Обзор режимов сна в ESP32
- Программирование ESP32 для режима глубокого сна
- Тестирование ESP32 в режиме глубокого сна
ESP32 - один из самых популярных модулей микроконтроллеров на базе Wi-Fi, который часто используется во многих приложениях Portable IoT. Это мощный контроллер, который поддерживает двухъядерное программирование, а также имеет встроенную поддержку Bluetooth с низким энергопотреблением (BLE), что делает его хорошим выбором для портативных приложений, таких как устройства iBeacon, GPS-трекеры и т. Д. Однако в приложениях с питанием от батареи, подобных этим, основная проблема - резервная батарея. Этот резервный аккумулятор можно увеличить за счет более разумного управления блоком микроконтроллера, например, можно запрограммировать ESP32 в спящем режиме в идеальных условиях для увеличения резервного аккумулятора устройства.
В этом проекте мы проверим потребление тока широко распространенным микроконтроллером ESP32 с поддержкой Wi-Fi и Bluetooth в нормальном рабочем режиме и режиме глубокого сна. Также мы проверим разницу и проверим, как перевести ESP32 в режим глубокого сна. Вы также можете ознакомиться со статьей о том, как минимизировать энергопотребление микроконтроллеров, чтобы узнать о других советах, которые можно использовать, чтобы сделать вашу конструкцию более энергоэффективной. Кроме того, если вас интересует спящий режим других микроконтроллеров, вы также можете проверить спящий режим Arduino и спящий режим ESP8266 NodeMCU.
Требования
Для этого мы будем использовать Devkit V4.0 на базе ESP32 от Espressif, который имеет мост USB-UART, а также другие распиновки ESP32 для упрощения подключения. Программирование будет выполняться с помощью Arduino IDE. Если вы новичок, то для начала работы с ESP32 с использованием Arduino прочтите связанную статью, прежде чем продолжить.
Требования этого проекта следующие:
- Он перейдет в режим глубокого сна одним нажатием кнопки.
- Он выйдет из режима глубокого сна при нажатии другой кнопки.
- Чтобы определить состояние ESP32, светодиод будет мигать со временем включения 1000 миллисекунд. В спящем режиме он будет выключен.
Следовательно, требуются дополнительные компоненты -
- Светодиод - 1 шт.
- Кнопка (тактильный переключатель) - 2 шт.
- Резисторы 4,7к - 2 шт.
- Резистор 680R - 1 шт.
- Макетная плата
- Подключите провод
- Адаптер 5В или блок питания
- Кабель micro-USB
- Arduino IDE с программным интерфейсом ESP32 на ПК или ноутбуке.
Принципиальная схема спящего режима ESP32
Схема для перевода ESP32 в спящий режим с помощью кнопки показана ниже.
Схема довольно проста. На нем две кнопки. Кнопка сна переводит ESP32 в режим глубокого сна, а другой переключатель используется для вывода ESP32 из спящего режима. Обе кнопки подключены к PIN 16 и 33. Обе кнопки настроены как активный низкий при нажатии, поэтому дается дополнительное подтягивание. Однако для определения того, находится ли ESP 32 в спящем режиме или в режиме нормального рабочего состояния, светодиод подключается к контакту 4 ввода-вывода.
Обзор режимов сна в ESP32
Для ESP32 существует множество различных режимов питания, а именно активный режим, режим сна модема, режим легкого сна, режим глубокого сна и режим гибернации.
В нормальном рабочем состоянии ESP32 работает в активном режиме. В активном режиме ESP32 ЦП, оборудование WiFi / BT, память RTC и периферийные устройства RTC, сопроцессоры ULP - все они активированы и работают в зависимости от рабочей нагрузки. Однако в разных режимах питания одно или несколько периферийных устройств отключены. Чтобы проверить различные операции в режиме питания, следуйте приведенной ниже таблице.
Оборудование |
Активный режим |
Режим ожидания модема |
Легкий спящий режим |
Режим глубокого сна |
Гибернации |
Процессор |
НА |
НА |
ПАУЗА |
ВЫКЛ. |
ВЫКЛ. |
WiFi / BT |
НА |
ВЫКЛ. |
ВЫКЛ. |
ВЫКЛ. |
ВЫКЛ. |
Периферийные устройства RTC и RTC |
НА |
НА |
НА |
НА |
ВЫКЛ. |
ULP-Co процессор |
НА |
НА |
НА |
ВКЛ ВЫКЛ |
ВЫКЛ. |
Как видно из приведенной выше таблицы, в режиме глубокого сна ESP32, который часто называют шаблоном мониторинга датчика ULP - ЦП, WiFi / BT, память RTC и периферийные устройства, сопроцессоры ULP отключены. Включены только память RTC и периферийные устройства RTC.
Во время пробуждения ESP32 должен быть уведомлен источником пробуждения, который выведет ESP32 из режима глубокого сна. Однако, поскольку периферийные устройства RTC включены, ESP32 можно активировать через GPIO с включенным RTC. Есть и другие варианты. Это может быть пробуждение через контакты прерывания внешнего пробуждения или использование таймера для пробуждения ESP32. В этом проекте мы используем пробуждение ext0 на выводе 33.
Программирование ESP32 для режима глубокого сна
Полную программу можно найти внизу этой страницы. Он написан для Arduino IDE и, следовательно, может быть легко адаптирован к вашим требованиям. Пояснение к коду следующее.
В начале кода
// Создание переменной PushButton PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // определение Led Pin uint8_t led_pin = GPIO_NUM_4; // определяем вывод пробуждения uint8_t wakeUp_pin = GPIO_NUM_33;
Вышеуказанные три строки определяют вывод пробуждения, вывод светодиода и вывод спящего режима.
void setup () { // поместите сюда ваш установочный код, для однократного запуска: // установите последовательный порт на 115200 Serial.begin (115200); задержка (1000); // устанавливаем контакт кнопки как вход с внутренним PullUp pinMode (pushBtn.pin, INPUT_PULLUP); // установить обработчик прерывания с контактом pushButton в режим падения attachInterrupt (pushBtn.pin, isr_handle, FALLING); // устанавливаем вывод светодиода как output pinMode (led_pin, OUTPUT); // создаем задачу, которая будет выполняться в функции blinkLed () с приоритетом 1 и выполняться на ядре 0 xTaskCreate ( blinkLed, / * Task function. * / "blinkLed", / * имя задачи. * / 1024 * 2, / * Размер стека задачи * / NULL, / * параметр задачи * / 5, / * приоритет задачи * / & taskBlinkled); / * Дескриптор задачи для отслеживания созданной задачи * / delay (500); // Настройте вывод 33 как источник пробуждения ext0 с НИЗКИМ логическим уровнем esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
В приведенном выше фрагменте кода прерывание устанавливается в падающий режим.
attachInterrupt (pushBtn.pin, isr_handle, ПАДЕНИЕ);
Следовательно, при каждом нажатии переключателя логический уровень будет изменяться с логической 1 (3,3 В) на логический 0 (0 В). Напряжение на контакте кнопки упадет, и ESP32 определит, что переключатель нажат. Так же создана задача мигать светодиодом.
xTaskCreate ( blinkLed, / * Функция задачи. * / "blinkLed", / * имя задачи. * / 1024 * 2, / * Размер стека задачи * / NULL, / * параметр задачи * / 5, / * приоритет задачи * / & taskBlinkled); / * Дескриптор задачи для отслеживания созданной задачи * / delay (500);
Контакт 33 также настроен с использованием приведенного ниже фрагмента кода в качестве внешнего источника пробуждения, обозначенного как ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Затем в цикле while -
void loop () { // поместите сюда ваш основной код, чтобы запускать его повторно: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Приостановить задачу 'blinkLed' \ n"); // Приостановить мигающую задачу vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Засыпаю….. \ n", pushBtn.pin); pushBtn.pressed = false; // Сейчас засыпаем esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); switch (wakeupReason) { case ESP_SLEEP_WAKEUP_EXT0: Serial.println («использование внешнего сигнала ext0 для пробуждения из спящего режима»); сломать; case ESP_SLEEP_WAKEUP_EXT1: Serial.println («использование внешнего сигнала ext1 для пробуждения из спящего режима»); сломать; case ESP_SLEEP_WAKEUP_TIMER: Serial.println («использование сигнала таймера для пробуждения из спящего режима»); сломать; case ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println («использование сигнала TouchPad для пробуждения из спящего режима»); сломать; case ESP_SLEEP_WAKEUP_ULP: Serial.println («использование сигнала ULP для пробуждения из спящего режима»); сломать; по умолчанию: перерыв; Serial.printf ("Возобновить задачу 'blinkLed' \ n"); // перезапускаем задачу blinkLed vTaskResume (taskBlinkled); } }
Цикл while постоянно проверяет, нажата кнопка сна или нет. Если кнопка нажата, она остановит или приостановит задачу мигания светодиода и запустит функцию запуска глубокого сна esp -
esp_deep_sleep_start ();
В этой ситуации, если нажать кнопку внешнего прерывания ext0, он немедленно выйдет из режима глубокого сна и возобновит выполнение задачи мигания светодиода.
Наконец, в приведенных ниже фрагментах можно увидеть функцию мигания светодиода, она будет мигать светодиодом 1000 мсек.
void blinkLed (void * param) { while (1) { static uint32_t pin_val = 0; // переключаем значение вывода pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Светодиод -----------------% s \ n", pin_val? "Вкл.": "Выкл."); / * Просто переключать светодиод каждые 1000 мс или 1 секунду * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Тестирование ESP32 в режиме глубокого сна
Схема построена на макетной плате, и для измерения тока используется мультиметр Metravi XB edition. Ток, потребляемый схемой в активном режиме, составляет почти 58 мА, но в режиме глубокого сна он составляет почти 4,10 мА. На изображении ниже показано потребление тока в активном режиме ESP32 -
В режиме глубокого сна записанное потребление тока упало примерно до 3,95 мА, на изображении ниже показано потребление тока в режиме глубокого сна ESP32 -
Однако в режиме глубокого сна ток потребления ESP32 составляет почти 150 мкА. Но зарегистрированное потребление тока для этой платы ESP32 Devkit составляет почти 4,10 мА. Это связано с CP2102 и линейным регулятором. Эти два подключены к линии питания 5 В. Также к линии питания подключен светодиодный индикатор питания, который потребляет ток почти 2 мА.
Таким образом, можно легко определить, что ESP32 потребляет очень мало энергии в режиме глубокого сна, что очень полезно для работы от батарей. Для получения дополнительной информации о том, как это работает, посмотрите видео по ссылке ниже. Если у вас есть какие-либо вопросы, оставьте их в разделе комментариев ниже или используйте наши форумы, чтобы задать другие технические вопросы.