Pages: [1] 2   Go Down
Author Topic: Frage zu Webserver  (Read 480 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen

Habe da mal eine Frage zu Webserver

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


bye juergen
Logged

Offline Offline
Faraday Member
**
Karma: 126
Posts: 4092
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Kommt letztlich darauf an was du genau machen willst.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Faraday Member
**
Karma: 126
Posts: 4092
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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:
Code:
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:
Code:
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.
« Last Edit: March 09, 2014, 08:38:20 am by Serenifly » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Faraday Member
**
Karma: 126
Posts: 4092
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Faraday Member
**
Karma: 126
Posts: 4092
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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>
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Faraday Member
**
Karma: 126
Posts: 4092
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Padding mit Leerzeichen sollte auch auf dem AVR gehen:
Quote
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:
Code:
  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);
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
Faraday Member
**
Karma: 126
Posts: 4092
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Da kenne ich mich nicht aus :/
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist HTML , dass soll so sein.
Wenn du den Browser zwingen willst, mehrere Leerzeichen zu schreiben, musst du passende Formatierung senden,
Code:
<pre> Text   mit  jeweils  2  Leerzeichen </pre>
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen

Hallo michael_x

Code:
<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
Logged

Offline Offline
Faraday Member
**
Karma: 126
Posts: 4092
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

<pre> steht für pre-formatted. Du fügst also <pre></pre> 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:
http://www.w3schools.com/tags/tag_pre.asp


Für Farben, etc. schau dir mal CSS an:
http://de.html.net/tutorials/css/
Logged

Pages: [1] 2   Go Up
Jump to: