Hallo zusammen
Habe da mal eine Frage zu Webserver
Gibt es Befehle wie beim LCD das Ich eine Formatierte Ausgabe machen kann
bye juergen
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 ![]()
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.