• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено Уменьшение потребления и прерывания.

Slacky

Member
Любой современный 8-ми/16-ти битный MCU с устраиваемым количеством ножек справиться с вашей задачей и сможете достигнуть потребления при sleep к 0.1 мА :)
Ну мне еще WiFi хотелось бы :)))

Значит эта платка с ebay подойдет ...

Спасибо. Закажу :))
 

pvvx

Активный участник сообщества
Ну мне еще WiFi хотелось бы :)))
Если у вас передача данных раз в час и только аварийное оповещение, то и выйдет среднее менее 1 мА.
В Arduino реализациях соединение модуля с AP происходит в среднем от 5 сек. Передача данных в 1 МБ – это где-то 1 сек. Итого – пусть 6..7 секунд активности модуля при среднем токе в 100 мА. В остальное время работает только внешний MCU по событиям, в sleep режиме – пусть это к 0.2 мА. Нормальные датчики жрут 100..300 мкА в рабочем режиме. В итоге у вас и порядок потребления до средних 1 мА. В часу 3600 секунд –> 100*7/3600 = ~ 0.2 мА от WiFi связи в час …
 
Последнее редактирование:

Slacky

Member
Если у вас передача данных раз в час и только аварийное оповещение, то и выйдет среднее менее 1 мА.
Ну у меня алгоритм придуман такой.

Пока есть основное питание, то висим постоянно в WiFi, отсылает данные сразу, по приходу сигнала с датчиков, на mqtt-брокер, в память записываем только конфиг.

Если основное питание пропало, гасим WiFi, уходим в сон. При сработке датчика просыпаемся, записываем показания в память, проверяем основное питание, если его нет, спим дальше, если есть, то работаем опять по полной программе.
 

pvvx

Активный участник сообщества
С ESP8266 без внешнего MCU не достигнуть стабильности такого исполнения. Его старт сжирает много, но еcли писать не на Arduino, то можно воспользоваться режимом загрузки по 'Jump Boot' (указано ранее). Тогда сам ESP8266 может опрашивать датчики и засыпать, если нет аварийных значений или записывать их в RTC или Flash (при этом не требуется перестройка PLL и прочего – программа опроса пишется на 105/2 MHz CPU без включения WiFi, а по нужде стартует в полном режиме). Но это всё равно выжирает много энергии, больше, чем у вариантов RTL с их deep_sleep и требует внешнего MCU…

Но т.к. у вас Arduino, то довольствуйтесь её ограничениями. :)
 

pvvx

Активный участник сообщества
Внешний процессор не ускорит выход на связь с сервером.
Зато уменьшит потребление в разы, что и есть основной вопрос темы. :p
Но можно и на железных реле сделать... зачем сразу "логические элементы" с резисторами и кондерами, работающие в точках переключения (КЗ выходной CMOP пары :))? Чтобы жрало больше дешевого MCU?

0.35 секунды с жором в 100 mA для приема следующего байта от датчика по I2C? :D
Это как раз время преобразования влажности или температуры у датчиков на I2C, пока они тупят. :p
0.35 MIPS не хватит для расчета в float и прочих данных даже у PIC24FV16... ? :)
Снимок1567.gif
 
Последнее редактирование:

pvvx

Активный участник сообщества
1) У автора всегда подключено WIFI, следовательно внешний MCU ничего не решит.
Добавит знаний.
2) В основном использует внешнее питание. Следовательно ловить блох не надо
В заголовке писано "Уменьшение потребления ..." :p
3) Ну и конечно сложность решения с MCU на порядок больше (если автор вообще в состоянии реализовать с использованием различных систем команд)
Сложность переделывания платы в разы больше и дороже.
"А в остальном прекрасная Маркиза, все хорошо,все хорошо"
Ну да, опять тупите :)
 

Slacky

Member
В результате применения такой схемы Вы можете реализовать следующее:
1) ESP спит вечным сном ( т е ничего не потребляет) и просыпается лишь по прерываниям
В этом режиме время выхода на связь с сервером составит от 1 до 5 секунд.
Я примерно понял. Но есть один нюанс. Прерываний два. И я пока не очень понял, как мне отследить, какое из них сработало, а это важно. Точнее, без засыпания, это отслеживается просто.

Но если применить код, который я привел в первом письме, то модуль просыпается, но как отследить, с какого GPIO пришел сигнал я не понимаю, так как функция callback - она одна ...
 

pvvx

Активный участник сообщества
Я примерно понял. Но есть один нюанс. Прерываний два. И я пока не очень понял, как мне отследить, какое из них сработало, а это важно. Точнее, без засыпания, это отслеживается просто.

Но если применить код, который я привел в первом письме, то модуль просыпается, но как отследить, с какого GPIO пришел сигнал я не понимаю, так как функция callback - она одна ...
Можно смотреть 16 бит "защелок" GPIO по фронту RESET. Они и запоминаются для выбора типа загрузки... GPIO_STRAPPING -> gpio_reg.xlsx в esp8266web/info/ESP8266_reg at master · pvvx/esp8266web · GitHub

Если устройство всё равно не работает в автономном режиме, то не проще ли его вообще включать сигналом появления внешнего питания? :)

PS: Я тут уже подумываю, ради "спортивного интереса", да и всё уже складывается, запустить на CR2032 какой RTL на месяц в автономный набор данных с датчиков с передачей и при этом непрерывный - не менее 2-х точек в сек с датчика... Будет время попробую запустить... Надобно для перехода к вариантам крохотной компактной солнечной батареи и WiFi типа сигналки... К тому времени вы наверно как раз придете к варианту запуска по появлению внешнего питания, раз уж в Arduino и ESP8266 :)
 
Последнее редактирование:

Slacky

Member
Можно смотреть 16 бит "защелок" GPIO по фронту RESET. Они и запоминаются для выбора типа загрузки... GPIO_STRAPPING -> gpio_reg.xlsx в esp8266web/info/ESP8266_reg at master · pvvx/esp8266web · GitHub

Если устройство всё равно не работает в автономном режиме, то не проще ли его вообще включать сигналом появления внешнего питания? :)

PS: Я тут уже подумываю, ради "спортивного интереса", да и всё уже складывается, запустить на CR2032 какой RTL на месяц в автономный набор данных с датчиков с передачей и при этом непрерывный - не менее 2-х точек в сек с датчика... Будет время попробую запустить...
Уважаемый pvvx :))) Я конечно понимаю, что это наглость, но сам я вряд ли разберусь быстро ...

Можно ткнуть более детально (лучше с примером).

Вот есть код

Код:
void sleepNow() {
  Serial.println("going to light sleep...");
  wifi_station_disconnect();
  wifi_set_opmode(NULL_MODE);
  wifi_fpm_set_sleep_type(LIGHT_SLEEP_T); //light sleep mode
  gpio_pin_wakeup_enable(GPIO_ID_PIN(0), GPIO_PIN_INTR_HILEVEL); //set the interrupt to look     
gpio_pin_wakeup_enable(GPIO_ID_PIN(2), GPIO_PIN_INTR_HILEVEL); //set the interrupt to look for 
HIGH pulses on Pin 0 (the PIR).
  wifi_fpm_open();
  delay(100);
  wifi_fpm_set_wakeup_cb(wakeupFromMotion); //wakeup callback
  wifi_fpm_do_sleep(0xFFFFFFF);
  delay(100);
}
void wakeupFromMotion(void) {
  wifi_fpm_close;
  wifi_set_opmode(STATION_MODE);
  wifi_station_connect();
  Serial.println("Woke up from sleep");
}
как определить, с какого пина пришел сигнал в функции wakeupFromMotion(void)?

Большое человеческое спасибо :))
 

pvvx

Активный участник сообщества
Большое человеческое спасибо :))
По ссылке дан XML, в нем найдете слово GPIO_STRAPPING - там старшие 16 бит записанных при старте состояний GPIO0..15, а в младших 16 - текущие значения с пинов GPIO0..15...
 

Slacky

Member
По ссылке дан XML, в нем найдете слово GPIO_STRAPPING - там старшие 16 бит записанных при старте состояний GPIO0..15, а в младших 16 - текущие значения с пинов GPIO0..15...
Если бы было так просто, я бы с первого раза понял. Мне бы кусок примера, как работать с этими регистрами ...
 

pvvx

Активный участник сообщества
Если бы было так просто, я бы с первого раза понял. Мне бы кусок примера, как работать с этими регистрами ...
На простом C (или C++) тоже надо учить писать?
Есть же какие-то книжки... Я учить этому не могу, т.к. оно развивалось с нуля со мной, а названия ко всему придумали всякие разгильдяи для задания "солидности" потом и ныне энтих разгильдяев мульоны... и я их не знаю, но знаю как, почему и зачем :) А вам выпала возможность зазубрить всю эту поверхностную галимотью и прикинуться "важным" (без понятия зачем вообще это надо и от куда выросло), ну шоб на большой гонорар, по европейски, с флагом ЕВРО или АМЕРО - ну типа для крутого PR (по русски пиар-рейтинга) :) :)

uint32_t GPIO_STRAPPING = (*((volatile uint32_t *)(0x60000318)))>>16;
 
Последнее редактирование:

Slacky

Member
На простом C (или C++) тоже надо учить писать?
Есть же какие-то книжки... Я учить этому не могу, т.к. оно развивалось с нуля со мной, а названия ко всему придумали всякие разгильдяи для задания "солидности" потом и ныне энтих разгильдяев мульоны... и я их не знаю, но знаю как, почему и зачем :) А вам выпала возможность зазубрить всю эту поверхностную галимотью и прикинуться "важным", ну шоб на большой гонорар, по европейски, с флагом ЕВРО или АМЕРО :) :)

uint32_t GPIO_STRAPPING = (*((volatile uint32_t *)(0x60000318)))>>16;
Не очень понял "прикинуться важным" и про "большие гонорары", но ладно. Спасибо. Если бы было все так очевидно ... Я вряд ли сам бы догадался, что "регистры" это всего-лишь ячейка памяти ...

Но тут выплала проблема другого уровня. Модуль после пары-тройки просыпаний тупо перегружается ...
 

pvvx

Активный участник сообщества
Не очень понял "прикинуться важным" и про "большие гонорары", но ладно.
А зачем ныне пишут такие книжки?
Вот пример https://esp8266.ru/forum/threads/pervaja-kniga-o-esp8266.511/
Всё там скопировано с форумов, имеет сотни ошибок, вашу проблему совсем не решает, информации вообще нуль, но книжка :)
Но тут выплала проблема другого уровня. Модуль после пары-тройки просыпаний тупо перегружается ...
WDT с прошлого раза(?) или неполная инициализация (не через физический RESET, когда всё в чипе сбрасывается в значения "по умолчанию", а далее горе-программеры меняют только часть, рассчитывая что старт всегда только со значения "по умолчанию") ?
Про это и говорилось, что без множества внешних аппаратных и дополнительных вставленных программных"костылей" ESP8266 не имеет возможности стабильно работать. В итого выходит самое дорогое и долгое по срокам "строительства" решение, если применять ESP8266. Но хорошо что он уже морально устарел и по стандартам WiFi...
Как-бы всё в ожидании SAMSUNG - он выкатил WiFi SoC с двумя процами - один для жизни в малом потреблении и копошении с внешними датчиками, а второй (второе более мощное ядро) для ресурсоемких задач... Но пока торчит один пиар от него, а самих чипов нет...
 
Последнее редактирование:

Slacky

Member
@pvvx с перезагрузкой - это я намудрил. Я там добавил прерывания и что-то пошло не так. Если взять голый код, который я привел в первом письме (добавил только одну строчку - еще один GPIO для выхода из сна, т.е. не по одному, а по любому из двух), то все работает корректно.

Код:
  gpio_pin_wakeup_enable(GPIO_ID_PIN(HOT_PIN), GPIO_PIN_INTR_LOLEVEL); //set the interrupt to look for HIGH pulses on Pin 0 (the PIR).
  gpio_pin_wakeup_enable(GPIO_ID_PIN(COLD_PIN), GPIO_PIN_INTR_LOLEVEL); //set the interrupt to look for HIGH pulses on Pin 0 (the PIR).
Ну и добавил еще вот это в функцию выхода из сна

Код:
uint32_t GPIO_STRAPPING = (*(volatile uint32_t *)(0x60000318))>>16;
  Serial.println(GPIO_STRAPPING);
Если я правильно все понял, то не получается отследить с какого пина пришел сигнал, так как число возвращается всегда одинаковое не зависимо от того, с какого пина модуль проснулся ...
 
Последнее редактирование:

Slacky

Member
@nikolz спасибо, не сообразил, что так можно :))) Но на 20 попыток, один раз приходит единица - спишу на дребезг. Сделаю подавление на MC14490P, посмотрю как будет работать.

Пока вроде получается остаться на 8266 :)))

Но RTL8710 закажу попозже, поиграюсь. Останавливает только нехватка времени и нежелание (видимо возрастное) изучать опять все с нуля :)))
 

pvvx

Активный участник сообщества
Если я правильно все понял, то не получается отследить с какого пина пришел сигнал, так как число возвращается всегда одинаковое не зависимо от того, с какого пина модуль проснулся ...
Я же описал с каким состоянием на GPIO сработал фронт RESET, а не от какого пина. От RESET он проснулся после deep_sleep, а на PIN дублируете сами сигнал, который вызывал RESET по схеме на реле от nikolz :)
При внешнем MCU этих "костылей" c рычагами и педалями на RESET от nikolz не требуется. :)
В RTL871xBx вообще ничего не требуется, кроме вызова команды энергосбережения c указанием активационных источников и дальнейшей работой как ничего и не происходило... Пример: вводим в UART символ и оно пробуждается: https://esp8266.ru/forum/attachments/snimok1575-gif.4468/
( https://esp8266.ru/forum/threads/mjiot-amb-03-debug-rtl8710bn.2664/#post-39338 )
 

Slacky

Member
Решил я дальше не копать Wemos D1 mini в плане сна. Слишком большие танцы с бубном, а мне лень. Да и к тому же, чем больше элементов, тем сложнее схема и меньше надежность.

А пример из первого письма нормально не работает. Т.е. он работает какое-то время. А вот если плату оставить спать достаточно долго, например несколько часов, то она по сигналам с пинов уже не просыпается ...

Ладно, придет 8710, буду с ней развлекаться :)))
 

pvvx

Активный участник сообщества
А вот если плату оставить спать достаточно долго, например несколько часов, то она по сигналам с пинов уже не просыпается ...
Может какие-то длинные времена ставите. Там есть ограничения по времени deep_sleep. Я счас не вспомню - поищите сами...
В том-же 871xBx есть пробуждение по будильнику (RTC)... Вот тоже надо глянуть, можно ли его ставить на срок типа в 10 лет :)
Ладно, придет 8710, буду с ней развлекаться :)))
Ну когда наладится там всё и будет популярно разжованно... А на сегодня на него нет Arduino... (Есть всё только на "A" серию)

Вот счас копаю - можно запрограммить сам бесконтактный датчик температуры на срабатывание для пробуждения модуля:
MLX90614 может быть настроен так, чтобы вести себя как термореле с программируемым порогом и гистерезисом на штыре PWM / SDA...
 
Последнее редактирование:

Slacky

Member
@pvvx в примере вроде нет deep sleep, там есть light sleep, а на сколько я понял, это несколько другое ...
 
Сверху Снизу