Как правильно уложить спать ESP32-S2 с FSM-ULP при использовании WiFi
ฝัง
- เผยแพร่เมื่อ 17 มิ.ย. 2023
- Об утечке тока в глубоком сне МК ESP32-S2 с активным FSM-ULP ядром после использования WiFi.
Код из видео: github.com/MoonFox2006/Power_...
Ссылка на обзор мультиметра GVDA GD128PLUS: • Мультиметр GVDA GD128PLUS - วิทยาศาสตร์และเทคโนโลยี
Спасибо! Очень познавательно.
Спасибо, очень полезно для меня
Спасибо за детектив 😁
Советую попробовать в качестве батарейки для esp32S2 LS14500 Li-SOCl2 на 3,6 В (можно использовать на прямую без LDO). Батарейка не обычная, если esp32s2 подключен к wi-fi (ток 80 - 90мА) то батарейка даёт просадку напряжения до 3,2 3,3 В (из упаковки 3,66В), но когда esp32s2 уходит в сон на час или более, то напряжение восстанавливается до 3,63 В и держится постоянна на этом уровне (опыт без ULP ядра). В принципе если устройство пробуждается не каждых 10 минут, то отличный вариант. Батарейка как заявляет производитель имеет емкость 2600мА/ч, но очень слаботоковая, продолжительная нагрузка не более 50мА должна быть, я так понимаю если бы esp32S2 постоянно находился в рабочем режиме, то этой батарейки на долго бы не хватило и 2600мА даже не "выжать" из её, но в таком импульсном режиме, с микро заполнением она работает не плохо и даже любит такой режим, т. к. переодически этим батарейкам необходимо проводить депасивацию. А еще это максимальная плотнасть энергии при таком компактном размере батарейки AA, для которой батарейный отсек найти не проблема.
Я использую LiFePo4 аккумы в форм-факторе CR123A или 18650, их макс. напряжение 3.6 В тоже прекрасно без LDO подходит к ESP. И они легко тянут работу МК с WiFi.
Сейчас тестирую счетчики воды с аккумом CR123A на 500 мАч (ULP каждые 50 мс., сброс в телеграмм каждые сутки), за месяц напряжение уменьшилось на 0.01-0.02 В, жаль тестирование занимает так много времени...
На обычном ESP-32 примерно такой же результат при работе ULP, только без доп. манипуляций по отключению wifi, а по поводу как тут пишут "зашкала" - 4095 на ADC1, это у них известный баг, причём с ADC2 ещё веселее.....
У меня был зашкал Ацп STM32 блу пилл
вход АЦП был от Rail-to-Rail Opamp с питанием +5.
Vcc < на входе 3,7V код подал примерно до 3500 ..
пришлось ограниничивать .
но питать Rail-to-Rail Opamp от 3.3 не красиво так как выход может чуть не дотягивать до Vcc ..
Такие нюансы не на поверхности лежать. Мне кажется, такое надо в исходную документацию включать.
Я еще нашел одну проблему с этим модулем, если сделать замер с помощью АЦП (analogRead(1)) до подключения к WiFi, то все нормально, но если потом и после подключения к WiFi, то АЦП уже выдает "зашкал" - 4095. А если вообще не вызывать analogRead(1) до подключения к WiFi, то АЦП прекрасно измеряет и с подключенным WiFi.
Вы же именно про ESP32-S2 говорите, не про ESP32?
В доке утверждается, что только ADC2 используется для WiFi, а это GPIO11-20. Я замеряю напряжение батареи до передачи данных по WiFi, поэтому с таким не сталкивался. И в любом случае, я для замера использую ESP-IDF, т.к. там просто подтянуть заводскую калибровку и получить сразу милливольты, а не "попугаи в вакууме". И из-за волатильности ADC на ESP, делаю 3-5 замеров и беру медиану.
Не знаю, только что собрал в PIO на актуальных сейчас версиях пример с подключением к WiFi и потом чтением analogRead(1) на ESP32-S2 - все работает, более того, у ESP32-S2 ADC 13-ти битный, поэтому через мой делитель показания >4096, так что возможно у вас версия фреймворка древняя?
@@alexmorozov73 тут опционально с битностью АЦП, можно хоть 10, хоть 12 или 13 выбрать, я выбрал 12. Версия фреймворка самая последняя. 2.0.9 если память не изменяет.
Судя по коду в дурино фреймворке, АЦП выставляют на максимум битности, а возвращаемое значение сдвигают вправо при необходимости понижения битности.
Но в любом случае, я вашу проблему воспроизвести не смог, у меня все работает с GPIO1 как положено.
А есть полное описание устройства, которое должно работать год и посылать данные счетчика?
ESP-12H на ESP32-S2 без LDO в глубоком сне с ULP каждые 50 мс. потребляет около 150 мкА, т. е. батареи на 1500 мАч хватит на год.
WiFi много жрёт, у меня получилось от него отказаться.
Как автономное устройство использую ble термометр сяоми даже с обычной мощностью пробивает дальше WiFi в мох условиях, прошивка не родная вещает через интервалы - время, температуру, напряжение. Есть контакт для использования как вход или выход
Приемник бот уже на esp может принимать несколько термометров.
Для счетчиков ещё не применял
По даташиту BT тоже немалый ток потребляет на передачу, только что в случае с BT можно обойтись без установления сессии, а значит время передачи значительно сократится. Я делал ролик о передаче данных адвертайзными пакетами, правда их любой может прочитать, но счетчики (имхо) не являются чувствительной информацией.
И на МК из видео (ESP32-S2) нет BT, так что такая оптимизация неприменима. А в ESP32-C3 нет ULP, надо брать или ESP32 или ESP32-S3.
Немного "удивил" меня ватериус, открытый проект на связке ESP-01 и аттини. По их расчетам все должно работать 4 года. Правда они считают, что ESP-01 в глубоком сне потребляет 17 мкА (как написано в даташите), а пот факту это совсем не так, потребление составляет сотни мкА. Это помимо подтягивающих резисторов меньше 10 кОм, а значит ток через них уже будет весьма заметным, а в счетчиках герконы могут быть замкнуты на довольно долгое время в случае "неудачной" остановки расхода...
@@alexmorozov73 есть stm8l она тоже "ничего" не потребляет в связке с есп ее можно раз в сутки будить или по "тревоге".
Конкретно мне нужен в первую очередь термометр а у сяоми за 400р готовое решение с автономность в год минимум, ну если не перепрошивать каждый день
Так глубокий сон с пробуждением по таймеру без использования всяких ULP и т.п. и так на всех ESP потребляет десятки мкА, что в пересчете на емкость средней батареи дает год+. Проблема наступает тогда, когда надо не только раз в сутки просыпаться, а еще что-то делать в процессе сна. И желательно обойтись без зоопарка только средствами выбранного основного МК.
Готовые решения термометров с BT скорее всего используют МК NRF, так что сравнение с ESP некорректно в принципе.
Зачем столько выноса мозга. Вы нещаднык чужому времени.
Сразу бы сказали суть, что улп ядро не умеет нормально засыпать
static void disablePeripherals() {
const int pins[] = { 32, 33, 25, 26, 27, 14, 12, 13, 15, 0, 4, 16, 17, 5, 18, 19, 21, 22, 23 };
for (int i = 0; i < sizeof(pins) / sizeof(pins[0]); i++) {
pinMode(pins[i], INPUT);
}
WiFi.mode(WIFI_OFF);
if (btStarted()) {
btStop();
}
}0 и просыпается до 0.020врде) при проверке пина А так Спосибо хорошие подсказки.... Все супер работает.Будем тестить. if (DEBUG_MODE) Serial.begin(115200);
gpio_pad_select_gpio(WAKEUP_GPIO);
gpio_set_direction(WAKEUP_GPIO, GPIO_MODE_INPUT);
gpio_set_pull_mode(WAKEUP_GPIO, GPIO_PULLUP_ONLY);
esp_sleep_enable_ext0_wakeup(WAKEUP_GPIO, 1);
if (LedOn) rtc_gpio_init(LED_PIN);
if (LedOn) rtc_gpio_set_direction(LED_PIN, RTC_GPIO_MODE_OUTPUT_ONLY);
if (LedOn) rtc_gpio_set_level(LED_PIN, 0);
}
Пины, которые не подключены к RTC периферии, в глубоком сне в любом случае будут полностью отключены, ничего с ними делать не нужно. И потом, все пины при инициализации выключены (не входы и не выходы), а не входы как на AVR, так что лучше что не используется - то и не трогать.
Ну и три команды с одним и тем же условием выполнения очевидно являются составным оператором { ... }, зачем их отдельно писать? :)