• Система автоматизации с открытым исходным кодом на базе 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 (загрузка кода и инициализация передатчика).
 
Последнее редактирование:
Сверху Снизу