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

Геннадий П

★★★★★✩✩
14 Апр 2021
1,132
373
42
@S_Sergey_G, Очень странно. Судя по падению напряжения ток около 1 мА, хотя должен быть около 2.5 мА. Может контроллер дохленький. Нужно с другим пробовать.
Либо как вариант поставить мосфет вместо биполярника, тогда скорее всего заработает. Но мосфет нужен с низким напряжением открытия.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
@DAK,
Да такое подключение рабочее, но проверить до конца не могу, на эмиторе всего 2,6 вольта, не достаточно для работы серво.
 

DAK

★★★✩✩✩✩
8 Окт 2020
522
147
Ставь либо мосфит с низким напряжение открытия, либо делай как я выше написал, при этом убирай резистор. Должно помоч
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
@Старик Похабыч,
mg90S , но напряжение 2,6 маловато.
@DAK,
Так я и сделал как Вы писали выше. Если в эмиттерную цепь включаю для проверки светодиод вместо привода все работает как надо, транзистор открывается-закрывается, светодиод загорается-тухнет. Если подсоединить привод то всё также работает, проверял тестером, но привод не крутится, т.к напряжение на эмиттере всего 2,6 вольта. Надо попробовать полевик подобрать подходящий
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
2,142
646
200мА потребления сервопривода в максимуме при правильном включении транзистора должны давать примерно 5мА тока базы для выбранного транзистора. При 0,6В прямого перехода база-эмиттер, питании 3,3В и резисторе 1кОм - в лучшем случае получаем 2,7мА. Т.е. где-то точно есть ошибка: в схеме, номиналах, или исправности элементов.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
Пока схему оставил такую: Всё чётко срабатывает.
Но возникла друга проблема, программная. Это просыпание ESP, на каждый час отстаём на 1 мин. За сутки это будет ~ 24 мин. отставания, что совсем не хорошо.
Это как то корректируется?
 

Вложения

  • 37 KB Просмотры: 5
  • 172.3 KB Просмотры: 5

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

★★★★★★★
14 Авг 2019
3,713
1,122
Москва
Только подбором интервала сна. + -.
В любом варианте корм надо будет как то засыпать. Тогда интервал можно обнулить включением и выключением устройства.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
@Старик Похабыч,
Это понятно, корм насыпать буду через 10 дней + - и по любому кормушка сработает не в 12 часов так в 14 часов. Но хотелось бы стабильности, код можно применять и в других проектах где нужна точность.
Надо делать с внешним RTC. На Ардуино у меня получилось с RTC, а вот адоптировать под ESP не получается.
 

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

★★★★★★★
14 Авг 2019
3,713
1,122
Москва
Как вариант выставить часы, при включении просто брать с них время и если время в нужном промежутке - кормить. Это если что бы не использовать будильник. RTC есть с батарейкой-таблеткой, вот их использовать можно.
Стабильности большой от внутренних часов esp ждать не приходится, там вроде RC цепочка, она еще будет от температуры зависить.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
@Старик Похабыч,
Вот рабочий код на Ардуино.
C++:
// SQW -D2
// SCL - A5
// SDA - A4
#include <avr/sleep.h>
#include <Wire.h>
#include <DS3231.h>
#include <Servo.h>
Servo servo;
DS3231 clock;

void alarmFunction() {
  // Обработчик ничего не делает
}

void setup() {
  // Инициализация RTC, сброс будильников
  clock.begin();
  clock.enableOutput(false); // INT/SQW используем для генерации прерываний
  clock.armAlarm1(false);    // Запрещаем прерывания от будильников
  clock.armAlarm2(false);
  clock.clearAlarm1();       // Сбрасываем флаги будильников
  clock.clearAlarm2();

  // Выставляем будильник 1
  //clock.setAlarm1(0, 0, 0, 10, DS3231_MATCH_S); // Сигнал в 10 секунд каждой минуты
  clock.setAlarm1(0, 8, 10, 10, DS3231_MATCH_H_M_S); // Сигнал ежедневно в 8:10:00
  //clock.setAlarm1(0, 0, 0, 5, DS3231_EVERY_SECOND);
 
  // Выставляем будильник 2
  //clock.setAlarm2(0, 0, 0, DS3231_EVERY_MINUTE);
  //clock.setAlarm2(0, 14, 10, DS3231_MATCH_H_M);
 
  // Разрешаем внешнее прерывание по сигналу будильника
  pinMode(2, INPUT_PULLUP); // Вход нужно подтянуть к питанию
  attachInterrupt(0, alarmFunction, FALLING); // Разрешаем прерывание
  servo.attach(3); //
  pinMode(8, OUTPUT); // питание сервопривода
  pinMode(13, OUTPUT); // Светодиод на 13 выводе
  ADCSRA &= ~(1 << ADEN); // Отключаем АЦП
}

void loop() {
  //Переходим в режим энергосбережения
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  noInterrupts();
  sleep_enable();
  MCUCR = bit (BODS) | bit (BODSE);
  MCUCR = bit (BODS);
  interrupts();
  sleep_cpu();

  // Проснулись
  sleep_disable();
 
  // Проверка флага будильника может оказаться полезной
  // на случай пробуждения по другой причине
  if (clock.isAlarm1()) {
    // Будильник 1, действительно, сработал
    clock.clearAlarm1(); // Сбрасываем его флаг
  //}
  //if (clock.isAlarm2()) { // Сработал второй будильник
  //    clock.clearAlarm2();
    digitalWrite(8, HIGH);
    servo.write(180);
    delay(2000); //ждем 2 секунды
    servo.write(50);
    delay(10);
    //Включаем светодиод на 2 секунды
    digitalWrite(13, HIGH);
    delay(2000);
    digitalWrite(13, LOW);
    //delay(200);
    digitalWrite(8, LOW);
    delay(100);
    // Можно спать дальше
  }
}
Вторую неделю на прогоне стоит, срабатывание точное.
А вот как его переделать на ESP не знаю, нужна помощь.
 

VictorArx

★✩✩✩✩✩✩
22 Мар 2021
260
42
@S_Sergey_G, У мосфетов большое входное сопротивление попробуй. Если нет мосфета поставь эмитерный повторитель. Вообще есть спец по ESP зовут Эдуард . Напиши ему.
 

DAK

★★★✩✩✩✩
8 Окт 2020
522
147
Да сюда прямо просится мосфет, при этом его размер будет на столько мал, на сколько можно только представить. А ток через gpio будет зависить только от резистора подтяжки. Мосфетов этих тьма в продаже, трудностей нет, а если речь про энергосбережение, то как раз в эту сторону и надо копать.
 
  • Лойс +1
Реакции: S_Sergey_G

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
@VictorArx, @DAK,
Я про полевик писал выше. Сегодня собрал схему на D4184 всё работает как надо. Но к сожалению deepsleep подвел своей не точностью просыпания, на каждый час минус 1 минута. Может есть решение подключить внешний резонатор на ESP.
 

DAK

★★★✩✩✩✩
8 Окт 2020
522
147

@S_Sergey_G,
Если на каждый час ровно 1 минута, может просто переработать алгоритм с учётом этой особенности пусть так и будет.
 
  • Лойс +1
Реакции: S_Sergey_G

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
@DAK,
Это надо как то реализовать, чтобы после каждого просыпания прибавлял 1 минуту?
 

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

★★★★★★★
14 Авг 2019
3,713
1,122
Москва
Вот это: ESP.deepSleep(10e6)
как раз усыпляет esp. А 10e6 это как раз и есть время на которое esp засыпает.
Т.е. надо вместо 1 часа поставить 59 мину.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
@Старик Похабыч,
И как это поможет. ESP просыпается каждый час ( ESP.deepSleep(3600e6) с отставанием на 1 минуту, через 24 раза ((reset_counter % 24 == 0)), когда надо включить привод это будет минус 24 мин. и сработает не через 24 часа а через 23 часа и 36 мин. А дальше ещё хуже.
 

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

★★★★★★★
14 Авг 2019
3,713
1,122
Москва
Мы говорим просыпаться esp раз в час, это 3600 секунд и видим, что esp проснулась раньше на 1 минуту. Значит ей надо на 1 минуту спать дольше
1 минута это 60 сек. Значит пусть спит 3660 секунд (в понимании esp)
 
  • Лойс +1
Реакции: DAK

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

★★★★★★★
14 Авг 2019
3,713
1,122
Москва
Так и засыпает же каждый час. Все будет повторятся снова и снова. Это константа, она соответствует сколько секунд в понятии есп соответствует реальному часу.
 
  • Лойс +1
Реакции: S_Sergey_G и DAK

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
@Старик Похабыч,
Да, спасибо большое, теперь всё понял, прибавив 1 минуту к часу, ESP будет "игнорировать" её каждый раз. Теперь через сериал порт понаблюдаю несколько суток на сколько + - уйдёт ESP от заданного времени.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
96
0
В общем внутренний RTC очень плохо подходит даже не для точного отсчёта. В помещении где температура более менее стабильна можно подобрать время сна, тогда точность будет +- 10-15 сек. Но вот вынес кормушку на улицу и поплыло всё. Включил её при +20С сейчас +8С и 40 мин отставания. В мороз ещё больше будет. Для моего проекта конечно пойдёт но в целом очень плохо. Только с DS3231 надо делать. Но там свои заморочки с энергопотреблением.