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

Нужна помощь Перестает отвечать вебсервер ESP8266-01

lavAzza

New member
Прошу помочь решить проблему: вебсервер на ESP8266-01 перестает отвечать по http минут через 5-20 после перезагрузки. При этом пингуется. На есп запущен вебсервер, отдающий в json данные с BMP280.
Код:
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <SPI.h>
#include <ArduinoJson.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp;

const char* ssid = "SSID";
const char* password = "pwd";
WiFiServer server(80);
void setup() {
  Serial.begin(115200);
  delay(10);
  Wire.begin(0, 2);
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");
  // Print the IP address
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");

  Wire.pins(0, 2);
  //Wire.begin(2,0);
  if (!bmp.begin()) {
    //Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    //while (1);
  }
}


void loop() {
  // 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);
  }

  StaticJsonBuffer<200> JSONbuffer;
  JsonObject& JSONencoder = JSONbuffer.createObject();
  JSONencoder["Place"] = "Mub, 7";
  JSONencoder["Number"] = "1";
  JSONencoder["Temp"] = bmp.readTemperature();
  JSONencoder["Pres"] = (bmp.readPressure() * 7.5006e-3);

  // 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(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");

  //values.add(bmp.readTemperature());
  String out;
  JSONencoder.printTo(out);
  client.println(out);

  //Serial.print(bmp.readPressure());
  client.println("</html>");

  delay(1);
  Serial.println("Client disonnected");
  Serial.println("");
}
 

kab

New member
Не помню функцию - посмотрите сами по описанию - показывает свободную память.
Сделайте вывод значения в Serial и проверьте, не уменьшается ли со временем.
 

lavAzza

New member
@kab, ESP.getFreeHeap() ?
При каждом обновлении уменьшается на несколько сот байт, изначально 46664. Но пару раз есп переставал отвечать при ~42к. в последний раз дошло до 39264 и больше не уменьшалась, потом модуль перестал отвечать.
 

gerkimuyda

New member
45 минут провисел скетч - все работает. Память не утекает.
Код:
extern "C" {
#include "user_interface.h"
}

JSONencoder["Memory"] = system_get_free_heap_size();
При каждом обновлении уменьшается на несколько сот байт.
Не при каждом. Первые запросы немного память уменьшают. Потом значение стабильно. Через время может немного освобождаться и снова тратиться с каждым запросом. До определенного уровня, ниже которого не опускается. (Т.е. на каждый запрос выделяется память, которая потом освобождается. Таких запросов держится некоторое ограниченное количество.)
 
Последнее редактирование:

lavAzza

New member
@gerkimuyda, у меня до часу работало (с сервака запустил пхп скрипт с запросом к есп каждые две минуты с записью лога доступности), но потом все равно вис.
если у вас сервер продержится не ограниченно долго, тогда дело в железе?
 

lavAzza

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

kab

New member
@lavAzza
Проблема может быть и не программная - типа помехи, плохой (нестабильный) контакт (пайка), плохое питание - с просадками. Тут уж удаленно тяжело помочь.
@gerkimuyda
А Вы пробуете прям с этим датчиком?
 

gerkimuyda

New member
Добавил
Код:
  JSONencoder["Time"] = millis();
Поставлю в браузере обновление каждую минуту. Завтра утром посмотрю.

@gerkimuyda, у меня до часу работало (с сервака запустил пхп скрипт с запросом к есп каждые две минуты с записью лога доступности), но потом все равно вис. если у вас сервер продержится не ограниченно долго, тогда дело в железе?
У меня запущено без датчика. Это имеет значение? Если у меня работает - значит копать надо в направлении датчика. BMP280 у меня занят на чердаке. Следующий BMP280 приедет через пару дней.
 

kab

New member
@kab, я не могу в сериал( у меня конвертер и бмп одновременно не подключатся вроде. пишу вывод в хтмл страницу.
имеете в виду, что бмп может отдавать что-то не то и от этого есп виснет?
Вот как датчик может глюкануть - тут я слаб:)
 

lavAzza

New member
Что ж, спасибо, господа, за консультации.
У меня все на макетке с проводками со штырьками. Попробую поменять стабилизатор, попробую перенести на макетку с пайкой.
 

kab

New member
Что ж, спасибо, господа, за консультации.
У меня все на макетке с проводками со штырьками. Попробую поменять стабилизатор, попробую перенести на макетку с пайкой.
Можете схему вывесить - посмотрят товарищи, что опытней по электронной части - может чего углядят...
 

gerkimuyda

New member
"Спокойно, Маша, я - Дубровский" :)))
Словил ваш глюк, так что не парьтесь. Я и раньше не любил Ардуиновские примеры.
Ситуация, такая-же, как и недавно я указывал в своем посте и чуть позже давал рекомендации, как надо сделать.
У вас так-же, модуль попадает в цикл и там и остается (у меня из Оперы постоянно он там).
Для отлавливания этого состояния я переделал ваш скетч на мигание встроенным светодиодом:
- светодиод мигает с частотой больше секунды - обычное ожидание в главном цикле loop()
- светодиод мигает намного чаще секунды - петля в цикле while(!client.available()){ ... }

Вот код:
Код:
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <SPI.h>
#include <ArduinoJson.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
extern "C" {
#include "user_interface.h"
}


Adafruit_BMP280 bmp;
const char* ssid = "ssid";
const char* password = "psw";
unsigned long mytime = 0;
int myled = 0;
WiFiServer server(80);
void setup() {
  Serial.begin(115200);  Serial.println();  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {    delay(500);    Serial.print(".");  }
  Serial.println("");
  Serial.println("WiFi connected");
  // Start the server
  server.begin();
  Serial.println("Server started");
  // Print the IP address
  Serial.print("Use this URL to connect: ");  Serial.print("http://");  Serial.print(WiFi.localIP());  Serial.println("/");
  Wire.begin(5/*D1*/, 4/*D2*/); delay(10);
if (!bmp.begin()) {
    //Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    //while (1);
  }
  pinMode(2/*D4*/, OUTPUT);   digitalWrite(2/*D4*/, LOW);
}
void loop() {

  if( (millis() - mytime) > 2000) { mytime=millis();
    if(myled > 0) { digitalWrite(2/*D4*/, LOW); myled=0; }
    else { digitalWrite(2/*D4*/, HIGH); myled=1; }
  }

  // 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()){ digitalWrite(2/*D4*/, LOW); delay(200); digitalWrite(2/*D4*/, HIGH); delay(200); }

  StaticJsonBuffer<200> JSONbuffer;
  JsonObject& JSONencoder = JSONbuffer.createObject();
  JSONencoder["Place"] = "Mub, 7";
  JSONencoder["Number"] = "1";
  JSONencoder["Temp"] = bmp.readTemperature();
  JSONencoder["Pres"] = (bmp.readPressure() * 7.5006e-3);
  JSONencoder["Memory"] = system_get_free_heap_size();
  JSONencoder["Time"] = millis();
  // 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(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  //values.add(bmp.readTemperature());
  String out;
  JSONencoder.printTo(out);
  client.println(out);
  //Serial.print(bmp.readPressure());
  client.println("</html>");
  delay(1);
  Serial.println("Client disonnected");
  Serial.println("");
}
Я там вам поправил, как правильно указывать GPIO для датчика, и повесил их на другие ноги, т.к. 2 нога пинает светодиод встроенный (5 и 4 - у меня там датчик висел)

зы1: У меня NodeMCU, а потому выводов куча и они совсем другие.
зы2: Не факт, что это именно ваш глюк. Может это просто еще один. Посмотрим до завтра (и у себя протестируйте).
зы3: А без датчика у вас работает или глючит?
 
Последнее редактирование:

lavAzza

New member
@gerkimuyda
обязательно попробую, спасибо!
Ног у 01 реально поменьше, так что я пока разберусь как на другие ноги повесить..) Мельком видел, как-то можно на rx tx, кажется. В общем, результат будет завтра вечером только, наверное.
Без датчика тоже потестирую.
пс ишь, чего с +5 на бмп выдает: {"Place":"Mub, 7","Number":"1","Temp":-139.04,"Pres":882.1847}
 

gerkimuyda

New member
{"Place":"Mub, 7","Number":"1","Temp":0,"Pres":0,"Memory":43416,"Time":79256093}
Проработал 22 часа
79256093/1000/60/60 = 22,01558138889
Редко опрашивал с Firefox. Как только отправил запрос с Opera - модуль сразу завис внутри цикла с частым миганием светодиода и перестал отвечать на запросы.
 

lavAzza

New member
@gerkimuyda
Спасибо!
Я правильно понял, дело в
Код:
  while(!client.available()){
    delay(1);
  }
?
Правильно будет
Код:
void loop()  {
 WiFiClient client = server.available();
   if( client ) {
      if( client.available() ) {
           // вывод html
     }
   }
}
?
 

gerkimuyda

New member
Да. Пробуйте. Если не получится - я завтра прикручу BMP280 и могу запустить проверку дальше.
 

lavAzza

New member
Да. Пробуйте. Если не получится - я завтра прикручу BMP280 и могу запустить проверку дальше.
Хм. С этим кодом
Код:
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <SPI.h>
#include <ArduinoJson.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp;

const char* ssid = "ssid";//type your ssid
const char* password = "pwd";//type your password
WiFiServer server(80);
void setup() {
  Serial.begin(115200);
  delay(10);
  Wire.begin(0, 2);
  Serial.println();
  Serial.println();
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  server.begin();
  Wire.pins(0, 2);
  if (!bmp.begin()) { 
  } 
}

void loop() {
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  
  Serial.println("new client");
   if( client ) {
      if( client.available() ) {
        StaticJsonBuffer<200> JSONbuffer;
        JsonObject& JSONencoder = JSONbuffer.createObject();
        JSONencoder["Place"] = "Mub, 7";
        JSONencoder["Number"] = "1";
        JSONencoder["Temp"] = bmp.readTemperature();
        JSONencoder["Pres"] = (bmp.readPressure() * 7.5006e-3);
  
        String request = client.readStringUntil('\r');
        client.flush();
  
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println(""); //  do not forget this one
        client.println("<!DOCTYPE HTML>");
        client.println("<html>");
        String out;
        JSONencoder.printTo(out);
        client.println(out);
  
        client.println("</html>");
 
        delay(1);
      }
   }
}
модуль вперемешку выдает:
1. нормальные ответ,
2.
Страница недоступна
Сайт 192.168.0.110 не отправил данных.

ERR_EMPTY_RESPONSE
3.
Не удается получить доступ к сайту
Веб-страница по адресу http://192.168.0.110/, возможно, временно недоступна или постоянно перемещена по новому адресу.

ERR_CONNECTION_ABORTED
 
Сверху Снизу