работающий легкий сон по таймеру и прерыванию, платка HW-628 v1.1 ток сна 18мА, ток просыпания скачек под 80ма, ток в loop() 33мА
#include "user_interface.h" // для сохранения времени во время легкого сна на основе RTC
#define WAKE_UP_PIN 0 // D3
void wakeupCallback() {//функцию обратного вызова,чтобы лёгкий сон возобновился сразу после тайм-аута или прерывания (без ожидания полной продолжительности delay()
delay(3);// без этого запустится delay(sleepSeconds * 1000 + 1)
Serial.println("обр вызов, сон кончился");
// этот сброс имеет решающее значение, возможно, потому, что это блокирующая команда, которая
// позволяет процессору выйти из функции delay(sleepSeconds * 1000 + 1)
Serial.flush();
}
void sleep(int sleepSeconds) {
extern os_timer_t *timer_list;
timer_list = nullptr;
// wifi_station_disconnect(); //not needed
wifi_set_opmode_current(NULL_MODE);//NULL_MODE — этот параметр отключает Wi-Fi модуль.
wifi_fpm_open();
wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
Serial.println("переход в сон");
Serial.flush();
gpio_pin_wakeup_enable(GPIO_ID_PIN(WAKE_UP_PIN), GPIO_PIN_INTR_LOLEVEL);
wifi_fpm_set_wakeup_cb(wakeupCallback); //функция обязательно, чтобы НЕ выполнялся delay после следующей строки
wifi_fpm_do_sleep(sleepSeconds * 1000 * 1000);//Лёгкий сон по таймеру может длиться от ~10 000 до 0xFFFFFFE = 2^28-1 = 268435454 микросекунд (~4 1/2 минуты)
delay(sleepSeconds * 1000 + 1); // за командой лёгкого сна должен следовать delay() (указанный в миллисекундах), который как минимум на 1 мс длиннее, чем время сна
}
void setup() {
pinMode(WAKE_UP_PIN, INPUT_PULLUP);
Serial.begin(9600);
Serial.println();
}
void loop() {
delay(3); //без этого уходит в сон, но не просыпается
for (int i = 0; i < 3; ++i) {
// Выводим номер пина и соответствующее значение
Serial.print("Analog Pin ");
Serial.print(i + 1);
Serial.print("= ");
Serial.println(analogRead(A0));
delay(1000);
}
sleep(15);
}