Нужна помощь Метеостанция и Blynk

Vladimir_G

New member
Привет друзья ! нужна помощь

Собрал недавно себе «метеостанцию» состоящую из:
  1. ESP-12(Wenos D1 mini)
  2. Датчика температуры и влажности (DHT22)
  3. Датчика температуры и влажности и давления (BME280)
  4. Дисплея на микросхеме (TM1637)
Все железо установлено в корпус, находящийся в помещении, датчик (BME280) вынесен наружу.

На просторах интернета для работы всех устройств был найден(чукча читатель, чукча не писатель) код и объединен в один скетч. После сборки и заливки кода устройство –почти- сразу заработало. На дисплей (TM1637) с периодичностью 5 секунд поочередно выводится температура , влажность и давление, с датчика (BME280). С этого же датчика данные каждые 5мин. отправляются на narodmon.ru (народный мониторинг).

А так же данные с датчиков BME280 и DHT22 передаются в приложение «Blynk» где строятся графики на смартфоне. ESP подключается к локальному серверу «Blynk», к нему же подключаются еще четыре ESP-12(переключатели, др. метеостанция итд ) одна локальная сеть.

СУТЬ ПРОБЛЕМЫ - после включения все работает данные передаются на дисплей, в приложение «Blynk» и народный мониторинг. Но с периодичностью 2, 5 иногда 12 часов прекращается передача данных в приложение «Blynk», а данные на дисплей и народный мониторинг продолжают успешно передаваться. Помогает только сброс по питанию.

Другие устройства(ESP-12) в сети в это время без сбоев передают данные в приложение «Blynk». На сервере «Blynk» в логах отмечается постоянное переподключение данной сборки каждые 30 секунд. Передернув питание, в логах одно подключение и так на несколько часов, потом снова описанный сбой.

Прошу совета в чем может быть проблема. Спасибо.
 

nikolz

Well-known member
Привет друзья ! нужна помощь

Собрал недавно себе «метеостанцию» состоящую из:
  1. ESP-12(Wenos D1 mini)
  2. Датчика температуры и влажности (DHT22)
  3. Датчика температуры и влажности и давления (BME280)
  4. Дисплея на микросхеме (TM1637)
Все железо установлено в корпус, находящийся в помещении, датчик (BME280) вынесен наружу.

На просторах интернета для работы всех устройств был найден(чукча читатель, чукча не писатель) код и объединен в один скетч. После сборки и заливки кода устройство –почти- сразу заработало. На дисплей (TM1637) с периодичностью 5 секунд поочередно выводится температура , влажность и давление, с датчика (BME280). С этого же датчика данные каждые 5мин. отправляются на narodmon.ru (народный мониторинг).

А так же данные с датчиков BME280 и DHT22 передаются в приложение «Blynk» где строятся графики на смартфоне. ESP подключается к локальному серверу «Blynk», к нему же подключаются еще четыре ESP-12(переключатели, др. метеостанция итд ) одна локальная сеть.

СУТЬ ПРОБЛЕМЫ - после включения все работает данные передаются на дисплей, в приложение «Blynk» и народный мониторинг. Но с периодичностью 2, 5 иногда 12 часов прекращается передача данных в приложение «Blynk», а данные на дисплей и народный мониторинг продолжают успешно передаваться. Помогает только сброс по питанию.

Другие устройства(ESP-12) в сети в это время без сбоев передают данные в приложение «Blynk». На сервере «Blynk» в логах отмечается постоянное переподключение данной сборки каждые 30 секунд. Передернув питание, в логах одно подключение и так на несколько часов, потом снова описанный сбой.

Прошу совета в чем может быть проблема. Спасибо.
Это круче чем угадать мелодию с трех нот.
Вы даже и одной не написали.
Типа, машин едет едет и потом бах встал. Что случилось? кто знает?
-------------
Если серьезно, то пока можно сказать лишь одно - ставьте контрольную печать в том что написали и ищите глюк.
 

Vladimir_G

New member
Это круче чем угадать мелодию с трех нот.
Вы даже и одной не написали.
Типа, машин едет едет и потом бах встал. Что случилось? кто знает?
-------------
Если серьезно, то пока можно сказать лишь одно - ставьте контрольную печать в том что написали и ищите глюк.
все собрано. как отследить вот сейчас три часа и все в порядке, если в коде ошибка должно сразу глючить ???
 

nikolz

Well-known member
все собрано. как отследить вот сейчас три часа и все в порядке, если в коде ошибка должно сразу глючить ???
Это лишь кажется.
Например, утечка памяти.
Утекает утекает и потом бац кончилась память и возникло исключение.
 

nikolz

Well-known member
или еще так
приняли что-то от датчика и сделали деление константы на это что-то А оно это что-то ноль и бац исключение.
продолжать?
 

Vladimir_G

New member
Это лишь кажется.
Например, утечка памяти.
Утекает утекает и потом бац кончилась память и возникло исключение.
ого я совсем новичок в этом деле, из-за ошибки в коде может быть утечка или это железные дела ??? могу код скинуть сюда...
 

nikolz

Well-known member
ого я совсем новичок в этом деле, из-за ошибки в коде может быть утечка или это железные дела ??? могу код скинуть сюда...
вы же в интернет передаете. при этом выделается буфер для передачи. Может быть связь разорвалась а буфер остался. Но вое соединение и новый буфер а старый затерялся.
Вот и утечка пошла
Но фокус в том, что, как правило, обычно проблема там, где ее мало всего ожидаешь.
 

Peter1001

New member
Утекает утекает и потом бац кончилась память и возникло исключение.
У меня в этом случае ESP ребутится. Я в одном месте объявлял массив потом юзаел его в объекте. А в деструкторе забыл сделать delete. И ESP'шка ровно с интервалом в 15 мин ребутилась.

@Vladimir_G, Без кода тут не скажешь в чём проблема.

из-за ошибки в коде может быть утечка или это железные дела ???
Вообще то утечка памяти это чисто софтовая проблема в 98% случаев. Так как скетчи пишутся на C/C++ то это языки низкого уровня, и оправление памятью ложится полностью на программиста.
Вот вы скачали скетчи, склеили их, но где гарантия что в процессе склейки вы не удалили случайно delete. Так же может у вас там динамически в цикле выделяется память, а указатель всего один, который потом удаляется, но вся память которая была выделена в предыдущих циклах, не удалится. Причин много.

В общем C++ это не тот язык, где можно безболезненно пользоваться копипастой и склейкой не проверяя что получилось.
 
Последнее редактирование:

nikolz

Well-known member
вот код - как писал ранее "чукча" читатель.... насобирал в инете.
Рекомендации по ходу чтения кода.
-------------
status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
----------------
Вы читаете статус и если не готово то выводите сообщение и зависаете в бесконечном цикле.
На мой взгляд лучше так:
while(! bme.begin(0x76)) {Serial.println("Could not find a valid BME280 sensor, check wiring!");}
т е будет проверять и сообщать о неготовности пока не настанет готовность.
==============
функция void sendSensor()
оператор проверки if (isnan(h) || isnan(t)) ... переместить из конца сразу после чтения h и t
==================
далее при формировании пакетов Вы уже не анализируете ошибку данных? А надо бы.
 

Peter1001

New member
Далее.
DHT22/DHT11 устроены хитрым образом. И те данные что вы получаете раз в 5 минут, это не текущие данные. А данные предыдущего измерения, то есть того измерения что было 5 минут назад. Для этого в либе DHT есть параметр force.

Далее рекомендую вынести
Код:
WiFiClient client;
в верх. Ибо фиг оно знает как там внутри устроено. Хоть и на стеке создаётся.
 
Последнее редактирование:

Vladimir_G

New member
Далее.
DHT22/DHT11 устроены хитрым образом. И те данные что вы получаете раз в 5 минут, это не текущие данные. А данные предыдущего измерения, то есть того измерения что было 5 минут назад. Для этого в либе DHT есть параметр force.

Далее рекомендую вынести
Код:
WiFiClient client;
в верх. Ибо фиг оно знает как там внутри устроено. Хоть и на стеке создаётся.
данные с DHT22 я получаю каждые 5секунд это и в мониторе порта видно и в гафиках Блинка. если про 5 минут это интервал отправки данных на народный монитор, с датчика BME280. А куда вынести в верх WiFiClient client; в начало функции отправки ???
 
Последнее редактирование:

nikolz

Well-known member
две рекомендации уже применил, а про формировании пакетов можно подробнее что и как анализировать на ошибки. спасибо
в функции SendToNarodmon() Есть
WiFiClient client;
это объект типа класс и его желательно создать вне функции один раз глобально.
иначе он будет создаваться при каждом вызове функции.
------------
еще могу посоветовать не читать для отправки значения а использовать уже прочитанные для экрана.
тогда будет идентично и в инете и на индикаторе да и работать будет быстрее так как не надо лишний раз читать с датчиков
 
Последнее редактирование:

Vladimir_G

New member
в функции SendToNarodmon() Есть
WiFiClient client;
это объект типа класс и его желательно создать вне функции один раз глобально.
иначе он будет создаваться при каждом вызове функции.
то есть выношу выше до void setup() где все переменные...
 
Сверху Снизу