Не просыпается ESP-01s после длительного DeepSleep

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
Собрал автоматическую кормушку на ESP-01s. Потребности такие, автономность, экономичность по питанию и срабатывание раз в сутки. При проверке на короткое время (10минт, час) всё работает прекрасно, но при установки deepsleep на 8 часов (для проверки) кормушка не просыпается. В чём может быть причина? Может у DeepSleep есть какие-то ограничения?
C++:
#include <Servo.h>
 Servo servo;

void setup() {
  Serial.begin(115200);
  servo.attach(0); //GPIO 0
  servo.write(180);
  delay(2000); //ждем 2 секунды
  servo.write(50);

  ESP.deepSleep(28800e6);
}

void loop() {
}
 

Bruzzer

★✩✩✩✩✩✩
23 Май 2020
99
32
@S_Sergey_G,
Да ограничения есть. По спойлером цитата из описания к примеру библиотеки
esp8266\examples\LowPowerDemo\README.md
Since SDK 2.1 the maximum Deep Sleep time has changed. The old maximum was based on uint32_t(micros) or ~71.58 minutes (2^32-1 microseconds). The new maximum is calculated from the RTC clock, which drifts with temperature from 5 to 7 timer ticks per microsecond, and will return a different number each time you read system_rtc_clock_cali_proc(). Depending on CPU and temperature, you will get between 3 and 4 hours maximum Deep Sleep. You can read the current theoretical maximum with uint64_t deepSleepMax = ESP.deepSleepMax(); although you should set your time a little less than that due to the RTC drift. If you go over the maximum time when you finally enter Deep Sleep, it disconnects the timer and won't wake without an external RESET.

If you need a longer sleep time than 3 hours, you can pass zero as the time variable to Deep Sleep and it disconnects the RTC. The only way to wake it at that point is an external RESET; D0 can't do it. Both Forced Light Sleep and Deep Sleep(0) are woken by an external signal, so short delays are more efficient with Forced Light Sleep, and longer delays are more energy efficient with Deep Sleep.
 
  • Лойс +1
Реакции: S_Sergey_G и Andrey12

poty

★★★★★★✩
19 Фев 2020
2,142
646
"В соответствии с ESP8266 SDK максимальное время, на которое вы можете погрузить модуль в сон, составляет 4,294,967,295 µs, что равно примерно 71 минуте."
Это определяется типом переменной
 

poty

★★★★★★✩
19 Фев 2020
2,142
646
@Bruzzer, может быть, если пользоваться какими-либо другими функциями. В функцию ESP.deepSleep() передается uint32_t, обозначающая количество микросекунд. Максимальное значение uint32_t = 232-1 , что соответствует ~71.58 минут.
 
Изменено:

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
@Bruzzer,
Спасибо за пояснение. Значит в моём случае придется использовать внешний RTC модуль.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
3,713
1,122
Москва
Зачем ? Делаете пробуждение раз в час и счетчик. А кормушку запускаете на каждое 24-ое просыпание. Иди нулевое, или 5, не важно. Главное что бы счетчик был типа
с=(с+1)%24;
 
  • Лойс +1
Реакции: S_Sergey_G и Andrey12

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
@Старик Похабыч,
Спасибо, так и попробую сделать.

@Старик Похабыч,
Сделал так:
C++:
#include <Servo.h>
 Servo servo;
void setup()
{
  Serial.begin(115200);
  servo.attach(0); //GPIO 0

  int i = 0;
  while(true)
  {
      if(i % 24 == 0)
      {
           servo.write(180); ////ставим вал под 180
           delay(2000); //ждем 2 секунды
           servo.write(50); //ставим вал под 50
      }
      ESP.deepSleep(10e6);  //выставляем время сна 10 сек для проверки
      i++;
  }
}

void loop() {
}
Но каждые 10 секунд срабатывает кормушка. Что то не так сделал?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
3,713
1,122
Москва
Ну сделайте отладку, я пока понять не могу.
1) замените сон на delay(10000)
2) Выведите значение i
3) Выведите что нибудь при срабатывании условия для действия.

UPD:
залил тест в нанку. Все работает, только надо при движении сервы i обнулить
 
Изменено:

Bruzzer

★✩✩✩✩✩✩
23 Май 2020
99
32
@S_Sergey_G,
Я в 8266 не специалист, так что могу и неправду написать.

Для 8266 после DeepSleep просыпание только через Ресет. Соответственно у вас происходит Reset раз в 10 секунд и срабатывает кормушка.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
3,713
1,122
Москва
Если идет через ресет, то вполне может быть, тогда переменная всегда будет 0 и соотв. будет срабатывание условия.
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
740
161
сохранять переменную в память либо добавить часы реального времени и сделать срабатывание по времени, если NTP не рассматривать
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
740
161
Здесь вопрос в потреблении, которого нужно добиться, можно использовать и другие режимы сна, но потребление в них гораздо выше
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
740
161
Время работы можно емкостью аккумулятора "настроить"
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
Проект на работе, тестировать буду завтра. Кормушка будет на даче, зимой подкармливать котят с кошкой. Автономность нужна, могу и месяц не появиться зимой. Без сна ESP 01s потребляет 70 мА, 150-200 мА серво, но серво можно не брать в расчет, раз в сутки и пару секунд работы. Внешний модуль часов как вариант, но если со сном не получится, возьму часы "монтана" и выход с будильника будет будить ESP.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
3,713
1,122
Москва
Если попробовать режим легкого сна.
1. Посчитать на сколько дрыгов сервоприводом хватит предполагаемого вол-ва акб.
2. Посчитать сколько будет работать при этом esp в 2-х режимах. Может разница и не будет существенной.
 

poty

★★★★★★✩
19 Фев 2020
2,142
646
Я бы прикрутил какой-нибудь оповещатель, потому что ошибка/зависание/нехватка аккумулятора/влияние низких температур - и животинки ради которых это делается не выживут.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
3,713
1,122
Москва
Не могу сказать, я бегло осмотрел. Но задается так же скорее всего, так что ограничение скорее всего будет. Потребление 0.4 мА получается, конечно во много раз больше чем глубокий сон, но все же.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
@Старик Похабыч,
Там в легком сне кажется надо модуль будить самостоятельно. "Установленное здесь время сна является самым длинным, а GPIO2 заземляется с помощью кнопки для пробуждения. "
 

Bruzzer

★✩✩✩✩✩✩
23 Май 2020
99
32
По моему, если у вас есть цель разобраться с программированием 8266, то нужно читать документацию,примеры и пробовать - проверять. Но для новичка там все несколько запутанно. (я в 8266 новичок).
Возможно для этого проекта будет будет быстрее и проще использовать "классическую" ардуину, возможно с внешним модулем часов если нужна точность.