• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

NodeMCU + Dht11 зависает через час

Выбы за кого проголосовали если бы...?

  • Трам

    Голосов: 6 54.5%
  • Хиллари

    Голосов: 1 9.1%
  • Кто такие выбы?

    Голосов: 4 36.4%

  • Всего проголосовало
    11

EzdiliDwaTanka

New member
Hi there!
У меня проблема с постоянным зависанием этой микросхемы
У людей как я почитал куча проблем с отвалом AP (Connection keeps droping when ESP8266 set up as an access point · Issue #1615 · esp8266/Arduino · GitHub), а меня наоборот даже в режиме просто STA девайс пропадает из сети где-то через час+- после запуска.

Подскажите в чем может быть проблема, мб кто-то уже сталкивался с нечто подобным.
ниже прилагаю код моего скетча
Код:
#include <ESP8266WebServer.h>
#include <ESP8266WiFi.h>
#include "DHT.h"

const char* ssid = "ROSTELECOM_ACFA";
const char* password = "agentputin";

#define DHTPIN D4     // what pin we're connected to
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);

WiFiServer server(80);

void setup()
{
  //ESP.eraseConfig();
  //WiFi.mode(WIFI_AP);
  WiFi.mode(WIFI_STA);
    Serial.begin(115200);
    // Connect to aWiFi network
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);
    dht.begin();
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("WiFi connected");

    // Start the server
    server.begin();
    Serial.println("Server started");

    // Print the IP address
    Serial.print("Use this URL : ");
    Serial.print("http://");
    Serial.print(WiFi.localIP());
    Serial.println("/");
  /* add setup code here */

}

void loop()
{
  WiFi.
  /* add main program code here */
  // Check if a client has connected
    WiFiClient client = server.available();
    if (!client) {
        return;
    }

    // Wait until the client sends some data
    Serial.println("new client");
    while (!client.available()) {
        delay(1);
    }

    // Read the first line of the request
    String request = client.readStringUntil('\r');
    Serial.println(request);
    client.flush();

    // Return the response
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("Connnection: close");
    client.println();
    client.println("<!DOCTYPE HTML>");
    client.println("<html>");
    client.println("<meta http-equiv=\"refresh\" content=\"5\">");
    client.println("<br />");
    client.println(""); //  do not forget this one
    float h = dht.readHumidity();
    float t = dht.readTemperature();
    float f = dht.readTemperature(true);

    if (isnan(h) || isnan(t) || isnan(f))
    {
        Serial.println("Failed to read from DHT sensor!");
        return;
    }

    client.print("Temperature (C): ");
    client.println(t, 1);
    client.println("<br />");


    client.print("Humidity (%): ");
    client.println(h, 0);
    client.println("<br />");

    client.println("</html>");
    delay(1);
    Serial.println("Client disconnected");


}
 

pvvx

Активный участник сообщества
Подскажите в чем может быть проблема, мб кто-то уже сталкивался с нечто подобным.
Скорее всего проблема находится в последних версиях SDK к ESP8266. На старых версиях (менее v2.0) она проявлялась реже. Был длительный первый ping после долгой паузы с обращением к модулю.
Пробуйте переключить режим sleep для WiFi. По умолчанию он в режиме MODEM. Поставьте NONE.
В режиме sleep: LIGHT отваливается ещё чаще.
Как это переключать на Arduino я не знаю и не факт, что поможет. Но попробовать стоит. :)

Ещё: К примеру, при соединении к AP на модуле EPS8266, станции на модуле RTL8710AF, модуль RTL8710AF отключается через несколько секунд не активности соединения (нет передач и прочего). В логе RTL отображается прием события отключения, посланный ESP8266…
C роутерами ситуация другая…
Часто ESP8266 отваливается при смене ключа шифрования. Период смены ключа устанавливается на роутере...
Так-же ESP8266 часто отваливается при калибровке WiFi, которая происходит автоматически и периодически и изменить это нет возможности в его SDK.
 
Последнее редактирование:

EzdiliDwaTanka

New member
>Но попробовать стоит.
Cпасибо. на гитхабе вроде нашел какие-то sleep'ы LIGHT_SLEEP HOW ? · Issue #1381 · esp8266/Arduino · GitHub

Но, разве микросхема не рассчитана на постоянную работу в обычном режиме ?
И еще я где-то читал про проблемы с отвалом AP т.к. у микрухи траблы с памятью, а решали траблу с записью прошивки с некоторым оффсетом а не по 0x000000, впрочем я сомневаюсь что это мой случай. Мб так же стоит попробовать откатиться на старые SDK ?
 

pvvx

Активный участник сообщества
Но, разве микросхема не рассчитана на постоянную работу в обычном режиме ?
Что такое "в обычном режиме"?
Есть режим по умолчанию - это в котором включается WiFi без изменения конфигурации пользователем. В SDK от Espressif это режим работы WiFi с установкой "sleep: MODEM", т.е. с переходами на отключение между beacon после некоторой паузы в передачах. А т.к. вырубается, и WiFi ПО у ESP8266 неполноценный, то не отслеживает все события в эфире и не очень хорошо работает со всеми роутерами.
Рекомендовать тут можно только использовать другой модуль, который имеет большую совместимость с современными стандартами WiFi и меньше ошибок в ПО, чем поделки от Espressif. :(
Мб так же стоит попробовать откатиться на старые SDK ?
Возможно, но там свои ошибки. Честно говоря, эта ситуация с поделками от Espressif всем уже поднадоела и разбираться какие там новые баги наворотили в своем закрытом SDK Espressif для ESP8266 никто не будет. "Писатели" Arduino заняты новом чипом (с новыми глюками от Espressif :) ) - ESP32.
Время то идет, появляются новые чипы, новые стандарты и жизнь кипит :) Я вот перешел к RTL-ам - там более дружелюбная SDK и Arduino...
 
Последнее редактирование:

vad7

Active member
@EzdiliDwaTanka, Дело скорее всего в ардуине и/или в версии sdk.
У меня на модифицированной веб-свалке на sdk 1.5.4 девайс проработал с сентября без сбоев и перезагрузок.
 

pvvx

Активный участник сообщества
@EzdiliDwaTanka, Дело скорее всего в ардуине и/или в версии sdk.
У меня на модифицированной веб-свалке на sdk 1.5.4 девайс проработал с сентября без сбоев и перезагрузок.
Вроде описал уже ситуацию в веб-свалке с sdk 2.0 на сегодня - если рядом с модулем ESP8266 часто включаются другие WiFi, то у Station ESP "сносит крышу". На более ранних версиях SDK я этого не проверял и считал, что всё нормально. Причина пока не выяснена, т.к. ну нет в ESP никакой возможности управлять драйвером WiFi для создания элементарного лога при сбоях и т.д...
 

nikolz

Well-known member
Hi there!
У меня проблема с постоянным зависанием этой микросхемы
У людей как я почитал куча проблем с отвалом AP (Connection keeps droping when ESP8266 set up as an access point · Issue #1615 · esp8266/Arduino · GitHub), а меня наоборот даже в режиме просто STA девайс пропадает из сети где-то через час+- после запуска.
Подскажите в чем может быть проблема, мб кто-то уже сталкивался с нечто подобным.
----------------------------------------
Попробуйте использовать функции
wifi_station_set_auto_connect (1)
и
wifi_station_set_reconnect_policy(true)
-----------------------------------
Это функции CИ, как к ним обратится в дурине я не знаю,
так как дурину не использую.
 

EzdiliDwaTanka

New member
>девайс проработал с сентября без сбоев и перезагрузок
Кстати меня эта история надоумила запустит ESP вообще без какого либо обвеса, на ней просто крутиться веб сервер который считает секунды и выдает в виде странички. Пол дня проработала и дальше бы наверное работала, но я опять начал экспериментировать.

>никакой возможности управлять драйвером WiFi для создания элементарного лога при сбоях и т.д...
а у нее же есь callback'ки для wifi-еветов, или это не то?

>Попробуйте использовать функции
Да у меня такое ощущение как будто бы она вообще просто виснет по истечению некоторого времени, если на ней датчик dht11 висит.
a С-шные вроде так юзаются
Код:
extern "C" {
#include "user_interface.h"
  uint16 readvdd33(void);
  bool wifi_set_sleep_type(sleep_type_t);
  sleep_type_t wifi_get_sleep_type(void);
}

void setup()
{
  WiFi.mode(WIFI_STA);
  wifi_set_sleep_type(NONE_SLEEP_T);
...
}
Еще момент% страница с авто обновлением в 5 сек, мб при потере клиента она уходит в вечный цикл где-нибудь в SDK API. Хотя опять же без обвеса и с таймером нет никаких проблем.
В общем сейчас у меня она снова на испытании.
 

nikolz

Well-known member
>девайс проработал с сентября без сбоев и перезагрузок
Кстати меня эта история надоумила запустит ESP вообще без какого либо обвеса, на ней просто крутиться веб сервер который считает секунды и выдает в виде странички. Пол дня проработала и дальше бы наверное работала, но я опять начал экспериментировать.

>никакой возможности управлять драйвером WiFi для создания элементарного лога при сбоях и т.д...
а у нее же есь callback'ки для wifi-еветов, или это не то?

>Попробуйте использовать функции
Да у меня такое ощущение как будто бы она вообще просто виснет по истечению некоторого времени, если на ней датчик dht11 висит.
a С-шные вроде так юзаются
Код:
extern "C" {
#include "user_interface.h"
  uint16 readvdd33(void);
  bool wifi_set_sleep_type(sleep_type_t);
  sleep_type_t wifi_get_sleep_type(void);
}

void setup()
{
  WiFi.mode(WIFI_STA);
  wifi_set_sleep_type(NONE_SLEEP_T);
...
}
Еще момент% страница с авто обновлением в 5 сек, мб при потере клиента она уходит в вечный цикл где-нибудь в SDK API. Хотя опять же без обвеса и с таймером нет никаких проблем.
В общем сейчас у меня она снова на испытании.
У Вас вот это:
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Написано плохо.
Если соединение не будет то ESP будет вечно в этом цикле , что Вы и получаете в результате.
 

EzdiliDwaTanka

New member
>Написано плохо.
пардон но, дауны пиндосы по другому и не могут писать) А это копипаста прямая от какого-то очередного без двух дней учителя, ну и мне нужно было по быренькому обкатать схему, так что...
В общем вчера я поправил скетч. И уже почти сутки схема не виснет. Все таки это что-то с утечками связанное, heap жрался TCP пакетами и она висла как мне кажется.

добавил на клиента таймаут после которого его флашу и стоплю. ну и в конце лооп тоже дописал клиент.стоп().
Код:
#include <ESP8266WebServer.h>
#include <ESP8266WiFi.h>
#include "DHT.h"

extern "C" {
#include "user_interface.h"
    uint16 readvdd33(void);
    bool wifi_set_sleep_type(sleep_type_t);
    sleep_type_t wifi_get_sleep_type(void);
}

const char* ssid = "ROSTELECOM_ACFA";
const char* password = "agentputin";

#define DHTPIN D4     // what pin we're connected to
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);
uint16_t timeout=0;

WiFiServer server(80);

void setup()
{
    WiFi.setAutoConnect(true);
    WiFi.setAutoReconnect(true);

    Serial.begin(115200);
    // Connect to aWiFi network
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);
    //wdt_reset();
    dht.begin();
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("WiFi connected");

    // Start the server
    server.begin();
    Serial.println("Server started");

    // Print the IP address
    Serial.print("Use this URL : ");
    Serial.print("http://");
    Serial.print(WiFi.localIP());
    Serial.println("/");
    WiFi.mode(WIFI_STA);
    wifi_set_sleep_type(NONE_SLEEP_T);
  /* add setup code here */

}

void loop()
{

  /* add main program code here */
  // Check if a client has connected
    WiFiClient client = server.available();
    if (!client) {
        return;
    }
  
    // Wait until the client sends some data
    Serial.println("new client");
    while (!client.available()) {
        delay(1);
    timeout++;
    if (timeout > 500)
    {
      client.flush();
      client.stop();
      break;
    }
    }

    // Read the first line of the request
    String request = client.readStringUntil('\r');
    Serial.println(request);
    client.flush();

    // Return the response
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("Connnection: close");
    client.println();
    client.println("<!DOCTYPE HTML>");
    client.println("<html>");
    client.println("<meta http-equiv=\"refresh\" content=\"5\">");
    client.println("<br />");
    client.println(""); //  do not forget this one
    float h = dht.readHumidity();
    float t = dht.readTemperature();
    float f = dht.readTemperature(true);
    float heap = ESP.getFreeHeap();;

    if (isnan(h) || isnan(t) || isnan(f))
    {
        Serial.println("Failed to read from DHT sensor!");
        return;
    }

    client.print("Temperature (C): ");
    client.println(t, 1);
    client.println("<br />");
  

    client.print("Humidity (%): ");
    client.println(h, 1);
    client.println("<br />");
  
    client.print("Heap: ");
    client.println(heap, 0);
    client.println("<br />");

    client.println("</html>");
    delay(1);
    Serial.println("Client disconnected");

  client.stop();

}
 
Последнее редактирование:

nikolz

Well-known member
Вы перенесите проверку WL_CONNECTED в LOOP и сделайте счетчик проверок.
Алгоритм работы будет такой:
Сначала счетчик проверок устанвливаете в 0.
Проверку делаете если счетчик больше или равен нулю.
Если подключение есть то счетчик ставите в минус 1. и после этого проверка подключения не делается а делается ваше измерение.
В проверке ставите выход при превышении счетчика например 10 000.
В результате Ваш модуль будет просыпаться и проверять подключение
если нет то снова спать а если есть то делать то, что надо.
Т е не будет виснуть и кушать питание, если нет WIFI.
 

pvvx

Активный участник сообщества
Да у меня такое ощущение как будто бы она вообще просто виснет по истечению некоторого времени, если на ней датчик dht11 висит.
Аналогично - если висит датчик GPIO0,2 у модуля ESP-01, то он чаще виснет. У данного модуля другие ноги чипа просто болтаются и принимают все помехи. На ESP-12 (проверял разные варианты и с модулем на DevBoadr-дах), при использовании других портов, не участвующих в перезагрузке, модуль до "отваливания" от AP работает дольше. При перестановке на GPIO0,2 - чаше отваливается. Это просто по статистике. Причина, по чему происходит отваливание модуля от внешней AP, пока не выяснена.
Симптомы, что сделать, чтобы чаще отваливался уже описаны - наличие рядом с модулем других WiFi устройств. При одном ESP и AP отваливаний нет. Так происходит у меня. Копаться с закрытыми либами управления WiFi в китайском SDK ESP надоело... На вылавливание таких багов надо иметь очень много свободного времени и большого желания, чего нет для устаревшего ESP8266.
 
Последнее редактирование:

nikolz

Well-known member
поставьте для контроля печать статуса соединения и IP адрес ESP.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Кстати меня эта история надоумила запустит ESP вообще без какого либо обвеса, на ней просто крутиться веб сервер который считает секунды и выдает в виде странички. Пол дня проработала и дальше бы наверное работала, но я опять начал экспериментировать.
Тут другой вариант - нет обвеса = нет наводок на чип по внешним проводкам. Возможно вам надо прикрутить датчик как можно ближе к ESP и правильно развести провода питания.
 

EzdiliDwaTanka

New member
Возможно вам надо прикрутить датчик как можно ближе к ESP и правильно развести провода питания.
Он на макетке пока в нескольких см от NodeMCU
Я хочу добавить еще один термометр DHT11 и авто-управление релюхой SSR-25 DA (нагрузка - две ДНaТ лампочки по 600w)
 

shasoft

New member
Так автор нашел решение проблемы или нет? У меня тоже через час работы отваливается плата. Т.е. сделал чтобы плата NodeMCU V3 отправляла данные в инет на сайт каждые 3 минуты. Потому логи смотрю: работает, потом простой примерно на 1 час, потом 1 час работает и опять 1 час простоя. Уже 4 цикла таких прошло и судя по логу пошел пятый круг. На плате висит 2 реле. Сама плата воткнута в Node Base
 

nikolz

Well-known member
Так автор нашел решение проблемы или нет? У меня тоже через час работы отваливается плата. Т.е. сделал чтобы плата NodeMCU V3 отправляла данные в инет на сайт каждые 3 минуты. Потому логи смотрю: работает, потом простой примерно на 1 час, потом 1 час работает и опять 1 час простоя. Уже 4 цикла таких прошло и судя по логу пошел пятый круг. На плате висит 2 реле. Сама плата воткнута в Node Base
А может это сайт такой? Час принимает а час отдыхает?
Вы поставьте сервер на локальный комп и тестируйте.
или сделайте вывод лог файла через UART для определения причины.
 

shasoft

New member
А может это сайт такой? Час принимает а час отдыхает?
Вы поставьте сервер на локальный комп и тестируйте.
или сделайте вывод лог файла через UART для определения причины.
Нет. Сервер рабочий. Он у хостера нормального стоит. Все сайты уже лет 10 работают на нем нормально. К тому же если бы тупил сервер, то тогда бы я и статистику не мог посмотреть, а она есть.

Кабель до компьютера тянуть далеко, поэтому сделать вывод в порт проблематично. А установку перетащить - вообще не вариант.
В понедельник запущу с утра и буду наблюдать что и как. Т.е. работает установка или нет в тот момент когда не шлёт логов на сервер. Ну и добавлю моргание светоидом чтобы понимать что цикл loop отрабатывает успешно.
 

nikolz

Well-known member
Нет. Сервер рабочий. Он у хостера нормального стоит. Все сайты уже лет 10 работают на нем нормально. К тому же если бы тупил сервер, то тогда бы я и статистику не мог посмотреть, а она есть.

Кабель до компьютера тянуть далеко, поэтому сделать вывод в порт проблематично. А установку перетащить - вообще не вариант.
В понедельник запущу с утра и буду наблюдать что и как. Т.е. работает установка или нет в тот момент когда не шлёт логов на сервер. Ну и добавлю моргание светоидом чтобы понимать что цикл loop отрабатывает успешно.
Можно по WIFI передать на локальный сервер лог.
На компе достаточно просто написать скрипт на луа
например так выглядит клиент UDP:
Код:
socket=require("socket")
local hostname =    "ESP_9BF97C"
local host,port ="192.168.0.100",3999;
udp = assert(socket.udp())
udp:settimeout(2)
assert(udp:setpeername(host,port))
while true do
    assert(udp:send(""));
      data = udp:receive()
    if data then        print("Recieved: " .. data)     end
        socket.sleep(1)
end
 

shasoft

New member
Можно по WIFI передать на локальный сервер лог.
На компе достаточно просто написать скрипт на луа
WiFi не работает этот час. Как вариант, сохранять статус в памяти (в конце концов раз в три минуты это всего 20 значений), а как появится соединение, то отправлять на сервер.

В понедельник буду весь день рядом с установкой, так что сначала буду просто смотреть за работой установки. Насос должен включаться на 5 минут каждый час. Если насос работает и отключается в то время как на сайт лог не отправляется, значит дело в WiFi-е.

p.s.сам "сайт" с логом Аэропоника
В колонке delta_Time разница в секундах между отправляемыми данными. Четко каждые 2 часа интервал на 1 час + некоторое время. Колонка time - время отправления данных.
nasos - работа насоса
light - работа освещения
 
Сверху Снизу