• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Deep sleep с пробуждением по кнопке

nikolz

Well-known member
Ну нету у ESP8266 возможности засыпания с просыпанием по кнопке с его SDK от Espressif, который и используется в Arduino. Надо что-нибудь довешивать.
Команда system_deep_sleep_set_option() и system_deep_sleep() в SDK работают. Сложностей там вроде нет, кроме времени исполнения (времени от подачи команды до отключения - он потупит не менее 0.1 сек и отключиться).
Ошибка в system_deep_sleep() во всех последних SDK, ставящая неправильный флаг для следующего просыпания вам не помешает. (Ошибка связана с тем, что по последующему просыпанию система считает, что перезагрузилась по причине "протектед", а не по "deep_sleep" и соответственно будет полностью инициализировать WiFi, а не как это описано в документации. Причина в неправильном коде процедуры в iram переключения процессора в deep_sleep и аппаратно отключив flash он по ret в ней успевает возвращаться в коды flash, а там уже неопределенный код... и успевает сработать "протектед", записывая в RTC память причину перезагрузки по ошибке... Т.е. ошибка плавающая - успеет или не успеет нарваться в отключенном "кэш" на кривую инструкцию. На 160 MHz - успевает всегда...).
----------------------------
При просыпании система считает (код 5) что проснулась ( у меня на стандартном SDK именно так и работает)
enum rst_reason {
REANSON_DEFAULT_RST = 0, // normal startup by power on
REANSON_WDT_RST = 1, // hardware watch dog reset
// exception reset, GPIO status won’t change
REANSON_EXCEPTION_RST = 2,
// software watch dog reset, GPIO status won’t change
REANSON_SOFT_WDT_RST = 3,
// software restart ,system_restart , GPIO status won’t change
REANSON_SOFT_RESTART = 4,
REANSON_DEEP_SLEEP_AWAKE = 5, // wake up from deep-sleep
REANSON_EXT_SYS_RST = 6, // external system reset
-------------------------------
"И только ученик третьего класса ЦПШ Вася,
сидевший на последней парте и считавшейся двоечником,
сказал,
что у профессора ,
в третьей строке написанных выкладок на доске,
ОШИБКА в пределах тройного интеграла"
 

Beerukoff

New member
А если сделать следующий цикл:
1) ESP.deepSleep(1000000*1)
2) Контроль нажата ли кнопка, если нет, то тут же переход на 1-й пункт

То это как-то повлияет на снижение энергопотребления в пассивном режиме?
 

nikolz

Well-known member
возможно Вас устроит режим Light-sleep
upload_2017-4-3_14-26-19.png
потребление не ноль но вполне можно жить.
----------------------------
из документации
Во время Light-sleep CPU приостанавливается и не реагирует на сигналы и прерывания от периферийных аппаратных интерфейсов. Поэтому, ESP8266 необходимо разбудить через Внешний GPIO. Процесс пробуждения составляет менее 3 мс.
Функция пробуждения GPIO может быть активирована только триггерами уровня.
Примечание:
Установите контакты в состоянии выхода в состояние ввода, например, MTDO, U0TXD, GPIO0, прежде чем включать Light-sleep для устранить ток утечки, чтобы потребление энергии могло быть еще ниже.
Примечание:
ESP8266 автоматически переходит в режим «Спящий режим» при подключении к Wi-Fi при простоя CPU
 

Beerukoff

New member
Про deep sleep в инете много написано, погружаться в него просто, просыпаться тоже несложно (как по таймеру, так и замыканием RST с GND), но для моего девайса с одной кнопкой я так и не понял как сделать так, чтобы первое нажатие пробуждало ESP (путем резета), а вот все последующие уже работали в рамках программы (до следующего сна).

Про light sleep пока не могу найти понятного описания как его использовать (в рамках Arduino IDE) и как сделать из него выход по нажатию кнопки.

Можете поделиться ссылкой на простое описание (понятное совсем новичку) или тут написать как зайти в LS (без таймера выхода) и выйти из него по кнопке (висящей, к примеру, на D0)
 

tretyakov_sa

Moderator
Команда форума
Можете поделиться ссылкой на простое описание (понятное совсем новичку) или тут написать как зайти в LS (без таймера выхода) и выйти из него по кнопке (висящей, к примеру, на D0)
Код:
#include <ESP8266WiFi.h>
extern "C" {
  #include "gpio.h"
}
extern "C" {
  #include "user_interface.h"
}

const char* ssid     = "home";
const char* password = "i12345678";

void setup() {
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected"); 
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

   wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
}


void loop() {
  // Здесь то что вам нужно сделать.
  delay(1000);
  sleep();
  delay(100);
  Serial.println("Woke up!");
}

void sleep()
{
    gpio_pin_wakeup_enable(GPIO_ID_PIN(2), GPIO_PIN_INTR_LOLEVEL); // Кнопка на GPIO2
    wifi_fpm_open();
    wifi_fpm_do_sleep(0xFFFFFFF);
}
 

pvvx

Активный участник сообщества
----------------------------
При просыпании система считает (код 5) что проснулась ( у меня на стандартном SDK именно так и работает)
enum rst_reason {
REANSON_DEFAULT_RST = 0, // normal startup by power on
REANSON_WDT_RST = 1, // hardware watch dog reset
// exception reset, GPIO status won’t change
REANSON_EXCEPTION_RST = 2,
// software watch dog reset, GPIO status won’t change
REANSON_SOFT_WDT_RST = 3,
// software restart ,system_restart , GPIO status won’t change
REANSON_SOFT_RESTART = 4,
REANSON_DEEP_SLEEP_AWAKE = 5, // wake up from deep-sleep
REANSON_EXT_SYS_RST = 6, // external system reset
-------------------------------
"И только ученик третьего класса ЦПШ Вася,
сидевший на последней парте и считавшейся двоечником,
сказал,
что у профессора ,
в третьей строке написанных выкладок на доске,
ОШИБКА в пределах тройного интеграла"
Ошибка и есть. При просыпании после deep_sleep, если вход в него был на 160 МГц, то там, в 90% случаев, будет значиться REANSON_SOFT_RESTART или другой - причина = ошибки в SDK с 1.0 по последнюю. При 80 МГц - 10%. Зависит куда влетит проц и какие команды получаются на пустой шине, отключенной кеш Flash, пока отрабатывает аппаратная часть перевода чипа в deep_sleep. :p
Программеры из Espressif для решения этого вопроса вписали не менее сотни команд и накрутили полный бред в процедуре инициализации SDK, но ситуацию это не исправило. Т.к. не там происходит ошибка, где её они ищут, а в указанном мной год назад или ранее... Патчите бинарную либу libmmain.a по указаниям в теме web-свалки и всё будет хорошо.
 
Последнее редактирование:

pvvx

Активный участник сообщества
возможно Вас устроит режим Light-sleep
Посмотреть вложение 3838
потребление не ноль но вполне можно жить.
----------------------------
из документации
Во время Light-sleep CPU приостанавливается и не реагирует на сигналы и прерывания от периферийных аппаратных интерфейсов. Поэтому, ESP8266 необходимо разбудить через Внешний GPIO. Процесс пробуждения составляет менее 3 мс.
Функция пробуждения GPIO может быть активирована только триггерами уровня.
Примечание:
Установите контакты в состоянии выхода в состояние ввода, например, MTDO, U0TXD, GPIO0, прежде чем включать Light-sleep для устранить ток утечки, чтобы потребление энергии могло быть еще ниже.
Примечание:
ESP8266 автоматически переходит в режим «Спящий режим» при подключении к Wi-Fi при простоя CPU
Эта таблица замеров в промежутках и питания только чипа, а не модуля - там стоит ещё Flash. Тем более эти данные не для Arduino, а для специальной версии SDK c примером :) Т.е. сделаны Espressif для рекламных целей, а не реальности с их SDK в Arduino.
Реально в Ligh-Sleep потребление модуля ESP8266 от 15 до 50 мА (учитывая городскую обстановку в эфире WiFi).
Откройте Разработка ‘библиотеки’ малого webсервера на esp8266. Там в первых сообщениях есть ссылки почти на все замеры и переставйте опять гнать рекламу.

Потребление при передаче на скорости к 1 мегабайт в секунду - пример два графика в конце
Потребление модулем в разных режимах WiFi-sleep модуляи стартовые примеры
Потребление по питанию часов (по ноге RTC_VDD)
Потребление при прошивке модуля с помощью esptool.py
Закорачивание I/O выхода вызывает увеличение тока на 50 мА: http://esp8266.ru/forum/attachments/esp-01-gpio15-out-gif.885/
Потребление с фирменной фичей в режиме ST, при поиске внешней AP.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Разработка ‘библиотеки’ малого webсервера на esp8266. - вот там, в промежутках и есть тот рекламируемый Espressif режим отключения всего, включая WiFi и "просыпанием в 3 ms".
Возможно, покопавшись, создав все условия, опустить где-то до пары mA, когда программно отключено всё... Но тогда просыпание увеличиться - надо заново настраивать и ждать выхода в режим PLL и пробуждать командами по SPI Flash из спящего режима...
 

pvvx

Активный участник сообщества
RTL8711AM таких проблем не имеют. В систему встроена поддержка режимов энергосбережения и при его ресурсах (RAM heap 2250864 в данном замере) он потребляет примерно 5 мА, сохраняя всю функциональность (включен WiFi, соединено с внешней AP, HTTPпрочие сервисы активны). Система работает по событиям от всей периферии, проц отрабатывает события на полной скорости, а затем засыпает до следующего события. Некоторые события он собирает в стек событий и обрабатывает их скопом. Это наглядно видно, на диаграмме – идет прием beacon от APследующих каждые 100.24 сек:
Снимок1350.gif
(замер потребления RTL8711AM сделан на ESP8266 с INA219 в тестовом примере web-свалки)
Нажатие кнопок и прочее сопровождается увеличением потребления на время обработки...
Но и 5 мА - это много. В RTL проще включить режим deep_sleep с просыпанием по кнопке.
 

nikolz

Well-known member
Про deep sleep в инете много написано, погружаться в него просто, просыпаться тоже несложно (как по таймеру, так и замыканием RST с GND), но для моего девайса с одной кнопкой я так и не понял как сделать так, чтобы первое нажатие пробуждало ESP (путем резета), а вот все последующие уже работали в рамках программы (до следующего сна).

Про light sleep пока не могу найти понятного описания как его использовать (в рамках Arduino IDE) и как сделать из него выход по нажатию кнопки.

Можете поделиться ссылкой на простое описание (понятное совсем новичку) или тут написать как зайти в LS (без таймера выхода) и выйти из него по кнопке (висящей, к примеру, на D0)
--------------------
Могу предложить три варианта решения.
1) Это бесконечный deep sleep и включение по кнопке. В этом варианте ESP время просыпания примерно 0.3 сек, а очередное нажатие возможно лишь через 0.6 сек. Но батарейка будет максимально экономится.
---------------------------------
2) Это режим light sleep в него ESP сам зайдет, если процессор будет простаивать более секунды, и выйдет по нажатию кнопки. В этом режиме ESP всегда следит за сигналами в эфире. поэтому быстро входит и быстро соединяется по WIFI.
Но по потреблению это не ноль.
---------------------------------------
3) Это сочетание двух первых режимов или как вы хотите (первое нажатие - выход из сна а потом работа по нажатию )
Для этого вам необходимо поставит дополнительную схемку, чтобы изменять пин подключения кнопки или сделать две кнопки .
-----------------------------------------
 

nikolz

Well-known member
при запуске в режиме станции WiFi.mode(WIFI_STA);
режим light sleep по умолчанию. Т е ничего делать не надо.
но для гарантии можно добавить:

Код:
ехЬегп «С» {
#include "user_interface.h"
   wifi_set_sleep_type (LIGHT_SLEEP_T);
}
 
Последнее редактирование:

pvvx

Активный участник сообщества
при запуске в режиме станции WiFi.mode(WIFI_STA);
режим light sleep по умолчанию. Т е ничего делать не надо.
но для гарантии можно добавить:

Код:
ехЬегп «С» {
#include "user_interface.h"
   wifi_set_sleep_type (LIGHT_SLEEP_T);
}
По умолчанию у Station режим MODEM
 

Makc1806

New member
Примечание:
Установите контакты в состоянии выхода в состояние ввода, например, MTDO, U0TXD, GPIO0, прежде чем включать Light-sleep для устранить ток утечки, чтобы потребление энергии могло быть еще ниже.
Примечание:
ESP8266 автоматически переходит в режим «Спящий режим» при подключении к Wi-Fi при простоя CPU
Последнее предложение не совсем понятно. Как же MTDO, U0TXD, GPIO0 установить контакты в состоянии выхода в состояние ввода?

Я со своими баранами пришел, спрошу и здесь. Ветка жива и как-бы по этой теме. Делал/повторял погодную станцию на двух замечательных штуках - OLED 128x64 + esp-01, получающую прогноз погоды на 10 дней + время + датчик с thingspeak + данные аэропорта (скорость, направление ветра, давление, влажность, точка росы, UV).
Каждые 20 мин wi-fi включается и грузит актуальные данные, после крутится ui.display с промежутками 10 сек по кругу 7 экранов. с потреблением ~20мА.

Поставил задачу - реализовать откл. по честному ligt sleep в периодах между "экранами" с отключением проца (может как-то flash, но это, наверное, из области фантастики), - не могу решить :(

Deep sleep не подходит, т.к. данные нужно хранить в оперативке и через 10 сек. для следующего экрана включать Modem sleep, так что-бы проц отработал i2c подключенный дисплей.

Итого:
OLED ~2,1мА.
esp-01 (в основном light sleep) ~8мА (мечты, мечты...).
Было-бы самое оно!

Я так понял, с родным SDK - никак не добиться выключения "crystal", system clock, GPIO state, как заявлено ?

Работаю через IDE с библиотеками и менеджером плат. Перепробовал все варианты с Light sleep -ом, черт его подери!
Вот в режиме модем:
Код:
  WiFi.disconnect();
  WiFi.mode(WIFI_OFF);
WiFi.setSleepMode(WIFI_MODEM_SLEEP);
  WiFi.forceSleepBegin();
хоть с параметрами в мс, хоть навечно, гарантировано не работает радио, пока не скажешь:
Код:
  WiFi.forceSleepWake(); delay(1);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PWD);
но проц работает, вижу по oled секунды идут, все хорошо -потребление с 78-80мА падает гарантировано до ~20мА. Все хорошо, все правильно.
Но вот с ligt sleep - беда.
Скетч компилится без ошибок, заливается, а псле Light_Sleep в коде, вместо Modem_Sleep, проц ... работает, а не должен-же? Должен пропускать такты, экономить энергию. И потребление остается 20мА. Какие там 1,5-1,8мА, заявленные, так даже не 15?
Поискал по библиотекам, нашел, что в SDK папке с ESP8266_NONOS_SDK_V1.5.3_16_04_16 в файле user_interface.h написано так:
typedef enum { NONE_SLEEP_T = 0, LIGHT_SLEEP_T , MODEM_SLEEP_T}sleep_type_t;
но должно же быть так: typedef enum { NONE_SLEEP_T = 0, LIGHT_SLEEP_T = 1, MODEM_SLEEP_T =2}sleep_type_t;
по аналогии с typedef enum { PHY_MODE_11B = 1, PHY_MODE_11G = 2, PHY_MODE_11N = 3} phy_mode_t;
Поправил, скомпилил, залил - не оно. :(

Светодиод, про который все говорят, к стати, на esp-01 потребляет около 1-1,5мА несчастных и никак не 8! Отпаян благополучно.

Может есть, т.с. ветераны ESP, кто пробовал старые SDK (noWiFI), там работало с низким потреблением?
У меня контроллер ок. 2 недель, может что-то упустил?
Ткните носом.

Кто что скажет?

Спасибо!
 

pvvx

Активный участник сообщества
Кто что скажет?
Погоду в эфире WiFi упустили.
Китайцы из Espressif делали замер в режиме LightSleep в темной комнате с темной кошкой :). Конкретно в помещении изолированном от внешних сигналов и при подключении к специально настроенной AP этого тестового модуля. При этом измерялось потребление только чипа ESP8266, без Flash, работающей на 80 МГц QIO. При этом получили порядок более 1.5 мА при DTIM3. Пропуск 3-х приемов beacon от AP и время следования becon увеличили - там можно до 60 секунд :) 3*60 :) Проще было загнать в полный deep_sleep...
Ну а так, основная беда в долгом выходе на режим PLL. Когда рубят проц и все потроха на промежуток между приемом (окна активности для приема) beacon (стандартный шаг передачи AP - 100.24 мс, но он имеет право запаздывать из-за нерадивых модулей нарушающих арбитраж - типа ESP8266, тогда все клиенты у этой станции просыпаются и ждут beacon глотая батарейки), то все настройки частоты CPU и прочих таймеров, включая PLL WiFi улетают. После задания в них рабочих параметров надо ждать установки и долго... для 100 ms это уже чувствительные проценты... Беда в кривости разработки чипа. Он, и его коды в ROM, расcчитаны на другой кварц, с большей частотой, а eFuse не предусмотрены. При нем он становиться совсем утюгом и глючит - по этому сместили частоту кварца ниже. Чип при этом стартует (просыпается) с аппаратными предустановками на расчетный кварц, что и создает ещё большие проблемы...
Ну и о погоде - когда модуль принимает какие-то пакеты на своем канале, то он должен разобраться - не ему ли они и т.д. По этому, если эфир загажен, то ESP8266 вообще не входит в sleep. Так-же это всё зависит от связки с какой AP он работает и какие клиенты ещё у данной AP, если ESP8266 - то бяда... Может AP ему кричит каждый beacon - "Не спи - замерзнешь!" :) или требует ответить модуль - "отвалился уже или нет?" и договориться о следующих пропусках DTIM и режимах данного модуля...
Посмотите графики реальных погодных условий - ночью потребление со sleep light у модуля в городе меньше ... Отличается в разы.
Потребление модулем в разных режимах WiFi-sleep модуля
Кроме этих бяк, в sleep light китайцы ставят таймер у LwIP в дцать раз реже и у него не отрабатывают процедуры поддержки стека TCP, например все паузы до рассоединения по тишине становятся в сотни раз больше, как и другие задержки отработки передачи и приема. В итоге нельзя передавать более нескольких пакетов TCP - случиться затор кучи в RAM открытых буферов и LwIP может вообще накрыться, без возможности восстановления без перезагрузки. О общающихся с ним по сети устройствах и возникающих от этого заторов и нарушений спецификаций разговор уже не идет... Расчетный квант таймера для служебных нужд у LwIP - 25 мс.
 
Последнее редактирование:

Makc1806

New member
Спасибо за ответ!
Посмотите графики реальных погодных условий - ночью потребление со sleep light у модуля в городе меньше ... Отличается в разы.
Сейчас и в многоквартирном доме не отличается, точки уже никто на ночь не выключает.
Четко 20мА +- 2мА, что днем, что ночью. Уже два дня копаюсь активно.
И вот тут я не пойму, Вы говорите:
Ну и о погоде - когда модуль принимает какие-то пакеты на своем канале, то он должен разобраться - не ему ли они и т.д. По этому, если эфир загажен, то ESP8266 вообще не входит в sleep. Так-же это всё зависит от связки с какой AP он работает и какие клиенты ещё у данной AP, если ESP8266 - то бяда... Может AP ему кричит каждый beacon - "Не спи - замерзнешь!" :) или требует ответить модуль - "отвалился уже или нет?" и договориться о следующих пропусках DTIM и режимах данного модуля...
Как он их, собака принимает, если я мыслимыми и не мыслимыми способами:
Код:
  WiFi.disconnect();
  WiFi.mode(WIFI_OFF);
  WiFi.setSleepMode(WIFI_LIGHT_SLEEP);
  WiFi.forceSleepBegin();
  delay(500);
радио отключаю, нет его, всё! Нечем же слушать/прислушиваться. От точки отключен, блок радио отключен. После таких команд не то что просто что-то получить я к точке уже не подключюсь никак. Я так понимаю: ~18мА - это рабочий проц, и судя по работе ui.display - он там и не думает "засыпать", и ничё себе там в потрохах не отключает, как заявлено. Может кодеры где-то на грабли в задуманном Ligth sleep наступили, - и решили: "да ну нафик", будет жрать больше, а там даст бог - русские допилят :)

А вот это:
для 100 ms это уже чувствительные проценты... Беда в кривости разработки чипа. Он, и его коды в ROM, расcчитаны на другой кварц, с большей частотой, а eFuse не предусмотрены. При нем он становиться совсем утюгом и глючит - по этому сместили частоту кварца ниже. Чип при этом стартует (просыпается) с аппаратными предустановками на расчетный кварц, что и создает ещё большие проблемы...
Уже меня загоняет в Deep Sleep :confused: Эх, как все хорошо представлялось.
 

nikolz

Well-known member
У меня работает, но пишу на СИ.
Возможно, что у Вас процессор не простаивает.
---------------------
Вот выдержка из документации:
Режим легкий сон можно использовать в сценариях, где ESP должно оставаться подключенным к маршрутизатору и может реагировать на передачу данных с маршрутизатора в режиме реального времени.
Перед тем как принимать команды, CPU может простаивать.
Примером может служить переключатель Wi-Fi, процессор не работает большую часть времени и только выполняет операции при получении управляющего сигнала по GPIO.
Во время Light-sleep CPU приостанавливается и не реагирует на сигналы и прерывания От периферийных аппаратных интерфейсов. Поэтому, ESP8266 необходимо разбудить через Внешний GPIO. Процесс пробуждения составляет менее 3 мс.
Для активации от внешнего сигнала надо сделать так
For example, GPIO12 can be set as the external wake-up pin via the following interface:
GPIO_DIS_OUTPIT(12);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
wifi_enable_gpio_wakeup(12, GPIO_PIN_INTR_LOLEVEL);
--------------------
GPIO16 cannot be used for wake-ups.
 

nikolz

Well-known member
вот нашел пример для ардуины:
void loop()
{
Serial.println("Did something, go back to sleep...");

wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
gpio_pin_wakeup_enable(GPIO_ID_PIN(5), GPIO_PIN_INTR_HILEVEL);
wifi_fpm_open(); // Enables force sleep
wifi_fpm_do_sleep(0xFFFFFFF); // Sleep for longest possible time
delay(100);
}
- See more at: First IoT-Project - Trouble with Light Sleep Mode - Everything ESP8266
 

Makc1806

New member
У меня работает, но пишу на СИ.
Возможно, что у Вас процессор не простаивает.
Возможно.
Эх, мне до СИ еще учиться и учиться.
Пробовал этот:
Код:
#include "user_interface.h"
#include "gpio.h"

void setup() {
  // put your setup code here, to run once:
}

void loop() {
Serial.println("Did something, go back to sleep...");

wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
gpio_pin_wakeup_enable(GPIO_ID_PIN(5), GPIO_PIN_INTR_HILEVEL);
wifi_fpm_open(); // Enables force sleep
wifi_fpm_do_sleep(0xFFFFFFF); // Sleep for longest possible time
delay(100);
}
код. Не компилируется с
Arduino: 1.8.2 (Windows XP), Плата:"Generic ESP8266 Module, 80 MHz, 40MHz, DIO, 115200, 1M (512K SPIFFS), ck, Disabled, None"

Archiving built core (caching) in: C:\Temp\arduino_cache_136386\core\core_esp8266_esp8266_generic_CpuFrequency_80,FlashFreq_40,FlashMode_dio,UploadSpeed_115200,FlashSize_1M512,ResetMethod_ck,Debug_Disabled,DebugLevel_None_____aed81147265508f993da2faaa2980e89.a
sketch\Test_light_sleep.ino.cpp.o:(.text.loop+0xc): undefined reference to `wifi_fpm_set_sleep_type(sleep_type_t)'

sketch\Test_light_sleep.ino.cpp.o:(.text.loop+0x10): undefined reference to `gpio_pin_wakeup_enable(unsigned int, GPIO_INT_TYPE)'

sketch\Test_light_sleep.ino.cpp.o:(.text.loop+0x14): undefined reference to `wifi_fpm_open()'

sketch\Test_light_sleep.ino.cpp.o:(.text.loop+0x18): undefined reference to `wifi_fpm_do_sleep(unsigned int)'

sketch\Test_light_sleep.ino.cpp.o: In function `loop':

D:\Install\Arduino\works\Test_light_sleep/Test_light_sleep.ino:8: undefined reference to `wifi_fpm_set_sleep_type(sleep_type_t)'

D:\Install\Arduino\works\Test_light_sleep/Test_light_sleep.ino:11: undefined reference to `gpio_pin_wakeup_enable(unsigned int, GPIO_INT_TYPE)'

D:\Install\Arduino\works\Test_light_sleep/Test_light_sleep.ino:11: undefined reference to `wifi_fpm_open()'

D:\Install\Arduino\works\Test_light_sleep/Test_light_sleep.ino:12: undefined reference to `wifi_fpm_do_sleep(unsigned int)'

collect2.exe: error: ld returned 1 exit status

exit status 1
Ошибка компиляции для платы Generic ESP8266 Module.
такое было с nano и вообще с arduino на XP, лечилось добавлением буферных переменных (ненужных), например int var01, var02, var03; и т.д. Но теперь не лечится :(
Остальные скетчи компилируются.

UPD 13.04.17: Нашел ошибку, добавлять библиотеки SDK нужно так:
Код:
extern "C" {
  #include "user_interface.h"
}
пропустил пример ув. tretyakov_sa, спасибо!

Как заставить процессор простаивать гарантировано? delay() ?
 
Последнее редактирование:

nikolz

Well-known member
Нашел у японцев вариант на ардуине
выкладываю как есть:
Схема включения:
upload_2017-4-11_19-48-30.png

программа как есть, разбирайтесь.
Код:
#include <ESP8266WiFi.h>
extern "C" {
#include "user_interface.h"
#include "gpio.h"
}
#define START_MSG String(__FILE__) + " start."
#define RED_LED 15
#define SW1 0
#define SW2 2
const char* ssid = "ssid";
const char* password = "password";
void ap_connect() {
digitalWrite(RED_LED, 0);
Serial.println("\nstart ap_connect()");
WiFi.mode(WIFI_STA);
wifi_station_set_auto_connect(false);
WiFi.begin(ssid, password);
int n;
while ((n = WiFi.status()) != WL_CONNECTED) {
Serial.print(String(n) + " ");
delay(500);
if (n == WL_NO_SSID_AVAIL || n == WL_CONNECT_FAILED)
WiFi.reconnect();
}
Serial.println("\nap_connect() done.");
}

void ap_disconnect() {
if (WiFi.status() != WL_CONNECTED)
return; 
WiFi.disconnect();
int n;
while ((n = WiFi.status()) != WL_IDLE_STATUS) {
Serial.print(String(n) + " ");
delay(100);
}       
Serial.println("ap_disconnect() done.");
}

void setup() {
Serial.begin(115200);
delay(10);
Serial.println("\n" + START_MSG);
WiFi.mode(WIFI_STA);
pinMode(RED_LED, OUTPUT);
digitalWrite(RED_LED, 0);
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);
}
void fpm_wakup_cb(void)
{
Serial.println("fpm_wakup_cb start");
gpio_pin_wakeup_disable();
wifi_fpm_close(); // disable force sleep function
}
void start_light_sleep() {
Serial.println("start_light_sleep() start.");
digitalWrite(RED_LED, 0);
ap_disconnect();
WiFi.mode(WIFI_OFF);
wifi_set_opmode_current(NULL_MODE);
wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
wifi_fpm_open();
gpio_pin_wakeup_enable(0, GPIO_PIN_INTR_LOLEVEL);
gpio_pin_wakeup_enable(2, GPIO_PIN_INTR_LOLEVEL);
wifi_fpm_set_wakeup_cb(fpm_wakup_cb); // Set wakeup callback
wifi_fpm_do_sleep(0xFFFFFFF); // sleep until gpio activity.
delay(10);
Serial.println("start_light_sleep() wake up.");
}

void loop() {
static int counter = 0;
delay(400);
if (counter++ % 3 == 0) {
digitalWrite(RED_LED, digitalRead(RED_LED) ^ 1);
Serial.print(".");
}
if (digitalRead(SW1) == LOW) {
Serial.println("\nsw1_pushed");
start_light_sleep();
} else if (digitalRead(SW2) == LOW) {
Serial.println("\nsw2_pushed");
if (WiFi.status() != WL_CONNECTED)
ap_connect();
else
ap_disconnect();
}
}
 

pvvx

Активный участник сообщества
радио отключаю, нет его, всё! Нечем же слушать/прислушиваться. От точки отключен, блок радио отключен. После таких команд не то что просто что-то получить я к точке уже не подключюсь никак. Я так понимаю: ~18мА - это рабочий проц, и судя по работе ui.display - он там и не думает "засыпать", и ничё себе там в потрохах не отключает, как заявлено.
да, примерно 18 mA и есть работающий CPU ESP8266, простаивающий на специальной команде ожидания прерывания для уменьшения потребления.
Конкретно вот тут: esp8266web/ets_run.c at master · pvvx/esp8266web · GitHub , в ROM-BIOS функции ets_run().
Может кодеры где-то на грабли в задуманном Ligth sleep наступили, - и решили: "да ну нафик", будет жрать больше, а там даст бог - русские допилят :)
Это вы попутали. WiFi sleep и системный sleep моды... Это разные функции и включение их производиться по разному...
Сейчас и в многоквартирном доме не отличается, точки уже никто на ночь не выключает.
Четко 20мА +- 2мА, что днем, что ночью. Уже два дня копаюсь активно.
Когда запустите WiFi в режиме Ligh Sleep - увидите. Пакеты передают не только точки доступа (AP), но и клиенты... AP обязана следить за каналом и в соответствии с его загрузкой (вплоть до внешних BT устройств и прочих шумов) строить свой арбитраж, что, к примеру ESP8266 в SoftAP не умеет и не сертифицирован у альянса WiFi. В итоге даже специализированный AP на Cisco не помогает справиться с выходками ESP8266 на канале... И счас большинство устройств WiFi имеет HT40, а не HT20. ESP8266 не понимает HT40 - для него это шум. В режиме SoftAP+ST или SoftAP при рядом работающей другой AP он асинхронно вставляет свои beacon и мешает всем другим работать...
Не стоит рекомендовать устаревший чип для применения в общественных местах... В лесу или деревне, куда не докатилась "цивилизация" можно использовать и ESP-NOW для передачи редких данных типа погоды... Или вообще свой протокол - просыпаться и передавать один пакет своего формата другому ESP-приемнику. Время такого просыпания - сотня ms (загрузка кода и инициализация передатчика).
 
Последнее редактирование:
Сверху Снизу