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
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.
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
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.
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.
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
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 ?!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.

