Eigentlich habe ich keine Lust, ...mehr, immer wieder drauf hinzuweisen das der Sketch zur EspCoreVersion passen sollte!
Entweder den Sketch mit CoreVersion 2.4.2 oder älter kompilieren oder den Sketch an die aktuelle Version des ESP8266HTTPClient anpassen.
Die Fragmentierung kann man sich ab CoreVersion 2.5.0 anzeigen lassen.
ESP.getHeapFragmentation();
Sorry, dass Neulinge die gleichen Fehler machen, die viele andere auch schon gemacht haben. Und manchmal ist es schwer die richtigen Fragen zu stellen, wenn man den Fehler nicht erkennt...
Der Fehler passiert immer nach dem Check-Point 10 also bei http.end();
Serial.println("CHECK-Point aktor 08");
if (value_str.toInt()) {
Serial.println("CHECK-Point aktor 09");
value = true;
Serial.println("CHECK-Point aktor 10");
}
}
}
http.end();
}
Serial.println("CHECK-Point aktor 11");
return value;
Hier das vollständige Skript welches jetzt seit einigen Minuten ohne Absturz durchläuft.
Die prints habe ich wieder rausgelöscht.
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
WiFiClient client;
HTTPClient http;
#define ssid "ssid"
#define password "password"
String message;
String httpCode;
String value_str;
String http_adress;
bool aktor(int mC, int aktor, int set) {
bool value = false;
if (WiFi.status() == WL_CONNECTED) {
message = "<?xml version='1.0'?>\n<methodCall>\n<methodName>";
if (set != -1) {
message += "set_aktor";
} else {
message += "read_as";
}
message += "</methodName>\n<params>\n";
message += "<param><value><int>";
message += aktor;
message += "</int></value></param>\n";
message += "</params>\n</methodCall>\n";
http_adress = "http://DG-Home-" + String(mC) + ":55072";
http.begin(client,http_adress);
int check = http.sendRequest("POST", message);
if (check > 0) {
httpCode = http.getString();
int start_value = httpCode.indexOf("<int>") + 5;
if (start_value > 5) {
int stop_value = httpCode.indexOf("</int>");
value_str = httpCode.substring(start_value, stop_value);
if (value_str.toInt()) {
value = true;
}
}
}
http.end();
}
return value;
}
void setup() {
//message.reserve(300);
//httpCode.reserve(300);
//value_str.reserve(50);
//http_adress.reserve(30);
Serial.begin(115200);
Serial.println();
WiFi.begin(ssid, password);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
bool a = aktor (64, 169, -1);
bool b = aktor (64, 170, -1);
bool c = aktor (64, 171, -1);
bool d = aktor (60, 175, -1);
Serial.println(a + b + c + d);
delay (1000);
}
Und falls jemand fragt warum ich diese Schleife so kompliziert programmiert habe:
if (value_str.toInt()) {
value = true;
}
Später kommen hier Wert bis 100 an und werden natürlich anderes weiterverarbeitet als die einfache Summierung im loop....
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
WiFiClient client;
HTTPClient http;
#define ssid "ssid"
#define password "password"
String message;
String value_str;
String http_adress;
bool aktor(int mC, int aktor, int set) {
bool value = false;
if (WiFi.status() == WL_CONNECTED) {
message = F("<?xml version='1.0'?>\n<methodCall>\n<methodName>");
if (set != -1) {
message +=F("set_aktor");
} else {
message +=F("read_as");
}
message += F("</methodName>\n<params>\n"
"<param><value><int>");
message += aktor;
message += F("</int></value></param>\n"
"</params>\n</methodCall>\n");
http_adress = "http://DG-Home-" + String(mC) + ":55072";
http.begin(client,http_adress);
int check = http.POST(message);
if (check > 0) {
if (check == HTTP_CODE_OK) {
const String& httpCode = http.getString();
int start_value = httpCode.indexOf("<int>") + 5;
if (start_value > 5) {
int stop_value = httpCode.indexOf("</int>");
value_str = httpCode.substring(start_value, stop_value);
if (value_str.toInt()) {
value = true;
}
}
}
}
http.end();
}
return value;
}
void setup() {
//message.reserve(300);
//httpCode.reserve(300);
//value_str.reserve(50);
//http_adress.reserve(30);
Serial.begin(115200);
Serial.println();
WiFi.begin(ssid, password);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
bool a = aktor (64, 169, -1);
bool b = aktor (64, 170, -1);
bool c = aktor (64, 171, -1);
bool d = aktor (60, 175, -1);
Serial.println(a + b + c + d);
delay (1000);
}
Was mich noch irritiert:
Die beiden Definitionen
WiFiClient client;
HTTPClient http;
finden sich im Beispiel im loop. Aber warum immer wieder neu definieren?
Ich habe sie am Anfang vom Sketch nach include gesetzt.
Spart doch dann auch wieder Kapazitäten, oder sehe ich da was falsch?
suche nach scope von Variablen.
Oder hier halt scope von Instanzen.
Du legst die Objekte global an - das heißt sie existieren immer und belegen auch immer RAM.
würdest du es in der Funktion machen, existieren sie nur für die Dauer der Funktion.
P.S.: da du jetzt erste Sachen mit dem F-Makro machst,
Korrigiert...
Wo Du recht hast, hast Du recht.
Danke nochmal.
Inzwischen tut mein Raspberry, was mein ESP sagt und das Display des ESP zeigt die richtigen Daten vom Raspberry an, egal, wo ich die Daten dann ändere.