ESP-01 + два DS18B20, как снизить трафик?

Добрый день!
Использую приложение Blynk на Андроид 4.4.4. Blynk Library 0.6.1, Arduino IDE 1.8.13
Для визуализации использую виджет ValueDispley - 2 графика с опросом по 5сек каждый (или Push)
Схема: два датчика DS18B20 сидят на GPIO 0 модуля ESP-01. Опрос вызывается по таймеру.

Если делаю:
3000L = раз в 3 секунды, 1час = 264кб (185 МБ/мес)
30000L = раз в 30сек, 1час = 75кб (54 МБ/мес)
60000L = раз в 1мин, 1час = 61кб (42 МБ/мес)
Т.е. трафик складывается из:

  • неуменьшаемого остатка 0.93кб/мин (55 кБ/час или 39.6 Мб/месяц);
  • полезные данные: каждое считывание 180байт/раз.

Не пойму куда уходят эти 55 кб/час и как от них избавиться…
Если в “void loop” добавить “delay (10000)” трафик падает до 38кб в час, но появляются нестабильные пропуски с дисконнектами.

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
// #include <Blynk.h>

char auth[] = "---------"; 	// проект в приложении Blynk: "Esp-relay-ds18b20"
char ssid[] = "---------";
char pass[] = "----";

#include <SimpleTimer.h>
SimpleTimer timer;

#include <DallasTemperature.h>
#include <OneWire.h>   // для датчика температуры
#define IN_DS18b20 2   // определяем название для ноги на которой сидит датчик температуры (вход GP2)
#define OUT_Relay 0    // определяем название для ноги на которой сидит управление реле (GP0)
#define OUT_LED 1      // определяем название для ноги на которой сидит управление реле (GP1)

OneWire oneWire(IN_DS18b20);   // активируем объект OneWire (датчик на ноге GP3)
DallasTemperature DS18B20(&oneWire);
int temp_0;                   // значение температуры от первого датчика DS18B20
int temp_1;                   // значение температуры от второго датчика DS18B20


// ------------------------------- Установки ---------------------------------

void setup()
{
  Serial.begin(9600); // если совсем заремовать, то трафик вырастает до 5мб в час, 2400 - не дает эффекта
  Blynk.begin(auth, ssid, pass); 
  DS18B20.begin();
  timer.setInterval(60000L, getSendData); // - для DS18b20 посл. 60000L прошил 4.09.2020
  pinMode(IN_DS18b20, INPUT);         // датчик температуры
  pinMode(OUT_Relay, OUTPUT);         // реле
  digitalWrite(OUT_LED, 1);           // светодиод отключить
  digitalWrite(OUT_Relay, 0);         // реле отключить
}

// ---------------- отправка данных датчиков в Blynk ------------------------
void getSendData()
{
  DS18B20.requestTemperatures(); 
  temp_0 = DS18B20.getTempCByIndex(0); // Sensor 0 показания для датчика 1 в цельсиях
  temp_1 = DS18B20.getTempCByIndex(1); // Sensor 0 показания для датчика 2 в цельсиях 
  Blynk.virtualWrite(10, temp_0); //вывод данных на виртуальный пин V10
  Blynk.virtualWrite(11, temp_1); //вывод данных навиртуальный пин V11
}

// ------------------------------- Главный Цикл ------------------------------
void loop()
{
  Blynk.run();
  timer.run();
  delay(1000);  // задержка 1 сек ничего не дает, с 10 сек трафик падает до 38кб в час, но появляются пропуски...
}

Подскажите пожалуйста, что может “высасывать” трафик и можно ли его уменьшить как-то?

Your ESP-01 talks to the Blynk server constantly, every time Blynk.run is executed. This is so that the server knows that the device is still online, and so that the device knows if the status of any widgets in the app have changed.
The default timeout period is 10 seconds. If the server hasn’t heard from the device during this time it terminates the connection and shows the device as being offline.

I would suggest that if you only want one-way data from your ESP-01 to the server and the app then the simplest method would be to use Blynk.disconnect after the data has been sent. This will end the connection to the server and no data exchange will take place, and the device will show as offline in the app. You will then need to re-connect to the server before sending more data.

If you look at examples of deep sleep code for Blynk then this works in a vary similar way to this, except the device is put to sleep (which ends the Blynk connection) rather than using Blynk.disconnect.

Pete.

1 Like

Спасибо, Pete!
Правильно ли я понял, что после Blynk.disconnect или после режима “deep sleep” устройству придется снова устанавливать соединение по WiFi? Или это относится только к установке связи с Blynk server?
Второй вопрос: могу ли я просто увеличить the default timeout period с 10 секунд, например, до 1 минуты?
Дело в том, что я хотел бы еще управлять модулем реле. А данные считывать скажем раз в 5 минут. Я заметил, что управлять реле я могу быстрее чем один раз в 10 секунд (частоте обновления данных сервера), т.е. практически по факту нажатия, разумеется при наличии соединения.

I think Blynk.disconnect will simply close the connection to the Blynk server, but I’ve never tried.

Increasing the timeout won’t change the heartbeat frequency, just the amount of time before the Blynk server closes the connection.
You could experiment with changing the heartbeat period, but I’vve never tried that.
It was discussed recently here:

Pete.

1 Like

Большое спасибо, Pete!
Это очень похоже на решение. Буду пробовать, правда это займет некоторое время.
О результате обязательно сообщу.

Получил первый результат. Докладываю.
Попробовал пока только
#define BLYNK_HEARTBEAT 60
подозревая, что по умолчанию прописано 10. Но к моему сожалению трафик не изменился.
Конечно еще есть надежда опробовать скажем 600, но, наблюдая за тем, с какой скоростью происходит реакция на обрыв и восстановление соединения: гораздо быстрее чем раз в 60 секунд, закрадывается впечатление, что свойство BLYNK_HEARTBEAT не работает.
Буду пробовать еще увеличивать…

Попробовал 600. Всё точно так же, трафик не снижается.
Хочу попробовать еще два варианта:

  1. оставить heartbeat 600 и вернуть задержку 10 секунд в void loop(), в надежде, что сервер не успеет обнаружить статус устройства и соотвественно не оборвет соединение.
  2. подготовил проект с “deep sleep” пока на 1 минуту. Для управления реле планирую использовать виртуальный переключатель вместо кнопки, в надежде, что после сна модуль ESP увидит ее состояние и включит/выключит реле.

Прошу прощения, что тест у меня каждый раз затягивается. Это происходит по двум причинам: далеко находится оборудование, нужно съездить и поменять прошитый модуль ESP и вторая причина: нужно время пока провайдер интернета подготовит отчет о детализации трафика, как правило - это еще минимум сутки ожидания.

код для проекта с глубоким сном (еще не пробовал)

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

/* Blynk and WiFi credentials */
char auth[] = "-----"; // проект в приложении Blynk: "Esp-relay-ds18b20"
char ssid[] = "-----";
char pass[] = "-----";

// ** #include <SimpleTimer.h>
// ** SimpleTimer timer;

/* Установка времени "сердцебиения" (время Ping-а оборудования на работоспособность) */
#define BLYNK_HEARTBEAT 600 // 10 = 10 сек; 600 = 10 мин; 

#include <DallasTemperature.h>
#include <OneWire.h>   // для датчика температуры
#define IN_DS18b20 2   // нога на которой сидит датчик температуры (вход GP2)
#define OUT_Relay 0    // нога на которой сидит управление реле (GP0)
#define OUT_LED 1      // нога на которой сидит управление реле (GP1)

OneWire oneWire(IN_DS18b20);   // активируем объект OneWire (датчик на ноге GP3)
DallasTemperature DS18B20(&oneWire);
float temp_0;                   // значение температуры от первого датчика DS18B20
float temp_1;                   // значение температуры от второго датчика DS18B20

/* ---------------------------------- Установки --------------------------------------- */

void setup()
{
  Serial.begin(9600); 
  Blynk.begin(auth, ssid, pass); 
  while (!Blynk.connect()) delay(100); //Wait until connected

  DS18B20.begin();
  pinMode(IN_DS18b20, INPUT);         // датчик температуры
  pinMode(OUT_Relay, OUTPUT);         // реле
  digitalWrite(OUT_LED, 1);           // светодиод отключить
  digitalWrite(OUT_Relay, 0);         // реле отключить

  Blynk.run();    // **
  getSendData();  // **
  delay(100);     // **
  ESP.deepSleep(60000); // ** заснуть на 1 мин, проснуться через void setup ()
}


/* --------------------------------- Главный Цикл -------------------------------------- */
void loop()
{
  delay(100);
}

/* ---------------------- отправка данных датчиков в Blynk ----------------------------- */

void getSendData()
{
  DS18B20.requestTemperatures(); 
  temp_0 = DS18B20.getTempCByIndex(0); // Sensor 0 показания для датчика 1 в цельсиях
  temp_1 = DS18B20.getTempCByIndex(1); // Sensor 0 показания для датчика 2 в цельсиях 
  Blynk.virtualWrite(V10, temp_0); //вывод данных на виртуальный пин V10
  Blynk.virtualWrite(V11, temp_1); //вывод данных на виртуальный пин V11
}

Попробовал первый вариант, но трафик остался тем же. Причем первые три часа были частые большие разрывы, позже они уже не стали заметны на графиках, но не исчезли совсем.
Нашел тему с подобным вопросом:

Там Дмитрий указал, что "Размер пакета Heartbeat составляет 5 байтов + размер самого пакета TCP / IP 20 байтов.
Т.е. при 10сек сердцебиении набегает 150байт в минуту или 9кб/час… У меня по детализации - 55кб/час, возможно провайдер округляет каждый пакет до 150 байт.

Там же почему-то было рекомендовано менять BLYNK_HEARTBEAT непосредственно в библиотеке BlynkConfig.h
Неужели в скетче #define BLYNK_HEARTBEAT 600 - не работает?

Нашел так же в этой теме: Electron, Blynk & HIGH data usage - Troubleshooting - Particle
такой текст:

“я предполагаю, что проблема заключается в том, что параметры Heartbeat и Keepalive не вызываются правильно из их библиотеки”

Сейчас я поменял значение BLYNK_HEARTBEAT на 90 непосредственно в библиотеке BlynkConfig.h и убрал задержку 10сек в void loop () - попробую еще так…

P.S. второй мой вариант (с глубоким сном) не заработал. Соединения с сервером не появилось. Придется еще разбираться со скетчем.

Попробовал на макетке изменять значение BLYNK_HEARTBEAT:

  1. в скетче бесполезно его определять, реакция не меняется;
  2. в BlynkConfig.h - работает, задержка отключения = значение * 2.3
    Т.е. а в конфиге после пропажи соединения дисконнект покажет только, например через 1.5 минуты если поставить значение 40 (т.е 40*2.3 = 92 сек).

Ну наконец-то, получилось! :slight_smile:
Сократив BLYNK_HEARTBEAT в BlynkConfig.h с 10 до 90, у меня снизился трафик до 18КБ в час.
Думаю и задержка в 10сек в void loop () не нужна, но это еще нужно будет проверить.
Еще раз большое спасибо, PeteKnight
Постепенно разберусь и с глубоким сном.

Adding deep sleep to your sketch will not provide any extra benefits, other than power saving if you wish to use battery power.
If your deep sleep code is written well then the changes to the heartbeat settings will have no benefits, as there won’t be any heartbeats taking place.

I did quite a lot of work on deep sleep with @christophebl and his beehive project…

Beehive connected

Pete.

Да, Пит, я это понимал с самого начала.
Но раз уж мы о нем упоминули, хотелось рабораться. Оказалось для выхода из глубокого сна нужно аппаратное соединение GPIO 16 и RESET. Для модулей ESP-01, которые я использую, потребуется подпаиваться к ноге чипа, потому что вывод GPIO 16 на модуле отсутствует. Это лишает возможности оперативно менять один модуль на другой для обновления программы.
Применительно к моей задаче настройка “сердцебиения” оказалось самым оптимальным решением и модуль всегда остается для двустороннего обмена данными.

If you’re good with a soldering iron you can add the GPIO16 bridge to the RST pin.

Pete.

1 Like

Это окончательный вариант?

Shidkov Да, изменения BLYNK_HEARTBEAT в C:\Users…\Documents\Arduino\libraries\Blynk\src\Blynk\BlynkConfig.h
оказалось вполне достаточно.

1 Like