Время от времени ESP8266 зависает... Похоже, виноват WifiClient

Этот код работает отлично, без зависаний:

#include <ESP8266WiFi.h>
#include <Servo.h>
#include <WiFiClient.h>
#include <ESP8266WiFiMulti.h>

Servo turn;

ESP8266WiFiMulti wifiMulti;

const char* host = "192.168.1.148";
WiFiClient client;

int turnPos = 90;
unsigned long ts = 0;

void setup() {
  startWiFi();
  turn.attach(14);
  turn.write(90);
}

void loop() {

  if (millis() - ts > 500 && millis() - ts < 1000) {
    turnPos = 160;
  }
  else if (millis() - ts >= 1000) {
    ts = millis();
  }
  else {
    turnPos = 20;
  }


  /*if (client.connected()) {
    }
    else {
    if (!client.connect(host, 3000)) {
    }
    }*/


  turn.write(turnPos);
  yield();
}

void startWiFi() {
  wifiMulti.addAP("DVW3201BE8", "###");   // password is filled in on mny version
  while (wifiMulti.run() != WL_CONNECTED) { // Wait for the Wi-Fi to connect: scan for Wi-Fi networks, and connect to the strongest of the networks above
    delay(250);
    Serial.print('.');
  }
}

В то время как этот код (с закомментированным битом wificlient) время от времени зависает:

#include <ESP8266WiFi.h>
#include <Servo.h>
#include <WiFiClient.h>
#include <ESP8266WiFiMulti.h>

Servo turn;

ESP8266WiFiMulti wifiMulti;

const char* host = "192.168.1.148";
WiFiClient client;

int turnPos = 90;
unsigned long ts = 0;

void setup() {
  startWiFi();
  turn.attach(14);
  turn.write(90);
}

void loop() {

  if (millis() - ts > 500 && millis() - ts < 1000) {
    turnPos = 160;
  }
  else if (millis() - ts >= 1000) {
    ts = millis();
  }
  else {
    turnPos = 20;
  }


  if (client.connected()) {
    }
    else {
    if (!client.connect(host, 3000)) {
    }
    }


  turn.write(turnPos);
  yield();
}

void startWiFi() {
  wifiMulti.addAP("DVW3201BE8", "###");   // password is filled in on mny version
  while (wifiMulti.run() != WL_CONNECTED) { // Wait for the Wi-Fi to connect: scan for Wi-Fi networks, and connect to the strongest of the networks above
    delay(250);
    Serial.print('.');
  }
}

Единственное отличие в том, что в рабочем коде закомментирован кусок кода WifiClient. Как WifiClient может вызывать эту проблему?

, 👍0

Обсуждение

весело с esp8266. попробуйте новый основной пакет 2.4.2, @Juraj

Я вижу, что вы используете String ужасным образом. Если судить по этому фрагменту, вы, вероятно, делаете то же самое в другом месте и делаете из своей кучи швейцарский сыр., @Majenko

Проблема по-прежнему возникает без бита String — я отредактировал свой вопрос, включив в него весь свой код., @Murey Tasroc

да, и это исправлено в последней версии ядра arduino esp8266, @Juraj

Вы уверены? Как я могу проверить версию? Потому что я думаю, что у меня самая последняя версия., @Murey Tasroc


1 ответ


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

2

Это ошибка, и она была исправлена в пакете ядра Arduino esp8266 версии 2.4.2, опубликованном 2 дня назад.

см. первую строку в разделе ESP8266WiFi списка изменений

2.4.2 ESP8266WiFi: Исправлена утечка памяти при повторном использовании объекта WiFiClient (#4497, #4516, #4549)

,