ESP deepsleep при потери wifi

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
Собрал по "кирпичику" такой код. Работает от аккумулятора, ESP01s, передаёт температуру на Blynk, при понижении напряжения ниже 3 вольт уходит в сон. Потребление в рабочем состоянии 70мА (5-7сек), в спящем режиме 20мкА . Всё рабочее. Но при отключении wifi в сон не уходит и постоянно потребляет 70 мА, что не давно привело к полному разряду аккумулятора. Помогите пожалуйста отправлять ESP в сон при отключении wifi.
C++:
#include <DallasTemperature.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#define BLYNK_PRINT Serial
#define ONE_WIRE_BUS 0 //GPIO куда подключен сенсор
#define PIN_POWER_DS 2 //GPIO питания датчика температуры

float temp = NAN; //температура

char auth[] = "***";
char ssid[] = "***";
char pass[] = "***";

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

int Vout = 2; // Пин питания датчика
ADC_MODE (ADC_VCC);
float Vbat,V_min = 3.00;// напряжение батарейки и минимальный порог напряжения для разрешения работы

void setup()
{
 int tryingToConnect = 3; // количество попыток соединиться с blynk сервером если не удается соединиться     
 
 Serial.begin(115200);                   
 Vbat =  ESP.getVcc();// читаем напряжение на ноге VCC модуля ESP8266
 Vbat =  Vbat / 1023;         
 if (Vbat < V_min ) Serial.println("Низкий заряд батареи, засыпаю на  30 минут ( для теста"),
 ESP.deepSleep(3600*1000000);
 pinMode     (PIN_POWER_DS, OUTPUT);
 digitalWrite(PIN_POWER_DS, HIGH);

  sensors.requestTemperatures();
  delay(1000);
  temp = sensors.getTempCByIndex(0);             
    
  Blynk.config(auth); //Настройка Blynk
 
  Blynk.connectWiFi(ssid, pass);//Подключаемся к WiFi сети
  while(!Blynk.connect() && tryingToConnect != 0) // пока есть попытки подключаемся к серверу
{
  tryingToConnect--;
}
  delay(1000);
}

void loop()
{
  digitalWrite(Vout, LOW);
  ESP.deepSleep(60000000 * 15); //глубокий сон 15 минуты для теста       
}
  BLYNK_CONNECTED()
{
  Blynk.virtualWrite(V2, temp); // виртуальный порт
}
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
c eprom
C++:
#include <DallasTemperature.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <EEPROM.h>

#define BLYNK_PRINT Serial
#define ONE_WIRE_BUS     0      //GPIO куда подключен сенсор
#define PIN_POWER_DS     2      //GPIO питания датчика температуры
#define VCC_POWER_MINI   3.00   // напряжение батарейки и минимальный порог напряжения для разрешения работы
#define NORMA_SLEEP      900e6  //глубокий сон 15 минуты для теста из loop()
#define PINS_VCC_D       2      // Пин питания датчика
#define B_RECONNECT      3      // количество попыток соединиться с blynk сервером если не удается соединиться
#define A_RECONNECT      0      // адрес для сохранения попыток

char auth[] = "***";
char ssid[] = "***";
char pass[] = "***";

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

ADC_MODE (ADC_VCC);

void setup() {
  Serial.begin(115200);
  while(!Serial) { } // Ждем инициализации последовательной коммуникации:
  if((ESP.getVcc()/1024.00f ) < VCC_POWER_MINI) {
    Serial.println("Низкий заряд батареи, засыпаю на  30 минут :: для теста");
    pinMode (PIN_POWER_DS, OUTPUT);
    digitalWrite(PIN_POWER_DS, HIGH);
    ESP.deepSleep(1800e6, WAKE_RF_DEFAULT);
  }
  Blynk.config(auth); //Настройка Blynk
  Blynk.connectWiFi(ssid, pass);//Подключаемся к WiFi сети
  if(!Blynk.connect()) {
    EEPROM.begin(512);
    byte errom = EEPROM.read(A_RECONNECT);
    if(errom > B_RECONNECT) {
      EEPROM.write(A_RECONNECT, 0);
      Serial.println("Неудачное потключения! засыпаю на  30 минут :: для теста");
      pinMode (PIN_POWER_DS, OUTPUT);
      digitalWrite(PIN_POWER_DS, HIGH);
      ESP.deepSleep(1800e6, WAKE_RF_DEFAULT);
    }
    else {
      EEPROM.write(A_RECONNECT, errom++);
      ESP.deepSleep(1e6, WAKE_RF_DEFAULT); //пробуем еще раз подключится чере 1с к WiFi сети
    }
    EEPROM.end();
  }
}


void loop() {
}

BLYNK_CONNECTED() {
  sensors.requestTemperatures();
  digitalWrite(PINS_VCC_D, LOW);
  byte i = 0; //задержа
  while(i < 100) { i++; } //задержа
  Blynk.virtualWrite(V2, sensors.getTempCByIndex(0)); // виртуальный порт
  i = 0; //задержа
  while(i < 100) { i++; } //задержа
  ESP.deepSleep(NORMA_SLEEP, WAKE_RF_DEFAULT);
}
без него
C++:
#include <DallasTemperature.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#define BLYNK_PRINT Serial
#define ONE_WIRE_BUS     0      //GPIO куда подключен сенсор
#define PIN_POWER_DS     2      //GPIO питания датчика температуры
#define VCC_POWER_MINI   3.00   // напряжение батарейки и минимальный порог напряжения для разрешения работы
#define NORMA_SLEEP      900e6  //глубокий сон 15 минуты для теста из loop()
#define PINS_VCC_D       2      // Пин питания датчика
#define B_RECONNECT      3      // количество попыток соединиться с blynk сервером если не удается соединиться

char auth[] = "***";
char ssid[] = "***";
char pass[] = "***";

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

ADC_MODE (ADC_VCC);

void setup() {
  Serial.begin(115200);
  while(!Serial) { } // Ждем инициализации последовательной коммуникации:
  if((ESP.getVcc()/1024.00f) < VCC_POWER_MINI) {
    Serial.println("Низкий заряд батареи, засыпаю на  30 минут :: для теста");
    pinMode (PIN_POWER_DS, OUTPUT);
    digitalWrite(PIN_POWER_DS, HIGH);
    ESP.deepSleep(1800e6, WAKE_RF_DEFAULT);
  }
  Blynk.config(auth); //Настройка Blynk
  for(byte i = B_RECONNECT+1; i > 0; i--) {
    if(i == 0) {
      Serial.println("Неудачное потключения! засыпаю на  30 минут :: для теста");
      pinMode (PIN_POWER_DS, OUTPUT);
      digitalWrite(PIN_POWER_DS, HIGH);
      ESP.deepSleep(1800e6, WAKE_RF_DEFAULT);
    }
    Blynk.connectWiFi(ssid, pass);
    if(Blynk.connect()) break;
  }
}


void loop() {
}

BLYNK_CONNECTED() {
  sensors.requestTemperatures();
  digitalWrite(PINS_VCC_D, LOW);
  byte i = 0; //задержа
  while(i < 100) { i++; } //задержа
  Blynk.virtualWrite(V2, sensors.getTempCByIndex(0)); // виртуальный порт
  i = 0; //задержа
  while(i < 100) { i++; } //задержа
  ESP.deepSleep(NORMA_SLEEP, WAKE_RF_DEFAULT);
}
 
Изменено:

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
Спасибо, что отозвались. Код загружается без ошибок, но не работает. Моргнёт светодиодом один раз и всё. После этого потребление 20мкА, такое впечатление, что ESP сразу уходит в сон.
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@S_Sergey_G, правильно, может я вас не правильно просто понял
C++:
BLYNK_CONNECTED() { //подключения
  sensors.requestTemperatures(); //дачик температуры
  digitalWrite(PINS_VCC_D, LOW);//светодиод
  byte i = 0; //задержа
  while(i < 100) { i++; } //задержа
  Blynk.virtualWrite(V2, sensors.getTempCByIndex(0)); //отпровка даных
  i = 0; //задержа
  while(i < 100) { i++; } //задержа
  ESP.deepSleep(NORMA_SLEEP, WAKE_RF_DEFAULT); //сон на время, после чего повторится весь код
}
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
@Normalek,
digitalWrite(PINS_VCC_D, LOW);//светодиод
У меня на GPIO2 питание датчика
digitalWrite(Vout, LOW);// отключение питания датчика
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@S_Sergey_G,а вот оно что)) бывает, но суть вы должны уловить,если что не получится пишите, И тогда питания надо отключать после отправке
C++:
BLYNK_CONNECTED() { //подключения
  digitalWrite(PINS_VCC_D, HIGH );//датчик
  sensors.requestTemperatures(); //датчик температур
  byte i = 0; //задержа
  while(i < 100) { i++; } //задержа
  Blynk.virtualWrite(V2, sensors.getTempCByIndex(0)); //отпровка даных
  i = 0; //задержа
  while(i < 100) { i++; } //задержа
 digitalWrite(PINS_VCC_D, LOW );//датчик
  ESP.deepSleep(NORMA_SLEEP, WAKE_RF_DEFAULT); //сон на время, после чего повторится весь код
}
 
Изменено:

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
@Normalek,
Я не пойму почему нет попытки соединиться с Blynk , а сразу уходит в сон?

@Normalek,
@Normalek,
Я не пойму почему нет попытки соединиться с Blynk , а сразу уходит в сон?
Питаю ESP сейчас от двух батареек АА, естественно там 3 вольта. Исправил в коде VCC_POWER_MINI 2.00. Стал пытаться подключится к Blynk, потребление 70 мА, но коннекта не происходит, через 5 сек. уходит в сон.

@Normalek,
Разобрался с подключением к Blynk. Запутался в токинах. Сейчас подключается к Blynk, но температуру не передаёт.
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@S_Sergey_G, если будете питать от лития то ставьте VCC_POWER_MINI 2.6, а данные не отправляются скорей всего из за BLYNK_CONNECTED() он работает иногда не как хотелось бы, можно код перенести в конец void setup() и для надёжности отправлять 2 раза с малой задержкой
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
@Normalek,
А sensors.getTempCByIndex(0) убрать из Blynk.virtualWrite

@Normalek,
Сделал так:
C++:
    Blynk.connectWiFi(ssid, pass);
    if(Blynk.connect()) break;
  }
  sensors.requestTemperatures();
  byte i = 0; //задержа
  while(i < 100) { i++; } //задержа
  digitalWrite(PINS_VCC_D, LOW);
  i = 0; //задержа
  while(i < 100) { i++; } //задержа
  ESP.deepSleep(NORMA_SLEEP, WAKE_RF_DEFAULT);
}
Не передаёт температуру
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@S_Sergey_G,
C++:
void setup() {
  Serial.begin(115200);
  while(!Serial) { } // Ждем инициализации последовательной коммуникации:
  if((ESP.getVcc()/1024.00f) < VCC_POWER_MINI) {
    Serial.println("Низкий заряд батареи, засыпаю на  30 минут :: для теста");
    pinMode (PIN_POWER_DS, OUTPUT);
    digitalWrite(PIN_POWER_DS, HIGH);
    ESP.deepSleep(1800e6, WAKE_RF_DEFAULT);
  }
  Blynk.config(auth); //Настройка Blynk
  Blynk.connectWiFi(ssid, pass);
  byte i;
  for(i = B_RECONNECT+1; i >= 0; i--) {
    if(i == 0) {
      Serial.println("Неудачное потключения! засыпаю на  30 минут :: для теста");
      pinMode (PIN_POWER_DS, OUTPUT);
      digitalWrite(PIN_POWER_DS, HIGH);
      ESP.deepSleep(1800e6, WAKE_RF_DEFAULT);
    }
    if(Blynk.connect()) break; //выходим из цыкла, тем самым выполняем код снизу
  }
  pinMode(PINS_VCC_D, OUTPUT); // устанавлеваем выход питания
  digitalWrite(PINS_VCC_D, HIGH); //включаем питания дачика
  sensors.requestTemperatures(); //инициализации дачика
  delay (500); //задержа 0.5с
  float g_temp = sensors.getTempCByIndex(0); //получаем температуру
  for(i=0; i<5; i++) {
    Blynk.virtualWrite(V2, g_temp); //отправляем данные 5 раз
    Serial.println(g_temp); //отправляем температуру в консоль можно будет удалить
    delay(100);//задержа 0.1сек
    //в итоге отправляем пять запросов температуры сенсора, примерно за 0.5 - 1 сек
  }
  ESP.deepSleep(NORMA_SLEEP, WAKE_RF_DEFAULT);// после этого засыпаем на установленое время в NORMA_SLEEP
}
BLYNK_CONNECTED() можно полностью удалить
 
Изменено:

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@S_Sergey_G, так сравните код полностью я немного исправил цыкл,а именно вытащил перемену
byte i; из цыкла

так же в
C++:
void loop() Blynk.run();
измените
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
@Normalek,
Ни как справиться не могу. Сделал так но наверное не правильно. Даже не подключается к Blynk
C++:
byte i;
  for(i=0; i<5; i++){
     Blynk.virtualWrite(V2, g_temp); //отправляем данные 5 раз
    Serial.println(g_temp); //отправляем температуру в консоль можно будет удалить
    delay(100);//задержа 0.1сек
    //в итоге отправляем пять запросов температуры сенсора, примерно за 0.5 - 1 сек
  }
  ESP.deepSleep(NORMA_SLEEP, WAKE_RF_DEFAULT);// после этого засыпаем на установленое время в NORMA_SLEEP
}

void loop(){ Blynk.run();

digitalWrite(PIN_POWER_DS, LOW);
}
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@S_Sergey_G, не знаю что вы делаете
C++:
#define BLYNK_TEMPLATE_ID "TMPLng41UrzR"
#define BLYNK_DEVICE_NAME "Quickstart Template"
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#define BLYNK_PRINT Serial
#define ONE_WIRE_BUS     0      //GPIO куда подключен сенсор
#define PIN_POWER_DS     2      //GPIO питания датчика температуры
#define VCC_POWER_MINI   3.00   // напряжение батарейки и минимальный порог напряжения для разрешения работы
#define NORMA_SLEEP      1e6  //глубокий сон 15 минуты для теста из loop()
#define PINS_VCC_D       2      // Пин питания датчика
#define B_RECONNECT      9    // количество попыток соединиться с blynk сервером если не удается соединиться
#define BLYNK_AUTH_TOKEN            "EGgMdnU1VbPfdcnIIp7eNZJGa3JRT0MS"
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "P20";
char pass[] = "11111111";


void setup() {
  Serial.begin(115200);
  if((ESP.getVcc()/1024.00f) < VCC_POWER_MINI) {
    Serial.println("Низкий заряд батареи, засыпаю на  30 минут :: для теста");
    pinMode (PIN_POWER_DS, OUTPUT);
    digitalWrite(PIN_POWER_DS, HIGH);
    ESP.deepSleep(1800e6, WAKE_RF_DEFAULT);
  }
  Blynk.config(auth); //Настройка Blynk
  Serial.println("1");
  Blynk.connectWiFi(ssid, pass);
  for(byte i = B_RECONNECT; i >=0; i--) {
    Serial.print(i);
    if(i == 0) {
      Serial.println("Неудачное потключения! засыпаю на  30 минут :: для теста");
      pinMode (PIN_POWER_DS, OUTPUT);
      digitalWrite(PIN_POWER_DS, HIGH);
      ESP.deepSleep(1800e6, WAKE_RF_DEFAULT);
    }
    if(Blynk.connect()) break; //выходим из цыкла, тем самым выполняем код снизу
  }
  Serial.println("2");
  pinMode(PINS_VCC_D, OUTPUT); // устанавлеваем выход питания
  digitalWrite(PINS_VCC_D, HIGH); //включаем питания дачика
  delay (500); //задержа 0.5с
  Serial.println("3");
  float g_temp = 100.0; //получаем температуру
  for( byte i=0; i<3; i++) {
    Blynk.virtualWrite(V2, g_temp); //отправляем данные 3 раз
    Serial.println(g_temp); //отправляем температуру в консоль можно будет удалить
    delay(100);//задержа 0.1сек
    //в итоге отправляем пять запросов температуры сенсора, примерно за 0.5 - 1 сек
  }
  Serial.println("4");
  ESP.deepSleep(NORMA_SLEEP, WAKE_RF_DEFAULT);// после этого засыпаем на установлено время в NORMA_SLEEP
}

void loop() {
}

BLYNK_CONNECTED() { }
вот мой 100% рабочий код, даже специально зарегестрировался в Blynk. Правда датчика нет так что просто присваиваю переменой число 100 отсылает и уходит в сон, Так что меняйте на свое и будет работать

Screenshot_20211123-001303_Blynk_IoT[1].jpg
 
  • Лойс +1
Реакции: S_Sergey_G

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
Спасибо, код почти заработал. Температура отправляется. Я правда не понял где брать данные для
#define BLYNK_TEMPLATE_ID "TMPLng41UrzR"
#define BLYNK_DEVICE_NAME "Quickstart Template" и для чего это?
У меня версия 2.27.27 TOKEN вижу а ID не найду, пока код запустил без этих строк.
А вот самое главное с чего начал тему, не работает. При отсутствии WiFi в сон не уходит.
Если роутер включен а интернета нет, то да ESP уходит в сон на заданное время, но если роутер выключен и нет WiFi то в сон не уходит.
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@S_Sergey_G, брал на сайте BLYNK, а именно в свойствах терминала, и он постоянна уходит в сон после выполнения команды, не зависимо есть соединения или нет. то есть если за сон взять курьера который отдыхает, это будет выгладить так. Будни -это питания виши положенного. Сон отдых, заказчик блунк.
Заказчик отправят заказ курьерду -> курьер смотрит график работы -> если выходной то отдыхает-> и так повторяется <<<<<
Заказчик отправят заказ курьеру -> курьер смотрит график работы -> если будни-> смотрит можно ли преобресть товар который заказ заказчик(тесть подключается -> если товара нет то отдыхает-> и так повторяется <<<<<
Заказчик отправят заказ курьеру -> курьер смотрит график работы -> если будни -> смотрит можно ли преобресть товар который заказ заказчик -> если товара есть(успешно подключился) -> Покупает товар(получаем температуру) -> относим заказчику(отправляем данные) -> и отдыхаем, после чего все по новой<<<<<

#define BLYNK_TEMPLATE_ID "TMPLng41UrzR"
#define BLYNK_DEVICE_NAME "Quickstart Template" и для чего это? это для облочного терминала, если больще одного
 
Изменено:

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
Спасибо большое за помощь!!!
Я сделал по другому. Заменил строку
Blynk.connectWiFi(ssid, pass);
на
WiFi.begin(ssid, pass);
Стал уходить в сон если нет WiFi. Может это не правильно но работает. Правда время без сна увеличилось с 5 сек. до 10 сек., что совсем плохо.
 
Изменено: