• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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.
 
Сверху Снизу