• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
 
Сверху Снизу