Frage zu Webserver

Hallo zusammen

Habe da mal eine Frage zu Webserver

Gibt es Befehle wie beim LCD das Ich eine Formatierte Ausgabe machen kann

bye juergen

Strings kann man immer formatieren. Am einfachsten ist es wenn man C-Strings verwendet.

Kommt letztlich darauf an was du genau machen willst.

Hallo zusammen

Hallo Serenifly

Ich moechte Daten von meiner Pv-Anlage ueber den Webserver ausgeben
Leitungsdaten, Leistung je Stunde Momentleistung,KWH/KWP

komme mit client.println nicht weiter
kann die Daten nicht formatieren

Habe einen Arduino Mega

bye juergen

Schau dir mal sprintf an:
http://www.cplusplus.com/reference/cstdio/sprintf/
http://www.cplusplus.com/reference/cstdio/printf/

Damit kann man z.B. sowas machen:

char str[16];
int val1 = 2;
int val2 = 8;
int val = 20;
sprintf(str, "%02d,%02d,%02d", val1, val2, val3);

Ergebnis:
"02,08,20"

Noch besser ist hier das:

sprintf_P(str, PSTR("%02d,%02d,%02d"), val1, val2, val3);

Damit belegt der Format-String keinen Speicher in RAM

Du kannst natürlich auch das "02" weglassen. Das bewirkt in diesem Fall dass alle Zahlen 2 Ziffern breit sind. Sowas brauchst du bei dir eher nicht. Aber man kann es auch einfach so machen:

sprintf(str, "%d,%d,%d", val1, val2, val3);

Dann wird jede Ziffer so breit formatiert wie sie ist. Man kann auch die 0 weglassen. "%2d" wurde das statt dessen mit Leerzeichen auffüllen.

Du musst lediglich str groß genug machen, das für alle Zeichen + 1 Platz ist

Aber Achtung: das ist auf dem Arduino aus Speichergründen nicht für Float implementiert! Für Float braucht man einen Umweg über dtostrf:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42
http://www.mikrocontroller.net/topic/86391

Es gibt aber auch Patches, die die Funktion komplett implementieren. Kann man über die Forum Suchfunktion finden.

Hallo zusammen

Hallo Serenifly

Ich hatte es mit sprintf gemacht aber Ich hatte auch fload-werte eingebunden
dann wurde bei jeder Ausgabe ein reset ausgeloest und Ich bin dann von dem Weg abgegangen
hatte nicht mehr daran gedacht juri hatte es mir geschieben das Problem mit float und sprintf
Ich werde es jetzt so machen wie Du es mir vorgeschlagen hast

Ich danke dir schon ein mal fuer deine Hilfe

bye juergen

printf() ist eine ziemlich komplizierte und lange Funktion. Bei AVR gcc kann man einstellen ob man die Float Unterstützung kompiliert oder nicht. Auf dem Arduino hat man sich dafür entschieden das nicht zu machen und dann dummerweise keine Möglichkeit geschaffen das einfach zu ändern. Das gleiche mit scanf()

Es gibt wie gesagt Patches dazu:
http://forum.arduino.cc/index.php/topic,124809.msg940922.html#msg940922
Vergrößert halt den Sketch etwas

Man kann wie gesagt auch erst mal die floats in strings wandeln und diese dann mit %s einfügen. Braucht halt wieder einen Puffer im RAM :s

Hallo zusammen

Hallo Serenifly

Noch mal eine Frage
Gibt es eine moeglichkeit

sprintf_P(str, PSTR("%02d,%02d,%02d"), val1, val2, val3);

Dieses in mehreren zeilen zu schreiben brauche 17 Parameter juer die Ertragsstunden

Ich Danke schon ein mal

bye juergen

Ja. Das geht problemlos. Der Format String muss allerdings in einer Zeile stehen. Oder du splittest ihn mit "" um die Teil-Strings.

Achte dabei darauf das das Puffer Array groß genug ist. Das ist das unschöne bei dieser Funktion. Man muss vorher die maximale Größe kennen oder zumindest abschätzen.

Was ich noch vergessen hatte. Für PSTR() und _P Funktionen musst du noch das machen:
#include <avr/pgmspace.h>

Hallo zusammen

Hallo Serenifly

Wenn Ich die nullen weg lasse
sprintf_P(zeile0, PSTR("%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d")
schreibt er
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
er sollte aber mit Leerzeichen auffuellen

mit nullen

sprintf_P(lcdzeile0,PSTR("%05d,%05d,%05d,%05d,%05d,%05d,%05d,%05d,%05d,%05d,%05d,%05d,%05d,%05d,%05d,%05d,%05d,%05d")
schreibt er
00000,00000,00000,00000,00000,00000,00000,00000,00000,00000,00000,00000,00000,00000,00000,00000,00000,00000

bye juergen

Der kann gar nichts schreiben weil du überhaupt keine Parameter übergibst

Padding mit Leerzeichen sollte auch auf dem AVR gehen:

An optional decimal digit string specifying a minimum field width. If the converted value has fewer characters than the field width, it will be padded with spaces on the left (or right, if the left-adjustment flag has been given) to fill out the field width.

Geht bei mir auch:

  int val1 = 10;
  int val2 = 2;
  int val3 = 300;

  char str[30];
  sprintf_P(str, PSTR("%5d,%5d,%5d"), val1, val2, val3);
  Serial.println(str);

Hallo zusammen

Hallo Serenifly

Er schreibt die Leerzeichen auch bei 0 aber der Firefox gibt sie nicht aus
sprintf_P(zeile2, PSTR("%s")," 01 02 03 04 05 06 07 08 09");
client.println(zeile2);
ergebnis
01 02 03 04 05 06 07 08 09

Er nimmt die ersten 2 Leerzeichen weg und zwischen den zahlen immer 2 Leerzeichen weg

bei Serial.println (lcdzeile0);

Ist die ausgabe Richtig

bye juergen

Ok, dann liegt es nicht am Arduino, sondern an Browser oder irgendwo anders

Da kenne ich mich nicht aus :confused:

Das ist HTML , dass soll so sein.
Wenn du den Browser zwingen willst, mehrere Leerzeichen zu schreiben, musst du passende Formatierung senden,

<pre> Text   mit  jeweils  2  Leerzeichen </pre>

Hallo zusammen

Hallo michael_x

<pre> Text   mit  jeweils  2  Leerzeichen </pre>

Verstehe Ich nicht kenne Mich mit HTML aus

Mich wuerde auch intressieren wie Ich Ueber den Webserver die Hintergrundfarbe
Schriftfarbe + Schriftgroesse aendern kann.

Gibt es da eine gute Anleitung

bye juergen

 steht für pre-formatted. Du fügst also 
 im Format-String ein, oder schickst das separat mit print davor und danach. Dann akzeptiert der Browser das genauso wie man es vorgibt. Siehe hier:


Für Farben, etc. schau dir mal CSS an:

Hallo zusammen

Hallo michael_x

Jetzt verstehe Ich was Du meinst
Ich Danke Dir

Hallo Serenifly

Das ist ja ein sehr guter Link

Eine Frage wenn Ich folgenden Befehl eingebe bekomme Ich
folgende Fehlermeldung

zaehler12:425: error: stray '#' in program
zaehler12.ino: In function 'int netz()':
zaehler12:425: error: expected )' before 'background' zaehler12:425: error: expected ;' before ')' token

Meine Frage kann man das nicht in client.println senden

client.println("<body style="background-color:#ff0000;">");

bye juergen

Das Problem sind die Anführungszeichen. Du musst bestimmte Zeichen mit \ escapen, sonst kann der Compiler das nicht vom Ende des Strings unterscheiden:

client.println("<body style=\"background-color:#ff0000;\">");

Es bietet sich übrigens auch hier an, die Strings im Flash zu lassen:
client.println(F("Text im Flash"));
Das verlangsamt aber auch eventuell den Seitenaufbau etwas, da das Kopieren vom Flash ins RAM natürlich mehr Zeit braucht.