NodeMCU ESP8266 отключился от WiFi после нескольких часов работы

Я попытался протестировать NodeMCU ESP8266 с помощью этого кода из здесь

                #include <ESP8266WiFi.h>
                #include <WiFiClient.h> 
                #include <ESP8266WebServer.h>
                #include <ESP8266HTTPClient.h>

                /* Set these to your desired credentials. */
                const char *ssid = "dummy";  //ВВЕДИТЕ НАСТРОЙКИ WIFI
                const char *password = "12345678";

                //Веб/адрес сервера для чтения/записи
                const char *host = "192.168.43.128";   //https://circuits4you.com веб-сайт или IP-адрес сервера

                //=============================================== =======================
                // Включаем настройку
                //=============================================== =======================

                void setup() {
                  delay(1000);
                  Serial.begin(115200);
                  WiFi.mode(WIFI_OFF);        // Предотвращает проблему повторного подключения (слишком долгое подключение)
                  delay(1000);
                  WiFi.setSleepMode(WIFI_NONE_SLEEP);
                  WiFi.mode(WIFI_STA);        //Эта строка скрывает просмотр ESP как точки доступа Wi-Fi

                  WiFi.begin(ssid, password);     //Подключитесь к вашему Wi-Fi роутеру
                  Serial.println("");

                  Serial.print("Connecting");
                  // Ждем подключения
                  while (WiFi.status() != WL_CONNECTED) {
                    delay(500);
                    Serial.print(".");
                  }

                  //Если подключение успешное, показать IP-адрес в последовательном мониторе
                  Serial.println("");
                  Serial.print("Connected to ");
                  Serial.println(ssid);
                  Serial.print("IP address: ");
                  Serial.println(WiFi.localIP());  //IP-адрес, присвоенный вашему ESP
                }

                //=============================================== =======================
                // Основной цикл программы
                //=============================================== =======================
                void loop() {
                  HTTPClient http;    //Объявляем объект класса HTTPClient

                  String ADCData, station, postData;
                  int adcvalue=analogRead(A0);  //Чтение аналогового значения LDR
                  ADCData = String(adcvalue);   // Преобразование строки в подмножество
                  station = "A";

                  //Отправить данные
                  postData = "status=" + ADCData + "&station=" + station ;

                  http.begin("http://192.168.43.128/c4yforum/postdemo.php"); // Указываем место назначения запроса
                  http.addHeader("Content-Type", "application/x-www-form-urlencoded");    // Указываем заголовок типа контента

                  int httpCode = http.POST(postData);   //Отправить запрос
                  String payload = http.getString();    //Получить полезную нагрузку ответа

                  Serial.println(httpCode);   //Выводим код возврата HTTP
                  Serial.println(payload);    //Печать полезной нагрузки ответа на запрос

                  http.end();  //Закрыть соединение

                  delay(5000);  //Отправлять данные каждые 5 секунд
                }

Он работал хорошо и отправлял данные в базу данных через несколько часов. Потом каким-то образом отключился от WiFi. Конечно, я снова сбросил питание. Подключено.

Как мне исправить этот код, чтобы повторно подключить Wi-Fi сразу после аварии или какое-либо другое решение для этого? Спасибо

, 👍0

Обсуждение

не используйте String таким образом. https://majenko.co.uk/blog/evils-arduino-strings, @Juraj


2 ответа


Лучший ответ:

1

Что вам нужно сделать, так это оставить плату подключенной к вашему компьютеру и наблюдать за последовательным монитором, чтобы зафиксировать выходные данные во время сбоя. Если на плате произошел настоящий сбой, она выведет кучу информации, которая может сказать вам, почему она сбой. Это может быть проблема со строками/кучей или проблема с памятью, поскольку вы объявляете новый объект http каждые 5 секунд. Может быть, попробуйте поставить HTTPClient http; выровняйте, где вы объявляете переменную хоста, чтобы это была глобальная переменная, а не локальная переменная.

Поскольку ваш цикл не проверяет, чтобы убедиться, что соединение Wi-Fi все еще хорошее, если вы получите отключение, программа просто завершится ошибкой и никогда не попытается повторно подключиться. Итак, в начале вашего основного цикла поместите ту же логику тестирования Wi-Fi, что и в функции настройки. Если соединение не работает, выполните сброс и начните с самого начала, чтобы восстановить соединение Wi-Fi.

if (WiFi.status() != WL_CONNECTED) {
    ESP.reset()
  }
,

Спасибо . Я объявил HTTPClient http ; метод вне цикла. Однако он все еще получает те же ошибки. Предположим, что это может быть проблема со строками/кучей или, возможно, проблема с памятью. Как мне поступить, пожалуйста?, @ELIP

Это сработало для меня! Спасибо, @ELIP


1

У меня тоже были такие проблемы. Я искал некоторые публикации, например здесь. Вы можете попробовать эти коды

void loop()
 {
 WiFiClient client;

 Serial.printf("\n[Connecting to %s ... ", host);
if (client.connect(host, 80))
{
Serial.println("connected]");

Serial.println("[Sending a request]");
client.print(String("GET /") + " HTTP/1.1\r\n" +
             "Host: " + host + "\r\n" +
             "Connection: close\r\n" +
             "\r\n"
            );

Serial.println("[Response:]");
while (client.connected() || client.available())
{
  if (client.available())
  {
    String line = client.readStringUntil('\n');
    Serial.println(line);
  }
}
client.stop();
  Serial.println("\n[Disconnected]");
 }
 else
 {
  Serial.println("connection failed!]");
  client.stop();
 }
 delay(5000);
 }

Что касается секунд, как сказал @tavis, вы можете попробовать от здесь. Звучит ESP.restart(); рекомендуется вместо ESP.reset(); Кажется, наша проблема очень сложна.

,

Спасибо, что поделился, @ELIP