• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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

pvvx

Активный участник сообщества
@pvvx в примере вроде нет deep sleep, там есть light sleep, а на сколько я понял, это несколько другое ...
У RTL серии "B" основных три режима sleep... ~200 мкА, 70 мкА, 7 мкА. Соответственно ток и указывает оставшееся включенное оборудование (утечки в кристалле на включенные потроха и работающие НЧ клоки...):
sleep_mode.gif
У ESP8266 - два. Один используется для LIGHT режима в STATION или при отключенном WiFi, а второй - deep_sleep. Из deep_sleep выход только по пину reset.
В LIGHT работает только пробуждение по таймеру, а третий, "засикреченный" режим в ESP8266 слишком много жрет, но он дает возможность просыпания по уровню на назначенном пине. При этом всё равно надо восстанавливать PLL и прочее... Что неактуально в Arduino IDE (не годиться для её концепции и вписывать это никто не будет на устаревший чип)...
 
Последнее редактирование:

Slacky

Member
Сюда тоже напишу :)))

Приведенный код отлично работает на Wemos D1 mini (на оригинале, "левая" платка под Вемос ведет себя менее адекватно - перестает реагировать через некоторое время, перегружается).

Переходит в light_sleep, если пропадает питание на D0 (достаточно через 12 кОм подкинуть этот пин на +5в и отсоединять для проверки).

Я использовал шилд от того же Wemos'a - Battery Shield [WEMOS Electronics]

Нужно только сопротивление припаять между входным напряжением +5в и D0.


Сам код.

Код:
#include <ESP8266WiFi.h>

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

const char* ssid = "Slacky";
const char* password = "************";
WiFiClient client;

#define HOT_PIN D1                                /* Number of Pin for hot water       */
#define COLD_PIN D2                               /* Number of Pin for cold water      */
#define EXT_POWER_PIN D0

volatile unsigned long counterHotWater, counterColdWater;

bool offWiFi;
int powerPause;



void setup() {
  Serial.begin(115200);
  Serial.println("\n\nInitializing GPIOs");
  initPin();
  initInterrupt();
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  delay(1000);
  counterHotWater = 0; counterColdWater = 0;
  powerPause = 0;
}

void loop() {

  Serial.printf("counterHotWater: %lu\n", counterHotWater);
  Serial.printf("counterColdWater: %lu\n", counterColdWater);
  Serial.printf("powerPause: %d\n", powerPause);
 
  ESP.wdtFeed();
  offWiFi = false;
  checkExtPower();
  if (offWiFi) sleepNow();

  delay(1000);
 
}

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(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).
  wifi_fpm_open();
  delay(100);
  wifi_fpm_set_wakeup_cb(wakeupFromMotion); //wakeup callback
  wifi_fpm_do_sleep(0xFFFFFFF);
  delay(100);
}

void wakeupFromMotion(void) {
  ESP.wdtFeed();
  initInterrupt();
  wifi_fpm_close();
  wifi_set_opmode(STATION_MODE);
  wifi_station_connect();
  Serial.println("Woke up from sleep");
}


void initPin() {
  pinMode(HOT_PIN, INPUT);
  digitalWrite(HOT_PIN, HIGH);
  pinMode(COLD_PIN, INPUT);
  digitalWrite(COLD_PIN, HIGH);
  pinMode(EXT_POWER_PIN, INPUT_PULLDOWN_16);
}

/* Init external interrupt           */
void initInterrupt() {
  attachInterrupt(digitalPinToInterrupt(HOT_PIN), hotInterrupt, RISING);
  attachInterrupt(digitalPinToInterrupt(COLD_PIN), coldInterrupt, RISING);
}

/* External interrupt for hot water  */
void hotInterrupt() {
  counterHotWater++;
  Serial.printf("counterHotWater: %lu\n", counterHotWater);
}

/* External interrupt for cold water */
void coldInterrupt() {
  counterColdWater++;
  Serial.printf("counterColdWater: %lu\n", counterColdWater);
}

bool checkExtPower() {

  int val = digitalRead(EXT_POWER_PIN);

  if (val) {
    powerPause = 0;
    if (offWiFi) {
      Serial.println("External power high. WiFi on");
      offWiFi = false;
    }
    return true;
  }
  else {
    if (!offWiFi) {
      if (powerPause > 9) {
        Serial.println("External power low. WiFi off.");
        offWiFi = true;
        powerPause = 0;
        return false;
      } else {
        powerPause++;
      }
    }
    return false;
  }
}
 
Последнее редактирование:
Сверху Снизу