ESP8266 перестает работать через некоторое время (неизвестная проблема)
esp8266
loop
есть esp8266.
Я пытаюсь создать средство обновления DDNS.
приходится ждать 5 минут, а затем выполнять GET-запрос на URL.
Вот мой код:
/* Code For DNS Updater.*/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#define LOOP_TIME 300000
const char* ssid = "SomeSSID";
const char* password = "SomePSWD";
const String address="http://dynamicdns.park-your-domain.com";
const String path="update";
const String pathHost="host";
const String pathPassword="password";
const String pathDomain="domain";
const String dnsName="my-example-host.com";
const String ddnsPassword="my-example-password";
const String updateHosts[]={
"@",
"subdomain1",
"subdomain2",
};
void setup() {
Serial.begin(115200);
connectWiFi();
}
long nextUpdate=0;
void loop() {
if(nextUpdate<millis()){
if (WiFi.status() == WL_CONNECTED) {
updateDNS();
}else{
connectWiFi();
}
nextUpdate=millis()+LOOP_TIME;
}
}
void updateDNS(){
Serial.println("Updating Hosts:");
for(int host=0;host<(sizeof(updateHosts)/sizeof(String));host++){
Serial.print(updateHosts[host]+": ");
String assembledURL=address+"/"+path+"?"+pathHost+"="+updateHosts[host]+"&"+pathDomain+"="+dnsName+"&"+pathPassword+"="+ddnsPassword;
// Serial.println("Host: "+updateHosts[host]+" URL: "+assembledURL);
HTTPClient http;
http.begin(assembledURL);
http.GET();
http.end();
Serial.println("Done");
}
}
void connectWiFi(){
WiFi.begin(ssid, password);
Serial.print("Connecting To ");
Serial.println(ssid);
Serial.print("Password: ");
Serial.println(password);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected To ");
Serial.println(ssid);
}
и он останавливается через пару часов — что нехорошо для программы обновления DDNS.
EDIT: возможно, это как-то связано с моим таймером. Попробую вместо этого unsigned long.
@Nadav Tasher, 👍0
1 ответ
▲ 1
У меня тоже были «остановки через некоторое время», и это оказалось из-за потребления памяти кучи и фрагментации, из-за которых больше не хватало места в стеке и куче.
Мое решение: время от времени проверять кучу (в цикле) и перезагружать узел, когда она достигает практического предела.
Альтернатива: избегайте использования типа String и других вариантов использования Heap.
,
@Matthias Hertel
Смотрите также:
- Как я могу зациклить свой код? Например, через 30 минут?
- Глобальная переменная не изменяется, когда значение задано в логической функции
- Почему этот чрезвычайно простой код не работает?
- Цикл for(), похоже, не прерывается?
- Функция запуска при срабатывании
- Как читать и записывать EEPROM в ESP8266
- Как сделать выводы Tx и Rx на ESP-8266-01 в выводах GPIO?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?