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

Нужна помощь Esp8266 deep sleep - глубокий сон

art21_res

New member
Здравствуйте. Начал программировать чип esp8266 12e только несколько дней назад. Купил разные варианты и голый 12e и NodeMCU, пишу на Arduino IDE.

Проблема в следующем! Уже устал перебирать варианты со всех сайтов - не выходит пробудить модуль и чтобы он продолжил работу.

В секции Setup после всех выводов в порт для мониторинга того, что происходит, перевожу в спящий режим так:

ESP.deepSleep(20 * 1000000);
delay(1);

После вывода в терминал нужных цифр модуль засыпает - как я понял и просыпается с абра-кадаброй в порт и всё! Больше ничего не происходит:

252;233
{l⸮⸮|⸮d⸮|⸮l⸮p⸮|⸮⸮⸮p⸮r⸮b⸮b⸮⸮No⸮lon⸮⸮⸮cpp⸮⸮l{l{l

2017-10-17_10-51-21.png

Даже на RESET не реагирует. По идее после RESET программа должна запуститься заново и зависнуть как и в начале. Но ничего не происходит.


Схема подключения взята с вашего сайта с двумя кнопками. По питанию все ок - лабораторный блок питания.

GPIO-0 и RESET соединял и через резистор как на этом сайте и напрямую - одинаковый результат.

Думал, что проблема именно в этом модуле. Подключил другой - тоже самое.
Попробовал залить на NodeMCU - такая же картина.

Помогите погружать модуль в глубокий сон и его нормально пробуждать.
Очень нужно.

Пример программы:

Код:
#include <ESP8266WiFi.h>

#define PWR 5
#define SENS A0

const int sleepTimeS = 7;

void stopWiFiAndSleep() {
  WiFi.disconnect();
  WiFi.mode(WIFI_OFF);
  WiFi.forceSleepBegin();
  delay(1);
}


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

  pinMode( SENS, INPUT);
  digitalWrite(SENS, 0);

  pinMode(PWR , OUTPUT);

  // Включаем питание на ноге
  digitalWrite(PWR,1);
  delay(20);

  // Читаем значение
  int d1 = analogRead(SENS);
  delay(20);
  int d2 = analogRead(SENS);

  // Выключаем ногу
  digitalWrite(PWR, 0);

  Serial.print(d1);
  Serial.print(";");
  Serial.print(d2);
  Serial.println();

  delay(3000);

  stopWiFiAndSleep();
  ESP.deepSleep(sleepTimeS * 1000000);
  delay(1);

}

void loop()
{

}

СХЕМА ПОДКЛЮЧЕНИЯ

00.jpg
 
Последнее редактирование:

art21_res

New member
1. Подключено согласно схемы?
GPIO16 подключено?
Да, сделал все, как на этой схеме.
Но и на другом модуле со встроенным usb и где gpio-0 и reset нужно соединить - просыпания не происходит. Не пойму почему. И главное судя по публикациям в интернет такой проблемы нет ни у кого.
 

gerkimuyda

New member
Даже на RESET не реагирует.
Вот тут и копайте электронную схему. Т.к. нажатие кнопки RESET должно перезапускать модуль в любом его программном состоянии (даже если повис).
По выходу из deepsleep как раз и происходит дергание reset для перезапуска чипа, но если у вас даже кнопка не работает - тогда и программа работать не будет.
Я на NodeMCU без резистора цеплял, сразу прямой проводок. А приведенная выше схема - то для модулей без готовой обвязки (мини-платки разные).
 

art21_res

New member
Вот тут и копайте электронную схему. Т.к. нажатие кнопки RESET должно перезапускать модуль в любом его программном состоянии (даже если повис).
По выходу из deepsleep как раз и происходит дергание reset для перезапуска чипа, но если у вас даже кнопка не работает - тогда и программа работать не будет.
Я на NodeMCU без резистора цеплял, сразу прямой проводок. А приведенная выше схема - то для модулей без готовой обвязки (мини-платки разные).
Да reset то работает. При нажатии на кнопку модуль мигает однократно синим, но больше ничего не происходит.

Да и для прошивки нужно жать кнопки ресет и запись без этого не прошивается ничего. Ресет работает, судя по тому, что для прошивки он нужен.

Других идей нет.

Давайте так. При нажатии на кнопку ресет в порт шлется билибирда и на этом все останавливается.

Даже на модуле с usb и встроенной кнопкой ресет.
1508250133152-532742370.jpg

У этого модуля так же происходит просто при нажатии на ресет не стартует программа.
 

gerkimuyda

New member
Мы как раз про эту плату и говорим. Если у вас после включения программа не работает - тогда deep sleep тут не причем.
"белеберда" - это стартовая информация на скорости 74880 (перепроверьте). Добейтесь работоспособности программы после физичекого powerup или reset. Потом перейдете к deepsleep. Может у вас там вечный перезапуск из-за WatchDog таймера? Посмотрите сообщения на скорости baud rate 74880.

Пс. deepsleep надо использовать с осторожностью. Если просто так, да и с частотой раз в несколько минут - то через месяц-три можно модуль выкинуть в мусорку. Встроенный SDK по каждому чиху перезаписывает один и тотже кусочек EEPROM памяти. Любые изменения в настройках WiFi, каждое включение/выключение и т.д. приводит к тому, что текущие настройки заново сохраняются в память. Т.е., если наставить всяких "автоконнект выкл" - "автоконнекст вкл" то на ровном месте мы уже два раза перезаписали эту память, плюс сюда процесс подключения - и вот уже третья запись. Таким образом, необдуманно можно добиться нескольких перезаписей (2-5-8) по каждому старту после deepsleep. А если это проиходит каждую минуту - то не трудно подсчитать, через сколько ресурс EEPROM исчерпается и модуль нам "нарисует синий экран смерти" :)
 
Последнее редактирование:

art21_res

New member
Смотрите что происходит при нажатии на RESET без всякого сна!
В LOOP поставил вывод цифр в цикле через небольшую задержку.

Убрано засыпание. Просто в цикле выводятся значения с аналогового входа. Просто и ясно.
1. Выводятся цифры
2. Нажимаю на RESET
3. Появляется надпись " ets Jan 8 2013,rst cause:2, boot mode:(1,7)"
4. Выполнение прекращается.
5. При повторном нажатии на RESET выводится "ets Jan 8 2013,rst cause:2, boot mode:(1,7)"
6. При выключении и включении питания цифра продолжают выводиться.

Код:
void loop
{

 int d1 = analogRead(SENS);
 delay(10);
 int d2 = analogRead(SENS);

 Serial.print(d1);
 Serial.print(";");
 Serial.print(d2);
 Serial.println();

delay(3000);

}


12;13
13;14
14;11

ets Jan 8 2013,rst cause:2, boot mode:(1,7)

Что может быть?
 
Последнее редактирование:

art21_res

New member
Продолжение эксперимента:

1. В секцию loop в конце ставим ESP.deepSleep(sleepTimeS * 1000000);
2. Отображаются цифры, после паузы в несколько секунд выводится следующее:

8;6
ets Jan 8 2013,rst cause:2, boot mode: (1,6)

3. Выполнение прекращается.
 

art21_res

New member
Мы как раз про эту плату и говорим. Если у вас после включения программа не работает - тогда deep sleep тут не причем.
"белеберда" - это стартовая информация на скорости 74880 (перепроверьте). Добейтесь работоспособности программы после физичекого powerup или reset. Потом перейдете к deepsleep. Может у вас там вечный перезапуск из-за WatchDog таймера? Посмотрите сообщения на скорости baud rate 74880.

Как отключить WatchDog таймер?



Пс. deepsleep надо использовать с осторожностью. Если просто так, да и с частотой раз в несколько минут - то через месяц-три можно модуль выкинуть в мусорку. Встроенный SDK по каждому чиху перезаписывает один и тотже кусочек EEPROM памяти. Любые изменения в настройках WiFi, каждое включение/выключение и т.д. приводит к тому, что текущие настройки заново сохраняются в память. Т.е., если наставить всяких "автоконнект выкл" - "автоконнекст вкл" то на ровном месте мы уже два раза перезаписали эту память, плюс сюда процесс подключения - и вот уже третья запись. Таким образом, необдуманно можно добиться нескольких перезаписей (2-5-8) по каждому старту после deepsleep. А если это проиходит каждую минуту - то не трудно подсчитать, через сколько ресурс EEPROM исчерпается и модуль нам "нарисует синий экран смерти" :)
В принципе, если смотреть цена на модуль и количество перезаписей EEPROM - можно с уверенностью сказать, что пока память выйдет из строя даже если перезаписывать каждую минуту, то этого хватит на пару лет, когда это устройство морально уже или устареет или уже будет не нужно. Поэтому, философия про перезапись - не актуальна. Модуль был сделан, чтобы на него смотреть или чтобы он что-то делал? Логично? Если покупать модуль для работы на всю жизнь - то такого не происходит ни с одним устройством, тем более цифровым. Если год-два работает - уже зачет!
 
Последнее редактирование:

gerkimuyda

New member
Как отключить WatchDog таймер?
Если в arduino ide - то лучше просто использовать команду передачи управления для технических нужд фоновым процессам yield();
Да и вачдог не в вашем случае (при его срабатывании модуль перезапускается и в тех.информации упоминается причина - WDT)


В принципе, если смотреть цена на модуль и количество перезаписей EEPROM - можно с уверенностью сказать, что пока память выйдет из строя даже если перезаписывать каждую минуту, то этого хватит на пару лет, когда это устройство морально уже или устареет или уже будет не нужно.
Давайте посчитаем: допустим написали коряво и у нас за один раз 5 стираний. перезапускаем каждую минуту.
5 * 60 минут * 24часа = 7200 стираний в сутки.
100 000 / 7200 = 13 суток
1 000 000 / 7200 = 138 суток = 4-5 месяца.

Как избежать износа EEPROM
 

enjoynering

Well-known member
... Т.е., если наставить всяких "автоконнект выкл" - "автоконнекст вкл" то на ровном месте мы уже два раза перезаписали эту память
а при выключенном deepsleep, но в main loop присутствует WiFi.setAutoReconnect(true), эта настройка будет перезаписываться во флеше при каждом проходе loop?
 

art21_res

New member
а при выключенном deepsleep, но в main loop присутствует WiFi.setAutoReconnect(true), эта настройка будет перезаписываться во флеше при каждом проходе loop?
В loop ничего не будет, если модуль будет просыпаться. Мне нужно разбудить его и чтобы он выполнил программу заново. Цикл то и не нужен. Если в цикле в конце поставить засыпание на час, предположим, то цикл выполняться тоже не будет, т.к. после просыпания происходит выполнение программы заново и цикла как такового нет в программе.
 

gerkimuyda

New member
а при выключенном deepsleep, но в main loop присутствует WiFi.setAutoReconnect(true), эта настройка будет перезаписываться во флеше при каждом проходе loop?
Reconnect не изучал - не знаю. Для этого надо дизассемблировать wifi_station_set_reconnect_policy() (именно ее вызывает ардуиновская WiFi.setAutoReconnect() из ESP8266WiFiSTA.cpp) в закрытой библиотеке user_interface.h из SDK Expressif.
А вот про WiFi.setAutoConnect() - кто мешает сделать проверку WiFi.getAutoConnect() перед вызовом?
Я всего-лишь акцентировал внимание на этом вопросе и подсказал, что о нем забывать не стоит.
 

art21_res

New member
При каждом нажатии на RESET пишет в терминале

ets Jan 8 2013,rst cause:2, boot mode:(1,6)
ets Jan 8 2013,rst cause:2, boot mode:(1,6)
ets Jan 8 2013,rst cause:2, boot mode:(1,6)
ets Jan 8 2013,rst cause:2, boot mode:(1,6)
ets Jan 8 2013,rst cause:2, boot mode:(1,6)
ets Jan 8 2013,rst cause:2, boot mode:(1,6)
ets Jan 8 2013,rst cause:2, boot mode:(1,6)

Что это означает и почему не выполняется программа?
 

gerkimuyda

New member
При каждом нажатии на RESET пишет в терминале
ets Jan 8 2013,rst cause:2, boot mode:(1,6)
А должно быть boot mode 3,6

7 SDIO HighSpeed V2 IO Uart1 Booting
6 SDIO LowSpeed V1 IO Uart1 Booting
5 SDIO HighSpeed V1 IO Uart1 Booting
4 SDIO LowSpeed V2 IO Uart1 Booting
3 FLASH BOOT
2 Jump Boot
1 UART Boot
0 Remapping

Разбирайтесь с правильностью сигналов на ногах при старте

 
Сверху Снизу