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

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

Slacky

Member
Что хочу - при определенных обстоятельствах загнать esp8266 в режим какого-нибудь сна, но при этом чтобы она просыпалась по прерываниям.

Пока нашел вот такой код в обсуждениях на хитхабе.

Код:
#include <ESP8266WiFi.h>

extern "C" {
#include "gpio.h"
}
extern "C" {
#include "user_interface.h"
}

const char* ssid = "myNetwork";
const char* password = "myPassword";
WiFiClient client;

void setup() {
  Serial.begin(115200);
  Serial.print("initializing GPIOs");
  gpio_init();
  pinMode(0, INPUT); // this pin is connected to the PIR sensor.
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  delay(1000);
}

void loop() {
  Serial.println("Ready to go into light sleep...");
  delay(1000);
  Serial.println("3...");
  delay(1000);
  Serial.println("2...");
  delay(1000);
  Serial.println("1...");
  sleepNow();
}

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 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");
}
Код реально работает, засыпает (потому что loop() перестает крутиться, измерить ток пока не представляется возможным). И просыпается, правда я там HILEVEL поправил на LOLEVEL (у меня по низкому уровню) - все работает.

Можно ли как-то это дело обыграть по прерываниям?

У меня сходу не получилось ...
 

Slacky

Member
Вопрос не понятен... может конечно только мне... что такое
У меня есть два прерывания, настроенные на два входа. Типа вот

Код:
/* Init external interrupt           */
void initInterrupt() {
  attachInterrupt(digitalPinToInterrupt(HOT_PIN), hotInterrupt, FALLING);
  attachInterrupt(digitalPinToInterrupt(COLD_PIN), coldInterrupt, FALLING);
}

/* External interrupt for hot water  */
void hotInterrupt() {
  counterHotWater++;
}

/* External interrupt for cold water */
void coldInterrupt() {
  counterColdWater++;
}
Хочу, чтобы при сработке любого их этих прерываний, модуль просыпался ...
 

pvvx

Активный участник сообщества
Хочу, чтобы при сработке любого их этих прерываний, модуль просыпался ...
Нету такой нормальной аппаратной возможности у ESP8266. Т.е. нет возможности просыпания из deep_sleep. Для "просыпания" по прерыванию у процессора есть специальная команда - "ожидание прерывания" и она всегда работает в процедуре est_run() (диспетчера системы в ROM). Но в таком режиме жрет включенный PLL и прочее.
Для реального засыпания проца, требуется отключение PLL и других тактирований (к примеру таймеров), а восстановление в ROM у Espressif написано неверно - на кварц в 40МГц и процедура "просыпания" требует много времени (двойное ожидание восстановления PLL - сначала на 40, потом на текущий кварц). При этом "sleep" ESP8266 всё равно жрет несколько мА. В нем есть просыпание по уровню (или перепаду) на пине и процедура описана в ROM. Но как всегда не катит - криворукие программеры Espressif :)
Тесты этих вариантов описаны в GitHub - pvvx/SDKnoWiFi: ESP8266 Open SDK without WiFi (startup < 30 ms to complete the flash cache)
И замеры потребления:

SDKnoWiFi/Power_SdkNoWiFi.gif at master · pvvx/SDKnoWiFi · GitHub
Вам остается использовать только описанный вариант от Espressif в SDK c включением sleep, с отключением всего (включая таймеры)...
 
Последнее редактирование:

Slacky

Member
@pvvx, мне нужно немного времени, чтобы переварить, что Вы мне тут объяснили :)))

Вообще полного засыпания мне и не нужно. Мне нужно просто снизить потребление, чтобы модуль поработал некоторое время на аккумуляторе, до восстановления питания. Но при этом у меня жесткое условие про прерывания.

Спасибо. Буду думать ...
 

pvvx

Активный участник сообщества
Вообще полного засыпания мне и не нужно. Мне нужно просто снизить потребление, чтобы модуль поработал некоторое время на аккумуляторе, до восстановления питания. Но при этом у меня жесткое условие про прерывания.
Спасибо. Буду думать ...
Ставьте внешний MCU и будите из deep_sleep ESP8266 за ногу RESET.
В режимах WiFi LIGH и прочего, ниже реальных средних от 17+ мА не получите. В режиме использования всяких pm_sleep из SDK - от 10 мА
У ESP8266 и его ROM есть всего один путь - полный deep_sleep со стартом сразу в первый адрес IRAM. Но для этого надо правильно выставить его ножки, т.е. требуется внешний MCU для управления таким процессом (первый старт должен проинициализировать IRAM соответствующим кодом с нормальной загрузкой из Flash, а последующий(щие) уже может(могут) стартовать сразу с 0x40100000 без загрузок, но надо восстановить PLL на кварц, таблицу прерываний и учесть время "сна" для всяких часиков/таймеров).
// ROM-BIOS запускает код с адреса 0x40100000
// при опциях перезагрузки 'Jump Boot', если:
// GPIO0 = "0", GPIO1 = "1", GPIO2 = "0" (boot mode:(2,x))
В общем и выходит "костыльная" система. По этому и прочим бякам с ESP я и завязал. Проще поставить более современный чип типа RTL - у них толпа режимов sleep и аппаратный PMU, что позволяет достичь меньшего потребления во многих вариантах без внешних компонентов-элементов вообще (что и есть меньшая цена и лучшая надежность)...
 
Последнее редактирование:

Slacky

Member
@pvvx, посоветуйте недорогую платку? :)))

Условие - чтобы под Arduino IDE работало :))
 

pvvx

Активный участник сообщества
@pvvx, посоветуйте недорогую платку? :)))
Условие - чтобы под Arduino IDE работало :))
Под Arduino таких не делают. У Arduino другие задачи - начальное обучение, да поиграть и выкинуть... Там потребление неважно, а главное чтобы пины были 2.54 для сборки "на соплях" и за это "удобство" просят много... :)
Да и к примеру, на самый дешевый RTL8710BN (уже менее 170 руб) Arduino пока нет и не видно потуг к его созданию... Мода на WiFi SoC закончилась - их разновидностей вышла куча...
Мне нужнее чипы с большей RAM, но они и стоят немного больше ESP8266... Из них можно рекомендовать что-то типа совместимого с Ameba Arduino или с MBED из серии RTL8711AM/8195AM с 2.5МБ RAM.
Пока у данных чипов (и других, современных) в WiFi среднее потребление при активности Station и всех сервисов составляет около 15 мА в режимах DTIM(n). При полной активности, когда идет работа (активный прием/передача) по WiFi эти показатели около 115 мА. Меньше не бывает в режимах 802.11 b/g/n HT40 (150Mb/s).
 
Последнее редактирование:

Slacky

Member
Ага, значит под Arduino IDE все-таки работает :)))

Я имел ввиду, что мне эта оболочка нравится и хотел бы чтобы все компилилось под ней ...

А вот еще вопрос - ESP32 совсем негодный? Просто под него Wemos платку сделал, прям для моих целей самое то :))
 

pvvx

Активный участник сообщества
Ага, значит под Arduino IDE все-таки работает :)))

Я имел ввиду, что мне эта оболочка нравится и хотел бы чтобы все компилилось под ней ...

А вот еще вопрос - ESP32 совсем негодный? Просто под него Wemos платку сделал, прям для моих целей самое то :))
Если вас устраивают стартовые токи потребления более полу Ампера и последующий жор с нагревом модуля (+ отсутствие полного ПО на все устройства), то пойдет :)
 

pvvx

Активный участник сообщества
Нет. Это подделка под ESP8266 NodeMCU. Т.е. со всеми ограничениями ESP8266 и связью по UART-Log, без Jtag/SWD.
Там кинутые на плату микросхемы жрут более 15 мА, при потреблении модуля в режиме пониженного потребления (обработки прерываний) к 1 mA. :)
Если вы изучили ESP8266 то почему не устраивают его ограничения + внешний MCU для автономных режимов? Любой простейший внешний MCU может обеспечить потребление менее 1 mA совместно с постоянным опросом датчиков и гарантированный контроль над ESP...
А ближе всего к ESP8266, но с большими возможностями - это серия "B" или AmebaZ... Не думаю, что он имея меньшую себестоимость будет в единичной продаже ниже ESP8266, т.к. у него значительно большие ТТХ. Модуль сейчас стоит ~170 руб, а падать ниже 150 ему пока нет смысла из-за высокой цены ESP8266 :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
@pvvx сходил по Вашей ссылке на ebay. У того же продавца, такая нормальная? RTL8710AF DEBUG BOARD For the development of MJIOT-AMB-01/01S module
Смотря для чего. Она совместима с Ameba Arduino и имеет CMSIS-DAP отладку, USB-COM и виртуальный диск для заливки ПО. Сдесь картинка -> https://esp8266.ru/forum/threads/moduli-rtl8195am-mjiot-amb-02.2665/
 

Slacky

Member
Если вы изучили ESP8266 то почему не устраивают его ограничения + внешний MCU для автономных режимов? Любой простейший внешний MCU может обеспечить потребление менее 1 mA совместно с постоянным опросом датчиков и гарантированный контроль над ESP...
Тут есть один нюанс - я 8266 специально не изучал, просто по мере необходимости искал решения. Это ж хобби. Тогда еще вопрос - какой простейший MCU взять для датчиков и контроля над 8266?

Спасибо.
 

pvvx

Активный участник сообщества
Тут есть один нюанс - я 8266 специально не изучал, просто по мере необходимости искал решения. Это ж хобби. Тогда еще вопрос - какой простейший MCU взять для датчиков и контроля над 8266?
Зависит от задачи. Я ставил в корпусе SOT-23 PIC10Fxxx и PIC12Fxx с ADC, и PIC24FV16KM204 для датчиков с 5B питания c обработкой данных в float... Можно и STM-ки... Тут на вкус и цвет...
Как пример - PIC24FV при ПОСТОЯННОМ опросе датчика влажности SHT75 и обработке данных в Float с передачей далее жрет сильно меньше 1 мА (вместе с датчиком SHT75 и его опросом на пределе, по готовности...). Частоту MCU ставите ниже, чтобы успевал для задач и вперед...
 
Последнее редактирование:

Slacky

Member
Смотря для чего. Она совместима с Ameba Arduino и имеет CMSIS-DAP отладку, USB-COM и виртуальный диск для заливки ПО. Сдесь картинка -> https://esp8266.ru/forum/threads/moduli-rtl8195am-mjiot-amb-02.2665/
Для обработки от двух до четырех датчиков (простые герконы по минусу), события посажены на прерывание. При пропадании основного питания уходить в сон (чем глубже, тем естественно лучше), но при этом просыпаться по прерываниям и отрабатывать их ...
 

pvvx

Активный участник сообщества
Для обработки от двух до четырех датчиков (простые герконы по минусу), события посажены на прерывание. При пропадании основного питания уходить в сон (чем глубже, тем естественно лучше), но при этом просыпаться по прерываниям и отрабатывать их ...
Любой современный 8-ми/16-ти битный MCU с устраиваемым количеством ножек справиться с вашей задачей и сможете достигнуть потребления при sleep к 0.1 мА :) Т.е. обычно это не больше, чем потребляют стабилизаторы питания. По этому желательно ставить MCU с питанием напрямую от батарейки и он уже будет коммутировать преобразователь питания для ESP8266.
 
Сверху Снизу