• Система автоматизации с открытым исходным кодом на базе 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;
  }
}
 
Последнее редактирование:
Сверху Снизу