Forum: Mikrocontroller und Digitale Elektronik ESP8266 arduino maximale String grösse ?


von Michael L. (nightflyer88)



Lesenswert?

Hallo

Ich mache momentan ein paar Versuche mit dem ESP8266 WLAN Modul. Das 
ganze soll eine kleine Wetterstation ergeben, das ESP8266 liest die 
aktuellen Messwerte von einem BME280 und erzeugt mit den Daten eine 
einfache Webseite mit Diagramm das ebenfalls lokal erzeugt wird. Da 
keine Internetverbindung vorhanden ist, können keine externen google 
Charts verwendet werden. Soweit so gut...

Nun zum Problem: Durch die Aufzeichnung der Messwerte wird auf die Dauer 
immer mehr RAM benötigt, die Webseite wird als HTML Text erzeugt, und 
der Text wird natürlich auch immer grösser. Der HTML Text wird im String 
sResponse gespeichert, nun können aber in dem String nur ca. 3000byte 
gespeichert werden, danach überläuft das ganze.. Auch wenn ich den 
string mit reserve(6000) dimensioniere, ändert sich nichts daran.

Eigentlich sollte doch noch genügend RAM vorhanden sein ?!

Anbei mal den ganzen Code, vielleicht übersehe ich ja was..

Gruss Michael

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Michael L. schrieb:
> danach überläuft das ganze..

Das äußert sich auf welche Weise?

von Michael L. (nightflyer88)


Lesenswert?

Die Webseite kann dan nicht mehr angezeigt werden. Je nach Browser gehts 
aber trotzdem noch irgendwie, man sieht dann aber das am ende der Seite 
einige Infos fehlen, kommen dan noch mehr Messwerte dazu, fehlt immer 
mehr.

von Michael U. (amiga)


Lesenswert?

Hallo,

Deine Routine ist nicht die Einzige auf dem ESP8266.
Nutzt Du die Arduino-IDE?

Die Sendroutinen wollen Buffer haben, Benutzung z.B. der String-Klasse 
erzeugt bei fast allen Funktionen intern Kopien usw.

Möglichkeit: lege den HTML-Code und die Daten z.B. ins SPIFFS. Der 
Zugriff über die Stream-Klasse ermöglicht es ohne weiteres z.B. ein 
250kB Bild aus dem Filesystem direkt als als Webseite auszuliefern ohne 
daß der Ram knapp wird.

Die Grenze bei mir (Arduino-IDE, String-Klasse und SPIFFS) beim 
Zusammenbauen im Ram liegt auch bei ca. 4,5kB maximale Stringgröße.

Gruß aus Berlin
Michael

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ist es denn zwingend erforderlich, die Webseite mit exakt zwei 
"client.print"-Aufrufen auszugeben?

Das sollte doch auch mit mehreren Aufrufen von "client.print" machbar 
sein, und dann musst Du keine so riesigen Strings zusammenbasteln und 
Dein RAM dafür verballern.

von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

Michael U. schrieb:
> lege den HTML-Code und die Daten z.B. ins SPIFFS

Ja das ist super !! genau sowas habe ich gebraucht. Noch eine kleine 
Frage nebenbei: das SPIFFS dateisystem muss nur einmalig mit format() 
formatiert werden, und nicht nach jedem Bootvorgang, richtig ?

Habe nun noch ein anderes Problem mit der html Seite, irgendwie 
funktioniert das ganze nicht mit allen Browsern fehlerfrei. Mit MAC 
Safari kann die Seite zwar einwandfrei angezeigt werden, möchte ich dann 
den Quelltext anzeigen kommt ein Fehler, mit Safari auf dem iPhone kann 
die Seite gar nicht angezeigt werden, und mit Firefox auf MAC kann ich 
die Seite anzeigen und auch den Quelltext lesen ohne Probleme.

Habe mal in Firefox die Seite als html gespeichert und anschliessend in 
Safari geöffnet, funktioniert alles, auch die Quelltext anzeige.

von Planlos (Gast)


Lesenswert?

Michael L. schrieb:
> Habe nun noch ein anderes Problem mit der html Seite,

Vermutung:
<!DOCTYPE html> am Anfang fehlt.
Ohne Doctype ist es kein HTML5, sondern HTML-asbach-uralt.
Und im Uralt-HTML gab's kein SVG.

http://wiki.selfhtml.org/wiki/HTML/Dokumentstruktur_und_Aufbau

von Michael L. (nightflyer88)


Lesenswert?

Planlos schrieb:
> Vermutung:
> <!DOCTYPE html> am Anfang fehlt.

Nein an dem liegts nicht... Habe den Fehler nun eingrenzen können, das 
Problem ist das es zu lange dauert bis die Seite geladen ist (ca. 1.3s). 
Safari macht dan ein Timeout und meldet: Netzwerkverbindung 
unterbrochen. Dem Firefox Browser ist dies egal und macht kein Timeout.

Ich lade die html Datei vom SPIFFS in kleine Stücke in einen 
Stringbuffer und sende dies anschliessend zum WebBrowser, und genau 
dieses hin und her schieben in den Buffer dauert zu lang. Auch wenn die 
Dateistücke grösser sind ändert sich an der übertragungsdauer zum 
Browser nichts. Lade ich die Datei in einem Stück in den Buffer, dauert 
die anschliessende übertragung nur noch 110ms, der Safari Browser ist 
dann zufrieden.

So wie es aussieht ist einfach der SPIFFS zu langsam ?!

von Planlos (Gast)


Lesenswert?

Michael L. schrieb:
> So wie es aussieht ist einfach der SPIFFS zu langsam ?!

Nein, dein Programm ist einfach noch "Suboptimal" (Lies: Beschissen).

du beschreibst in der loop() dein Flash ständig neu.
Der Flash-Chip hat nur eine Begrenzte Anzahl an Schreibzyklen!
Und: Auch wenn du im http-Request-Handler nur das Flash-File ausgeben 
müsstest, baust du trotzden zuerst einen Monster-String zusammen.

Für den Header verwendest du einerseits RAM-sparende 
F("xxx")-Konstrukte, andererseits packst du sie der Reihe nach per 
String-Addition sinnlos wieder in den RAM, statt sie direkt dem 
TCP-Client zu übergeben.

Überhaupt: Warum friemelst du da Low-Level direkt auf TCP-Ebene herum? 
Masochist oder "#include <ESP8266WebServer.h>" in der 
ESP8266-Arduino-Doku übersehen?


Also: Umbauen: HTML-File einmalig statisch in den Flash schreiben. 
Gleich beim Programmieren, nicht aus deiner Software heraus.
Dann z.B: beim rausstreamen des HTML-Files Text-Ersetzungen vornehmen
oder HTML per Javascript dynamisch machen, per JSON nur die reinen Daten 
vom ESP dynamisch zusammenstellen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.