NodeMCU 1.0 автоматически сбрасывается через некоторое время

Я хочу показать несколько цифр на красной светодиодной панели 3x3 p10, где число будет поступать из облака, и оно будет постоянно обновляться. Для этого я использовал Nodemcu на базе esp8266. Для этого я использовал библиотеку WiFi Manager и библиотеку DMD2, и я запрашиваю сервер каждые 5 секунд, чтобы получить номер в ответ. Все работает нормально, но он продолжает перезапускаться через некоторое время, и для этого нет фиксированного времени, но он продолжает перезапускаться. Он выдает сообщение о том, что "сброс вызывает 4 режима загрузки (3,6)" сброс wdt... Я пробовал разные версии аппаратного обеспечения и платы esp, но ничего не работает. В настоящее время я использую arduino 1.8.9 и плату esp8266 версии 2.5.2

пожалуйста, загляните в мой код и подскажите мне, что не так ....

#include <Arduino.h>

#включить <WifiManager.h>
#включить <math.h> #включить <WiFiClient.h> #включить <ESP8266HTTPClient.h> #включить <EEPROM.h> #включить <ESP8266WiFi.h>

WifiManager WifiManager; количество входов;

HttpClient http; Строка svrHost = ""; unsigned int svrPort = 80; Строка svrURL = "";

//DMD #включить <SPI.h> #включить <DMD2.h> #включить <шрифты/Arial_Black_16.h> #включить <шрифты/Droid_Sans_36.h> #включить <шрифты/Droid_Sans_12.h> #включить <шрифты/Arial_New_56.h> //#включить <шрифты/Dmd13x20ClockX.h> //ПИН DMD #определение pin_A 16 #определение pin_B 12 #определить pin_sclk 0 #определение pin_clk 14 #определение pin_r 13 #определение pin_noe 15

int respin = D2; int btnstt = 0;

int wlcmgs = 1; Строковый ssid;

Строка dmdText = "0"; SPIDMD dmd(3, 3, pin_noe, pin_A, pin_B, pin_sclk); // Количество используемых панелей P10 X, Y //DMD_TextBox поле(dmd,0,0,32,5); // Поле для установки (dmd, x, y, Высота, Ширина)

//const char *MESSAGE = "iTrack LIVE InWard";

настройка void(){ Serial.begin (115200); EEPROM.начало (512); pinMode(повторный ввод, ВВОД);

//Сбросить значение Val
String doResetWifi = "0";
doResetWifi = readESP(257,1);

if(doResetWifi == "1"){
    writeESP(257,1,"0");
    wifiManager.resetSettings();  
}

Serial.println("\nReset Val "+doResetWifi);
//WifiManager.Сброс настроек();
countT = 0;  
wifiManager.autoConnect("LED-1");
Serial.println("connected...yeey :)");

//Чтение/Запись EPROM
if(wifiManager.svrURL != ""){
    svrHost = wifiManager.svrHost;
    svrPort = wifiManager.svrPort;
    svrURL = wifiManager.svrURL;
    //HOST
writeESP(0,50,svrHost);

    //ЗАПИСЬ в ПОРТ
writeESP(51,5,String(svrPort));

    //URL-АДРЕС
    writeESP(56,200,svrURL);

}else{
    // ХОСТ
    svrHost = readESP(0,50);

    //ПОРТ
    svrPort = readESP(51,25).toInt();

    //URL-АДРЕС
    svrURL = readESP(56,200);
}

//Настройка DMD
    dmd.setBrightness(255); // Установить яркость 0 - 255 
    //dmd.selectFont(Droid_Sans_36); // Используемый шрифт
    dmd.begin();     // Запуск DMD 

}

void loop(){

btnstt = digitalRead(respin);

если (btnstt == 1){ flashESP(); ОСОБЕННО сброс (); } doRequest();

  //box.print(dmdText);

если(wlcmgs==1){ dmd.selectFont(Droid_Sans_12); dmd.drawString(0,0, "Подключен"); задержка (5000); dmd.ClearScreen(); //scrlssid(); задержка (5000); wlcmgs=0; }

dmd.ClearScreen(); dmd.selectFont(Arial_New_56); int padingTop = 2;

dmd.Шнурок(круглый((96 - (dmdText.длина() * 24)) / 2), padingTop, dmdText);

задержка (1000 *5);

//dmd.selectFont(Arial_Black_16); //scrtxt(); }

аннулировать запрос(){
Serial.print("[HTTP] begin: "+svrHost+" "+svrPort+" "+svrURL+"\n"); Строковый ответ; if (HttpRequest(svrHost, svrPort, String("GET /") + svrURL, "", ответ)) { если (ответ.длина() != 0) {

        response.trim();
        dmdText = response;
        Serial.println(response);
        Serial.println(countT);          
        countT++;        
    }
}

}

bool HttpRequest(const Строка svrHOST, unsigned int svrPORT, const Строка и метод, const Строка и запрос, Строка и ответ) { Конкретный клиент;

if (client.connect(svrHOST, svrPORT)) {
    Serial.println("HTTP Connected");
} else {
    Serial.println("failed");
    return false;
}

client.print(method); 
client.println(F(" HTTP/1.1"));
client.print(F("Host: ")); 
client.println(svrHOST);
client.println(F("Connection: close"));
if (request.length()) {
    client.println(F("Content-Type: application/json"));
    client.print(F("Content-Length: ")); 
    client.println(request.length());
    client.println();
    client.print(request);
} else {
    client.println();
}

//Serial.println("Ожидающий ответ");
int timeout = millis() + 5000;
while (client.available() == 0) {
    if (timeout - millis() < 0) {
        Serial.println(">>> Client Timeout !");
        client.stop();
        return false;
    }
}

//Serial.println("Ответ на чтение");
int contentLength = -1;
while (client.available()) {  
    String line = client.readStringUntil('\n');
    line.trim();
    line.toLowerCase();
    if (line.startsWith("content-length:")) {
        contentLength = line.substring(line.lastIndexOf(':') + 1).toInt();
    } else if (line.length() == 0) {
        break;
    }
}

//Serial.println("Чтение тела ответа");
response = "";
response.reserve(contentLength + 1);
while (response.length() < contentLength && client.connected()) {
    while (client.available()) {
        char c = client.read();
        response += c;
    }
}
client.stop();
return true;

}

void writeESP(int start, int len, текст строки){ EEPROM.begin(512); int ind; для(ind = 0; ind < len; ind++){
EEPROM.write(ind +start,текст [ind]); } EEPROM.write(ind+start+text.length(),'\0');

EEPROM.commit();

EEPROM.end(); }

Чтение строки (int start, int len){ EEPROM.начало (512); символьные данные[len]; int ind; для(ind = 0; ind < len; ind++){ if(EEPROM.read(ind+start) != '\0'){ Данные[ind] = EEPROM.read(ind+start); }остальное{ разрыв; } } Данные[ind]='\0'; EEPROM.end(); возвращаемая строка (данные); }

void flashESP(){ Serial.print("\nУстановка ESP \n"); writeESP(257,1,"1"); ОСОБЕННО сброс (); задержка (2000); }

/* void scrtxt(){ const char *next = СООБЩЕНИЕ; while(*следующий) { Serial.print (*далее); поле.печать(*далее); задержка (200); следующий++; } } / / void scrlssid(){ dmd.drawString(5,0, "Связано с"); DMD_TextBox поле (dmd,0,20,96,16); ssid = WiFi.SSID(); const char *ssidNext= ssid.c_str(); int len = 0; while(ssidNext && len < ssid.длина()){ Serial.print(*ssidNext); поле.печать(*ssidNext); задержка (200); ssidNext++; len++; } } */

, 👍1

Обсуждение

Добро пожаловать, Ангкон. Выровняйте свой код (выберите и нажмите ctrl-k) и удалите любой код, который не вызывает сброс (попробуйте удалять части, пока он больше не сбрасывается, чтобы вы также могли сами выяснить, в чем проблема)., @Michel Keijzers

У вас есть тайм-аут сторожевого тайм-аута. Это вызвано тем, что ваш код блокируется и недостаточно "пинает собаку". Вы должны проверять части вашего кода, которые ничего не делают в течение длительных периодов времени, и регулярно выполнять функцию yield (), чтобы стек IP мог выполнять свою работу., @Majenko


1 ответ


2

Судя по вашему описанию, это похоже на сброс сторожевого таймера.

ESP8266 необходимо регулярно выполнять внутренние домашние задачи за пределами вашего собственного кода, такие как задачи, связанные с Wi-Fi / сетью. Обычно для выполнения этих задач требуется некоторое время обработки при каждой итерации loop() и при каждой команде delay().

Если ваш код выполняет действия, которые занимают больше времени, чем примерно 3,2 секунды, внутренний "сторожевой таймер" отключится и сбросит ESP, что вы и наблюдали.

Чтобы этого не произошло, вы должны поместить команду yield(); в фрагменты вашего кода, которые потенциально могут занимать больше 3 секунд, например циклы ожидания (например, цикл "Ожидание ответа" while() и аналогичные фрагменты вашего кода). Попробуйте это и посмотрите, решит ли это вашу проблему.

,