Webserver HTLM CODE

Hallo Zusammen

Habe mal wieder Fragen an die Profis

Ich moechte Button nebeneinander haben das klapt auch nur wenn Ich den
Button eine Hintergrundarbe gebe sind sie nicht mehr in einer Reihe

Und gut waere auch wenn man Die Farbe ueber eine Varieable aendern koennte

und noch den Abstand der Buttons veraendern kann

Kann man den Cache-Speicher des Webservers erhoehen

Hier der Code der Buttons

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
       "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
</head>
<body>



  <p>

<table border=\"1\">


  <nobr>
<form action='/' method='POST'><input type='hidden' name='PinD100' value='0'><input type='submit'  value='ANZ 1'/></form>


<form action='/' method='POST'><input type='hidden' name='PinD101' value='1'><input type='submit'  value='ANZ 2'/></form>


<form action='/' method='POST'><input type='hidden' name='PinD100' value='0'><input type='submit'  value='ANZ 3'/></form>

<form action='/' method='POST'><input type='hidden' name='PinD100' value='0'><input type='submit'  value='ANZ 4'/></form>

<form action='/' method='POST'><input type='hidden' name='PinD100' value='0'><input type='submit'  value='ANZ AUS'/></form>
  </nobr>

  </p>

</body>
</html>

bye juergen

Wo genau ist hier der Zusammenhang mit dem Arduino?

Kann man den Cache-Speicher des Webservers erhoehen

Welchen Cache?

Hallo Zusammen

Hallo pylon

Ich dachte jede Schnittstelle hat einen Cache-Speicher zb Seriel 64 Byte

bye juergen

Hallo Jürgen,
Ich vermute dein Problem mit der Position der Buttons würde sich über div Tag's lösen lassen.
Also jeden Button in ein div Tag packen, dem Div Tag kannst du sagen wo er im übergeordnetem Div stehen soll.
Etwa so als Stylesheet, kannst natürlich auch im Div Tag selbst einbauen.

#Button1 {
position:absolute;
width:40px;
top:88px;
left:115px;
height:20px;
color:white;
font-size:20px;
text-align:center;
}

Im HTML Code erstellst du ein Div mit ID Button1 und dort baust du deinen Buttoncode rein.
Zum Testen brauchst du keinen Arduino. Ein guter Texteditor und ein Browser reichen aus.

Wenn auf der HTML Seite und evtl. javascript alles passt übernehme ich das in den Arduinocode.

Must dich wirklich einlesen und viel Testen (also learning by doing)
Das hier ist eine gute Quelle SELFHTML-Wiki

Hallo Zusammen

Hallo rudirabbit

ich danke Dir schon einmal

Ich kenne die Seite und habe da auch einges gelernt
nur mit den Button und Post habe Ich es nicht hinbekommen
ohne Post klappt es mit den Farben

bye juergen

Hallo Jürgen,
Als ich mit dem Webserver Projekt angefangen habe war ich HTML und Java mässig komplett wissensfrei.
Wenn man sowas bauen will, muss man sich leider damit befassen, bin der HTML Sache eher abgeneigt.
Vor allem weil es immer Probleme gibt mit den verschiedenen Browsern. Der eine Code läuft auf den Firefox aber nicht auf den andern oder umgekehrt.
Um das auf dem Arduino umzusetzen müsste der HTML Code auch noch Browserspezfisch geschrieben werden.
Mein Server wird nur auf dem Firefox sauber dargestellt - der Rest ist mir egal.

Zum Thema:
Ob DIV Tags nun die beste Lösung sind kann ich nicht beurteilen, bei mir funktioniert es so.
Ich verstehe das so, es ist ein Container den man beliebig positionieren kann (incl. Inhalt)

Hallo Zusammen

Hallo rudirabbit

koentest Du mir ein Beispiel geben wie Ich die
Button defination in die <form > bekomme


[code

]#Button1 {
position:absolute;
width:40px;
top:88px;
left:115px;
height:20px;
color:white;
font-size:20px;
text-align:center;
}

<form action='/' method='POST'><input type='hidden' name='PinD100' value='0'><input type='submit'  value='ANZ 1'/></form>

bye juergen

Ich dachte jede Schnittstelle hat einen Cache-Speicher zb Seriel 64 Byte

Der Webserver ist ja auch keine Schnittstelle. Zudem ist das kein Cache, sondern ein Pufferspeicher. Ein Cache ist ein Zwischenspeicher, der vielabgerufene Informationen vorhält (speichert), damit sie beim nächsten Abruf schneller geliefert werden können. Das ist bei der seriellen Schnittstelle nicht der Fall.

Ein Webserver kannst Du auf dem Arduino mit vielen Schnittstellen betreiben, häufig wird das Ethernet-Shield (WizNet5100) verwendet, aber auch ENC28J60 sind nicht selten, oder WiFi-basierte Produkte. Da nicht mal im Ansatz erwähnt hast, dass Du eines dieser Produkte einsetzt, kann ich auch keine Aussagen über deren Puffer-Verhalten machen.

Hallo Zusammen

Hallo rudirabbit

Habe es mit den Farben geschaft

Ich Danke noch einmal

Hallo pylon

Habe ein Arduino Ethernet Shield w5100 mit SD

bye juergen

Habe ein Arduino Ethernet Shield w5100 mit SD

Bei der Ethernet-Bibliothek findet kein Puffern statt, was zu einer merklichen Verlangsamung führen kann, weil praktisch jedes Zeichen in einzelne TCP-Pakete gepackt wird. Verbessern kann man die Situation, wenn statt der print() bzw. println()-Methoden die write()-Methode mit zwei Parametern (byte-Array und Länge) verwendet wird. Wenn Du einen String mittels z.B. snprintf aufbaust, kannst Du so einiges an Geschwindigkeit herausholen.

Bei der Ethernet-Bibliothek findet kein Puffern statt, was zu einer merklichen Verlangsamung führen kann, weil praktisch jedes Zeichen in einzelne TCP-Pakete gepackt wird.

@pylon das hat mich schon nachgedenklich gemacht, da ich bei den den Statistikseiten meines Webservers sowas (siehe unten) drin hab.
Nach diesem Codefragment kommt eine längere for Schleife um EEpromdaten Bytesweise via cl.print zu den Browsern zu schicken.
Wenn jedes Byte ein TCP-Paket wäre müsste die Darstellung der Refresh der Seite total langsam sein.
Ist sie aber nicht wirklich - ob langsam oder schnell ist natürlich relativ.

Die Umsetzung deines Vorschlags habe ich verstanden, macht aber hier viel Arbeit.
Ist der Performancegewinn wirklich so gravierend ?

cl.print("<img src='http://chart.apis.google.com/chart?cht=bvs&chbh=a&chco=FF0000,00FF00&chs=900x225&chxr=0,0,");
cl.print((float)maxi/150.0);
cl.print(",");
cl.print((float)maxi/1500.0);
cl.print("|1,0,24,1&chxs=0N* * kw/h&chg=4.16,10,3,3,0,0&chxt=y,x&chd=t:");

Wenn jedes Byte ein TCP-Paket wäre müsste die Darstellung der Refresh der Seite total langsam sein.
Ist sie aber nicht wirklich - ob langsam oder schnell ist natürlich relativ.

Relativ ist hier angebracht.

Ist der Performancegewinn wirklich so gravierend ?

Du kannst locker Faktor 40 raus holen. Ist das gravierend? Wenn Dir die jetzige Geschwindigkeit genügt, dann lass es, ansonsten kannst Du Dich ja mal daran versuchen. Man könnte noch viel mehr rausholen, wenn man noch ein Low-Level-API für das Ethernet-Shield anbieten würde. Der WizNet5100 hätte eigentlich 2kB Pufferspeicher pro Socket, bei der Grösse macht aber zumindest der UNO mit seinem RAM nicht mehr mit, wenn Du alles lokal aufbereiten willst. Wenn man aber quasi Zeichen um Zeichen an den Chip senden könnte und am Schluss den Befehl für den Versand des Pakets könnte man durchaus was rausholen. Auf der anderen Seite werden Zeichen und Befehle mit 4Mbit/s an den WizNet übergeben und der Overhead auf diesem Flaschenhals ist für die Geschwindigkeit fast wichtiger, wenn wir nicht mehr von einzelnen Zeichen sondern von Blöcken um die 100 Byte reden.

Hallo Zusammen

Hallo pylon

Ich Versende meist nur variablen beim refresh sehe Ich das
sich die Tabelle aufbaut es ist wie ein zucken
Wie geht es mit write()-Methode hast du vieleicht mal ein kurzes Beispiel
zum Beispiel wenn man einen Long wert sendet
Meine Tabelle im Webserver hat 150 Werte da es eine PV-ueberwachung ist waere
es schon gut wenn es schnell geht

Hier mal den zweiten Teil meiner Tabelle

 client.println("<table border='1' width=\"900\">");
          // client.println("<p style=\"">Dieser Textabsatz hat einen bstand von 3em zum darauffolgenden.</p>");
          //  client.println("<tr>" );
          client.println("<colgroup width=\"50\" span=\"19\"></colgroup>" );


          client.println("<tr>" );
          client.println("<th align=\"left\"h>STD</th>" );
          client.println("<th>04</th>" );
          client.println("<th>05</th>" );
          client.println("<th>06</th>" );
          client.println("<th>07</th>" );
          client.println("<th>08</th>" );
          client.println("<th>09</th>" );
          client.println("<th>10</th>" );
          client.println("<th>11</th>" );
          client.println("<th>12</th>" );
          client.println("<th>13</th>" );
          client.println("<th>14</th>" );
          client.println("<th>15</th>" );
          client.println("<th>16</th>" );
          client.println("<th>17</th>" );
          client.println("<th>18</th>" );
          client.println("<th>19</th>" );
          client.println("<th>20</th>" );
          client.println("<th>21</th>" );
          client.println("</th>" );
          client.println("</tr>" ); 

          client.println("<tr>" );
          client.println("<th align=\"left\">PV1G</th>" );

          for (i = 0; i < 18; i = i + 1) {
            client.println("<th align=\"right\">" );
            client.println(pv1stundenges[i]);
            client.println("</th>" );
          }
          client.println("</tr>" );

          client.println("<tr>" );
          client.println("<th align=\"left\">PV1</th>" );

          for (i = 0; i < 18; i = i + 1) {
            client.println("<th align=\"right\">" );
            client.println(pv1stunden[i]);
            client.println("</th>" );
          }
          client.println("</tr>" );  

          //

          client.println("<tr>" );
          client.println("<th align=\"left\">verh</th>" );

          for (i = 0; i < 18; i = i + 1) {
           

            client.println("<th align=\"right\">" );

            client.println(verhaetnispv1pv2[i]);
            // }

            client.println("</th>" );
          }
          client.println("</tr>" );  

          client.println("<tr>" );
          client.println("<th align=\"left\">PV2G</th>" );

          for (i = 0; i < 18; i = i + 1) {
            client.println("<th align=\"right\">" );
            client.println(pv2stundenges[i]);
            client.println("</th>" );
          }
          client.println("</tr>" );

          client.println("<tr>" );
          client.println("<th align=\"left\">PV2</th>" );

          for (i = 0; i < 18; i = i + 1) {
            client.println("<th align=\"right\">" );
            client.println(pv2stunden[i]);
            client.println("</th>" );
          }
          client.println("</tr>" );  


          client.println("<tr>" );
          client.println("<th align=\"left\">GES.</th>" );

          for (i = 0; i < 18; i = i + 1) {
            client.println("<th align=\"right\">" );
            client.println(pv1stundenges[i]+pv2stundenges[i]);
            client.println("</th>" );
          }
          client.println("</tr>" );



          client.println("</table>" );
          client.println("
");
        }

        client.println("</nobr>");
       
  
        //  client.println("</table>");

Dann habe Ich noch etwas

Ich erstelle einen Button
Nur ein Button mit der Postabfrage braucht 218 Byte Ram-Speicher
kann man das in den Flash verlegen

client.println("<form action='/' method='POST'><input type='hidden' name='PinD100' value='0'><input type='submit' style='position:relative; top:20px;  position:relative; left:20px; '  value='ANZ 1'/></form>" );

bye juergen

Ich erstelle einen Button
Nur ein Button mit der Postabfrage braucht 218 Byte Ram-Speicher
kann man das in den Flash verlegen

Ja, das ist ganz einfach, mach das F()-Makro drum:

client.println(F("<form action='/' method='POST'><input type='hidden' name='PinD100' value='0'><input type='submit' style='position:relative; top:20px;  position:relative; left:20px; '  value='ANZ 1'/></form>" ));

Wie geht es mit write()-Methode hast du vieleicht mal ein kurzes Beispiel
zum Beispiel wenn man einen Long wert sendet

Sicher, aus:

          for (i = 0; i < 18; i = i + 1) {
            client.println("<th align=\"right\">" );
            client.println(pv1stundenges[i]);
            client.println("</th>" );
          }

wird dann

char buffer[50];
          for (i = 0; i < 18; i = i + 1) {
            uint8_t l = snprintf_P(buffer, 50, "<th align=\"right\">%d</th>\r\n", pv1stundenges[i]);
            client.write(buffer, l);
          }

wobei Du die buffer-Variable global definieren kannst, aber der Unterschied ist marginal.

Hallo Zusammen

Hallo pylon

Das mit dem F()-Makro klapt sehr gut
Is bischen lamgsamer aber ist Ok ist ja kein Ram

Dann zu write()-Methode ist die laenge bei Char immer 1 oder hat er
da eine andere bedeutung Ich danke dir schon einmal

write()-Methode mit zwei Parametern (byte-Array und Länge) 
client.write(buffer, l);

bye juergen

Du kannst locker Faktor 40 raus holen. Ist das gravierend?

Ok - das ist eine Ansage ! Denke der Aufwand lohnt sich.
Da ich mein Projekt sowieso komplett von den String Objekten befreien wollte und komplett und auf Char Arrays umbauen wollte passt das gerade perfekt.
Danke, das du etwas von deinem Wissen abgezweigt hast :wink:

Ram Probleme habe ich wie schon gesagt dank Ram Extention und Code::Blocks keine mehr.
Inzwischen denke ich, das sowas auf dem Due wohl besser laufen würde.
Ist aber immer noch eine Hemmschwelle zu vorhanden ( 3,3 Volt Logic und auch ob auch die Lib's dort richtig laufen)

Habe vorher auch mit dem F-Macro gearbeitet - und musste festellen das hier die Performance deutlich in den Keller ging.
Mit der print Methode der Lib konnte ich in Zeitlupe ansehen wie die etwas umpfangreichere Webseite aufgebaut wurde.
Flash ist halt langsamer als SRam, so meine Erklärung.

In Verbindung mit der write()-Methode könnte das evt. kompensiert werden.

pylon:

char buffer[50];

for (i = 0; i < 18; i = i + 1) {
           uint8_t l = snprintf_P(buffer, 50, "<th align="right">%d\r\n", pv1stundenges[i]);
           client.write(buffer, l);
         }

Bei der _P Version gehört allerdings ein PSTR() um den Format String herum, so dass dieser im Flash bleibt. Außerdem braucht man #include <avr/pgmspace.h>

@juergen01
Der zweite Paramter ist nicht "1", sondern ein kleines "L". snprintf() gibt die Länge des geschriebenen Strings zurück:
http://www.cplusplus.com/reference/cstdio/snprintf/

F() oder Flash Verwendung generell ist langsamer, weil durch das Kopieren jedes Zeichens aus dem Flash ins RAM nun mal ein Overhead entsteht. Man braucht einfach mehr Befehle um das gleiche zu machen. Es hat nichts mit Geschwindigkeit des Speichers zu tun. Aber meistens immer noch besser als das RAM voll zuschreiben.

http://www.nongnu.org/avr-libc/user-manual/pgmspace.html

The macros and functions used to retrieve data from the Program Space have to generate some extra code in order to actually load the data from the Program Space. This incurs some extra overhead in terms of code space (extra opcodes) and execution

Aber meistens immer noch besser als das RAM voll zuschreiben.

Wenn man aber genug RAM hat, ist es wohl besser das F-Makro nicht zu benutzen.

Wegen der write() Methode der EthernetClient Class.
Konstante Zeilen der Website lassen sich wohl einfach umsetzen:
Beispiel Vorher:

client.println("<style type=\"text/css\">");

Nachher:

client.write("<style type=\"text/css\">\n");

Gibt wohl eine überladene Methode von write() , die keinen Längenparameter erwartet.
Wäre das hier bei Konstanten Zeilen zielführend so wie pylon es beschreibt ?

Gibt wohl eine überladene Methode von write() , die keinen Längenparameter erwartet.
Wäre das hier bei Konstanten Zeilen zielführend so wie pylon es beschreibt ?

Wenn man deren Definition anschaut:

    size_t write(const char *str) {
      if (str == NULL) return 0;
      return write((const uint8_t *)str, strlen(str));
    }

Ja, die bringt geschwindigkeitsmässig etwas (weil nicht Byte für Byte rausgeschickt wird), aber bezüglich Speicher ist sie mit der print-Methode identisch.

Häng mich nur mal kurz mit meiner Frage dran.
Ein Arduino ist doch als Webserver völlig ungeeignet oder?
wenn da mehr als eine Person drauf zugreift stürzt das Ding doch ab oder?