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

Нужна помощь light sleep, не реагирует на время сна в light sleep

alexsvk

New member
@Сергей_Ф, я попробовал с разными значениями, но код все равно не правильно срабатывает. После этого я решил вывести reason, она равна 5. Что я делаю не так?
Код:
int REASON_RESET = 0;
extern "C" {
  #include "user_interface.h"
}

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

Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:
struct rst_info *rstInfo = system_get_rst_info();
uint32_t reason = rstInfo->reason;
Serial.println(reason);
if ( reason == REASON_RESET ){
Serial.println("Button");
} else {
Serial.println("Timer");
}
ESP.deepSleep(30e6);
}
 

Сергей_Ф

Moderator
Команда форума
@alexsvk забудьте про loop. Только setup. Loop должен быть пустым.
И проверяйте код не равный 5.
 

alexsvk

New member
@Сергей_Ф, Проблема была в том, что reason был равен 5 в любом случае. И когда просыпаешься по ресету, и когда просыпаешься по времени
 

alexsvk

New member
@Сергей_Ф, не знаю в чем проблема. Но у меня reason одинаковый. Вот код:
Код:
int REASON_RESET = 5;
extern "C" {
  #include "user_interface.h"
}

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

Serial.begin(9600);
struct rst_info *rstInfo = system_get_rst_info();
uint32_t reason = rstInfo->reason;
Serial.println(reason);
if ( reason != REASON_RESET ){
Serial.println("Button");
} else {
Serial.println("Timer");
}
ESP.deepSleep(30e6);
}

void loop() {
  // put your main code here, to run repeatedly:

}
А вот что мне пишет esp:
Снимок экрана (15).png
Последняя 5 после символов - reason
 

Сергей_Ф

Moderator
Команда форума
@alexsvk кажется я понял, почему ваши ожидания не соответствуют выводу программы. Отчасти виноват в этом я - не разжевал всё, надеялся что вы внимательно изучите тему сами с помощью поиска.
Итак, причина в том что код возврата записывается esp перед уходом в сон. Таким образом, если esp уже уснула, то причина пробуждения всегда будет равна 5. Попробуйте поставить задержку перед уходом в сон и нажать ресет до засыпания esp и все будет работать правильно.
 

alexsvk

New member
@Сергей_Ф, Спасибо, помогло. А можно ли сделать так, что бы можно было различать нажатие ресет в любой момент времени? Как избежать того, что, когда нажимаешь на кнопку, то можно попасть именно в сон?
 

Сергей_Ф

Moderator
Команда форума
@alexsvk если допустимо использовать двойное нажатие на кнопку, то небольшая задержка в коде перед уходом в сон, также поможет ;)
Первое нажатие вернёт 5, но мы его обрабатывать не будем, а подождем 250мс, например. Если за это время кнопку нажмут ещё раз, то получим другой код и сделаем то что надо. Просыпаение, естественно, отработает как обычно, но с задержкой 250мс.
 
Сверху Снизу