• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Выход из Light Sleep по команде

Valentin

New member
Здравствуйте, уважаемые участники форума!
Мне бы хотелось узнать как принудительно вывести модуль ESP8266 (ESP-07) из режима Ligh Sleep по команде внешнего контроллера (ATmega8A). В данном режиме, как известно, коммуникации отключаются, UART в частности. Модуль активируется лишь на короткое время для поддержания связи с AP. Мне необходимо отправлять команды на модуль в произвольное время. Ясное дело, при DTIM=1 и DTIM=3 посланные по UART AT команды с большой вероятностью пропадут и не будут выполнены.

9B-ESP8266__Sleep__Function Description__EN_v1.0.pdf гласит:
Under the light-sleep mode, the CPU will not respond to the signal and interrupt from the peripheral hardware
interface under the pause state. Therefore, the ESP8266 need to be waked up via external GPIO, and the wake
process is less than 3 ms.

The GPIO wake can only be configured as the level trigger mode, the interface is as follows.
[inline]void gpio_pin_wakeup_enable(uint32 i, GPIO_INT_TYPE intr_state);[/inline]
Прекрасно, то что нужно. НО, я так понимаю, нужно перекомпилировать прошивку? Сейчас стоит стандартная AT прошивка (версия AT 0.25). Не хотелось бы менять на разные надстройки (NodeMCU, ArduinoIDE и т.д., а тем более лезть туда кривыми руками самому), благо на дефолтной удалось добиться вполне стабильной работы.

Костылями видится отправка AT команд в цикле до получения ответа в момент активности модуля либо аппаратное решение - измерение тока на АЦП меги (через соответствующую обвязку). Пик потребления считать активностью модуля и слать команды в это время. Но это все ужасно, конечно.

Знает ли кто, как можно сконфигурировать External Wake Up пин малой кровью?
 

pvvx

Активный участник сообщества
9В-ESP8266__Sleep__Function Description__EN_v1.0.pdf гласит:
Данный документ не актуален.
В режиме WiFi Sleep Mode: LIGHT всё работает, кроме того, что таймеры прерывания обслуживания LwIP установлены в 120 раз менее и прием/передача TCP будет рваться из-за накопления необработанных событий в LwIP.
Это всё.
Остальное работает и потребление снижает не сильно. Разница среднего(!) потребления всего до 2-х раз, если сравнивать с включенным на 160MHz CPU и работающим WiFi в основном на прием (70 мА против 30 мА) . http://esp8266.ru/forum/threads/raz...go-webservera-na-esp8266.56/page-14#post-2787
благо на дефолтной удалось добиться вполне стабильной работы.
На "дефолтной" стоит режим WiFi Sleep Mode: MODEM
В нем тоже наблюдаются "расстройства" только при передаче по WiFi больших файлов.
 
Последнее редактирование:

pvvx

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

Valentin

New member
В режиме WiFi Sleep Mode: LIGHT всё работает
Прошу прощения, может я туплю, но при отправке AT команд модуль не отвечает, только если быстро слать их в порт, то изредка проскочит ответ (полагаю как раз во время пробуждения чипа).
Остальное работает и потребление снижает не сильно.
Питаю от лабораторного блока, смотрю на экранчик - после активации light sleep ток улетает в 0 (точность 0.01А) с редкими всплесками 20-40 мА. Чисто субъективно кажется, что потребление падает очень сильно.
Ну и как же эти сладкие таблички от Espressif c единицами миллиампер? Бред, или я что то не догоняю? Уважаемый pvvx, подскажите пожалуйста тогда актуальный метод снижения энергопотребления с поддержанием связи с AP.
 

pvvx

Активный участник сообщества
Метод один - если хотите что-то передавать по WiFi, то надо отключать китай-sleep. Когда не требуется передавать, то выключать WiFi воoбще, отключать все программные таймеры (по возможности) и переходить в режим ожидания прерываний по команде:
asm volatile ("waiti 0;"); // Wait for Interrupt
Или использовать свой sleep с активацией по внешнему пину: https://github.com/pvvx/SDKnoWiFi/blob/master/Power_SdkNoWiFi.gif
PS: В SDK 1.4.0 при WiFi Sleep Mode: LIGHT происходит постоянная потеря соединения TCP в LwIP и данные не передаются. А ввод данных по UART с прерываниями почему-то работает.
Ещё пример, как проскакивает потребление в ноль: https://github.com/pvvx/esp8266web/blob/master/Power_Light_start_2sec.gif
Замер со старта модуля...
 
Последнее редактирование:

Valentin

New member
Ещё пример, как проскакивает потребление в ноль: https://github.com/pvvx/esp8266web/blob/master/Power_Light_start_2sec.gif
Скорей всего я такую картину и наблюдал. Субъективно вроде радует, но среднее потребление все расставляет на свои места. Предложенные Вами методы для меня являются серьезным вмешательством, оставлю пока как есть, без sleep.
Спасибо за разъяснения!
 

Valentin

New member
Под рукой оказался USB Data Logger. Дискрет, конечно, никакой - 0.3 с. По X - измерения, по Y - потребляемый ток, мА. Красная линия - линейная аппроксимация.
AT+SLEEP=1 (LIGHT SLEEP).
ESP8266 Consuption.png
 

pvvx

Активный участник сообщества
@Valentin - время со старта до открытого TCP соединения после deep_sleep (или активации по RESET) модуля на SDK 1.3.0 порядка 0.3..0.5 сек c использованием модифицированного загрузчика и части SDK. На SDK 1.4.0 ввели ещё управление инициализацией WiFi через 114 байт (2 или 18 ms, или 200 ms), но новых замеров пока не делал.
Как итог можно получить время от начала старта питания модуля до начала передачи данных со скоростью 1 Мбайт в сек менее чем за пол секунды. За это время модуль соединяется с внешней AP с фиксированным IP адресом. Дальше уже идет трансфер со скоростью 1 Мбайт в сек. После передачи опять deep-sleep. Это определяет минимальный режим потребления. На стандартной прошивке время загрузки и инициализации SDK в несколько раз больше...

Думаю что потребление в WiFi sleep LIGHT может зависеть и от типа соединения к AP (WPA и режимы 802.11). Если его использовать, требуется мобильная команда временного отключения sleep LIGHT, но её нет. Имеющая переписывает конфигурацию в Flash и протрет дыру при частом переключении режимов...

PS: А в общем интерфейс в китайском SDK с разными sleep ещё не отлажен и можно мутить только своё.
 
Последнее редактирование:

Valentin

New member
На стандартной прошивке время загрузки и инициализации SDK в несколько раз больше...
Дело в том, что мне как раз нужен условно мгновенный старт и передача пакета по внешнему триггеру. Поэтому deep sleep не подходит. Light sleep устраивает но отрубает UART. Ну хоть буду знать, что light sleep тоже способен сохранить немного мВт.:)
 

pvvx

Активный участник сообщества
В SDK 1.4.0 появился интерфейс мобильного управления режимами WiFi sleep. см. 2C-ESP8266__SDK__Programming Guide__EN_v1.4.pdf - функции wifi_fpm_*
Но он не дает желаемого :)
Дело в том, что мне как раз нужен условно мгновенный старт и передача пакета по внешнему триггеру.
Это обеспечивается двумя вариантами.
Пример deep-sleep c просыпанием по GPIO2 находится в процедурах из ROM-BIOS самого чипа: dtm_set_params(a,b,c,d), ets_enter_sleep().
Второй вариант, с отключением WiFi и полной готовности CPU к обработке любого прерывания, стоящего на "waiti 0;", у меня почему-то модуль жрет к 5 mA. Возможно надо ещё что выключить...
PS: Я уже запутался в возможных режимах sleep, т.к. их вариантов очень много :)
 
Последнее редактирование:
Сверху Снизу