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++; } } */
@Angkon, 👍1
Обсуждение1 ответ
Судя по вашему описанию, это похоже на сброс сторожевого таймера.
ESP8266 необходимо регулярно выполнять внутренние домашние задачи за пределами вашего собственного кода, такие как задачи, связанные с Wi-Fi / сетью. Обычно для выполнения этих задач требуется некоторое время обработки при каждой итерации loop()
и при каждой команде delay()
.
Если ваш код выполняет действия, которые занимают больше времени, чем примерно 3,2 секунды, внутренний "сторожевой таймер" отключится и сбросит ESP, что вы и наблюдали.
Чтобы этого не произошло, вы должны поместить команду yield();
в фрагменты вашего кода, которые потенциально могут занимать больше 3 секунд, например циклы ожидания (например, цикл "Ожидание ответа" while()
и аналогичные фрагменты вашего кода). Попробуйте это и посмотрите, решит ли это вашу проблему.
- Как определить размер Flash?
- В ESP-12E NodeMCU, какой выход PIN A0?
- esp32 Stack canary watchpoint срабатывает
- Ошибка при загрузке «Произошла фатальная ошибка esptool.py: тайм-аут записи»
- Преобразование byte* в int в Arduino
- Каково использование зарезервированных контактов и контактов SDD2, SDD3 NodeMCU?
- ESP32S v1.1 NodeMCU vs ESP32 DevKitV1
- NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области
Добро пожаловать, Ангкон. Выровняйте свой код (выберите и нажмите ctrl-k) и удалите любой код, который не вызывает сброс (попробуйте удалять части, пока он больше не сбрасывается, чтобы вы также могли сами выяснить, в чем проблема)., @Michel Keijzers
У вас есть тайм-аут сторожевого тайм-аута. Это вызвано тем, что ваш код блокируется и недостаточно "пинает собаку". Вы должны проверять части вашего кода, которые ничего не делают в течение длительных периодов времени, и регулярно выполнять функцию yield (), чтобы стек IP мог выполнять свою работу., @Majenko