• Система автоматизации с открытым исходным кодом на базе 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мс.
 
Сверху Снизу