HTML-Ausgabe/Eingabe Webserver

Hallo zusammen,

gibt es eine Möglichkeit in der Webserveroberfläche im HTML-Format eine Ausgabe=Eingabe in einem Nummernfeld zu erstellen?
Es soll also der “value=XY” zum Beispiel durch einen EEPROM.Wert ersetzt werden.

Quasi an der Stelle VALUE die Klammer unterbrechen und irgendwas einfügen.

client.print(F(" \n"));

meine Kreativität nimmt ein Ende. Ich will doch einfach nur einen Momentanen Wert ändern. :o

Danke im Vorraus
Bernd87

Unbenannt.JPG

bernd87:
Es soll also der “value=XY” zum Beispiel durch einen EEPROM.Wert ersetzt werden.

Quasi an der Stelle VALUE die Klammer unterbrechen und irgendwas einfügen.

client.print(F(" \n"));

Versuch mal die Ausgabe zu teilen, und Deinen variablen Wert dazwischen auszugeben:

int value=random(1,61);
client.print(F("</td>   <td><form method=get><input name='PD1' type='number' value="));
client.print(value);
client.print(F("  min='1' max='60'>\n"));

P.S.: Fragen auf Deutsch gehoren NICHT in “programming questions”, sondern in " International > Deutsch" gepostet!

Danke für die schnelle Antwort. Leider ist meine Reaktionszeit nicht die beste! ;-)

...bei der Angabe eines einzelnen Wertes funktioniert die Methode mit dem zerpflücken der Anweisung! TOP!!! :-)

Leider geht das mit der Zeitangabe nicht. Ich habe die zeit in 4 Adressen gespeichert um bei der Auswertung der Zeit in der 6-Stelligen Form "00:00:00" (:00 immer nachträglich angefügt) immer die die gleiche Länge zu haben. Das einsetzen der Var. würde das dann so aussehen:

client.print(String(EEPROM.read(300)) + String(EEPROM.read(301)) + ':' + String(EEPROM.read(302)) + String(EEPROM.read(303)));

Leider schreibt er an dieser Stelle immer ein leeres Zeitfeld und diese "Zeit" direkt dahinter. :-( Beim Versuch vorher einen einzelnen String aus der Zeit zu machen, passiert das gleiche...

Habt Ihr noch eine Eingebung? Ich währe euch sehr verbunden.

Gruß Bernd87

bernd87:
Das einsetzen der Var. würde das dann so aussehen:

client.print(String(EEPROM.read(300)) + String(EEPROM.read(301)) + ‘:’ + String(EEPROM.read(302)) + String(EEPROM.read(303)));

Leider schreibt er an dieser Stelle immer ein leeres Zeitfeld und diese “Zeit” direkt dahinter. :frowning:
Beim Versuch vorher einen einzelnen String aus der Zeit zu machen, passiert das gleiche…

Habt Ihr noch eine Eingebung? Ich währe euch sehr verbunden.

Wenn in Deinem Code überall so reichhaltig von dem höchst verschwenderischen Datentyp “String” Gebrauch gemacht wird wie in der einen und einzigen von Dir vorgezeigten Codezeile, und Du auch ansonsten bei einem Webserver-Sketch vielleicht nicht RAM-sparend programmiert hast, tritt bei Dir womöglich der Fall ein, dass der Sketch eigentlich mehr RAM-Speicher benötigen würde als das Arduino-Board überhaupt hat. Z.B.:

  • RAM vorhanden: 2048 Bytes (z.B. “UNO”)
  • RAM benötigt: 2048 Bytes + x (wegen schlechter und verschwenderischer Programmierung)

Sketche, die mehr RAM verbrauchen als das Board eingebaut hat, laufen unter Umständen

  • gar nicht
  • teilweise nicht
  • eine Weile anscheinen einwandfrei und “stürzen dann ab”
    Kann man nicht vorhersagen.

Welches Arduino-Board verwendest Du und wieviel RAM-Speicher ist auf Deinem Arduino denn überhaupt noch frei, wenn der Sketch läuft?

HAllo,

ich verwende ein Arduino Ethernet dieser besitzt 32k. Derzeit habe ich noch 10% frei.

Ausgaben verlangen doch zwingend nach String, oder bin ich da auf dem Holzweg? Hast du eine Anregung wie ich diesen Speicherplatz optimieren kann?

bin für alle Lernhinweise offen!

Danke, Bernd87

bernd87: ich verwende ein Arduino Ethernet dieser besitzt 32k. Derzeit habe ich noch 10% frei.

Wenn Du das Board meinst: https://www.arduino.cc/en/Main/ArduinoBoardEthernet dann hat das Board 32 KB Flash, 2 KB RAM und 1 KB EEPROM Speicher.

Für den RAM-Verbrauch sind nur die 2 KB RAM relevant und nicht, wieviel Flash Du noch für den Programmcode übrig hast.

bernd87: Ausgaben verlangen doch zwingend nach String, oder bin ich da auf dem Holzweg?

"String-Objekte" sind eine Erfindung der Arduino-Macher, die vollkommen überflüssig ist und bei allen nicht-trivialen Programmen früher oder später zu Problemen führen.

Der standardmäßige Datentyp für Strings unter C/C++ ist "Char-Array" bzw. "nullterminierter String" oder "C-String" genannt. Dieser Datentyp ist sowohl effizient (in Bezug auf RAM-Nutzung) als auch extrem leistungsfähig (durch eine Vielzahl von verfügbaren Standardfunktionen) und ermöglicht schnelle Programme. Allerdings ermöglichen C-Strings im Gegensatz zu String-Objekten keine Verbindung von zwei Teil-Strings mittels Pluszeichen "+", dafür benötigt man in Standard-C einen Funktionsaufruf, oder man macht es gleich komplett anders und ruft eine Formatierungsfunktion auf, um z.B. eine Zeit aus drei numerischen Werten zu einem String zu formatieren, der dann ausgegeben werden kann.

bernd87: Hast du eine Anregung wie ich diesen Speicherplatz optimieren kann?

Ja. Bei Deinem Programm, das ich nicht kenne, wird das vermutlich sein: Komplett neu schreiben unter Vermeidung des Datentyps "String" Objekt, mit dem Ziel, so viel RAM-Speicher einzusparen, dass das Programm überhaupt noch mit dem beabsichtigten Funktionsumfang läuft.

Je nachdem wie der Code tatsächlich aussieht, können aber ggf. auch bereits kleinere Änderungen zu einer erheblichen Einsparung von RAM-Speicher führen - hängt ganz vom Code ab.

Auch beachten, dass alle String Literale - d.h. alle Konstante die in doppelten Anführungszeichen stehen - erst mal in RAM landen

Bei print()/println() und nur da, lässt sich das einfach mit dem F()-Makro umgehen:

client.print(F("</td>   <td><form method=get><input name='PD1' type='number' value="));

Also ein F() um den String. Dann bleibt er im Flash

Geht, mit Serial, Ethernet, SD und alle anderen Klassen die die Arduino Print Funktionalität verwenden