WiFi Shield - Browser sporadisch Seiten-Ladefehler

Hallo,

habe mich mit den 3 Beispielcodes rangetastet und zum Schluss diesen hier http://arduino.cc/en/Tutorial/WiFiWebServer , im Browser die IP Adresse vom WiFi Shield eingetippt, der Poti-Analogwert wird angezeigt, auch Änderungen davon. Aber immer nach paar Sekunden oder auch Minuten, ist die Seite leer und Firefox meckert mit "Seiten-Ladefehler".

Im Terminal wird neben anderen Sachen diese Ausgabe angegeben, solange es läuft:
client disconnected
new client

Wenn der Browser einen Seitenladefehler meldet bleibt auch das Terminalfenster stehen mit
client disconnected
new client
client disconnected

Woran liegt das? Muß ich irgendeinen Refresh ändern? Macht Firefox Mist? Danke.
Auf dem WiFi Shield leuchtet immer die grüne LED "Link".

Edit:
Wenn ich das richtig mitbekomme, fordert der Browser mit seinem Refresh die Daten vom WiFi-Shield an. Und wenn der Browser nicht mehr will, bleibt auch das WiFi Shield quasi "stehen". Leider kann ich mit der Info auch nichts weiter anfangen.

Doc_Arduino:
Woran liegt das?

Läuft es weiter, wenn Du im Web-Browser nur einen Refresh machst?

Oder muss zuerst der Arduino Resettet werden, damit es wieder kurzfristig funktioniert?

Wenn ein Refresh im Browser ausreicht, ohne Reset des Arduino, damit der Arduino wieder HTML-Seiten ausliefert, ist vermutlich nur das delay(1) am Ende viel zu knapp gewählt. Nimm an der Stelle mal delay(500) oder delay(1000);

Hallo,

der Arduino läuft weiter, wenn ich im Browser Refresh drücke erscheinen wieder alle Ausgaben wie vorher.

Nur welches delay meinst Du?

Das hier in der Loop Schleife von 5sec?

 // add a meta refresh tag, so the browser pulls again every 5 seconds:
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");

Ich sehe sonst kein anderes delay. Oder irgendwas im Browser ändern?

Doc_Arduino:
Ich sehe sonst kein anderes delay. Oder irgendwas im Browser ändern?

Schau genauer hin: In dem Code auf der von Dir verlinkten Seite sehe ich das:

// give the web browser time to receive the data
delay(1);

Und genau da dann eben mal delay(500) oder delay(1000) einsetzen!

Hallo,

Danke. Habe es erstmal auf 500 gesetzt und lasse es laufen.

Eine weitere Frage gibts dann noch. Verstehe ich das richtig? Nicht der Arduino schickt die Daten zum Browser wenn er Zeit hat, sondern der Browser fordert die Daten vom Arduino an? Weil wenn ich den Browser schließe oder nicht öffne, dann sehe ich im Terminal auch keine sonstigen Aktivitäten. Wie wenn der Arduino wartet.

Wenn ja, würde mich das zur nächsten Frage bringen. Wenn mein Programm wächst, hat ja der Arduino mehr zu tun und wenn zum Bsp. solche Zeit kritischen Sachen wie die DCF77 Uhr hinzukommt, kann der Arduino ja nicht plötzlich den Browser bedienen.
Ich habe von HTLM / Browser / Refresh abolut keine Ahnung.

Doc_Arduino:
Eine weitere Frage gibts dann noch. Verstehe ich das richtig? Nicht der Arduino schickt die Daten zum Browser wenn er Zeit hat, sondern der Browser fordert die Daten vom Arduino an?

Ja, natürlich.

Genau so hast Du es doch im Code drinstehen:

// add a meta refresh tag, so the browser pulls again every 5 seconds:
client.println("<meta http-equiv="refresh" content="5">");

Selbst wenn Du nicht wüßtest, was ein Meta-Refresh ist, wird es Dir doch im Kommentar erklärt: "the browser pulls again every 5 seconds"

In seiner vollständigen Form kann der Meta-Refresh den Browser nach x Sekunden auf eine andere URL-Adresse umleiten. Oder aber eben wie bei Deinem Code immer dieselbe Adresse nach x Sekunden neu laden:
http://de.selfhtml.org/html/kopfdaten/meta.htm#weiterleitung

Doc_Arduino:
wenn zum Bsp. solche Zeit kritischen Sachen wie die DCF77 Uhr hinzukommt

Was möchtest Du auf einem Server mit bestehender Internetverbindung mit einer DCF77-Uhr?

Bei bestehender Internetverbindung holt man sich eine aktuelle Zeit natürlich von einem Zeitserver im Internet per NTP (Network Time Protocol) ab.

Hallo,

okay, dass mit der DCF77 war vielleicht ein blödes Bsp. Aber so doof nun auch wieder nicht.
Was ich sagen wollte. In meinen Augen läuft die Anfrage falsch herum. Der Browser kann doch niemals wissen ob der µC aller 5sec. wirklich Zeit hat, das er die gewünschten Daten abrufen kann.
Der µC müßte doch an den Browser die Daten senden wenn er selbst Zeit hat bzw. wenn es im Programm dafür vorgesehen ist. Der µC hat oder soll doch noch anderes zu tun haben wie den Browser mit Daten füttern.

Doc_Arduino:
Der µC müßte doch an den Browser die Daten senden wenn er selbst Zeit hat bzw. wenn es im Programm dafür vorgesehen ist. Der µC hat oder soll doch noch anderes zu tun haben wie den Browser mit Daten füttern.

Die meisten Internetdienste funktionieren mit einer Client-Server-Architektur, so auch HTTP.

Es gibt HTTP-Server ("Webserver"), die auf Anfragen warten und diese beantworten.

Und es gibt HTTP-Clients (z.B. aber nicht nur "Webbrowser"), die Anfragen absenden und auf Antwort warten.

Client-Server-Architekturen werden immer vom Client getrieben, d.h. auf der Client-Seite wird festgelegt, wann und wie oft eine Anfrage an einen Server gerichtet wird. Der Server wartet nur auf Anfragen und arbeitet die Anfragen so gut es geht ab.

Wenn Du es anders herum haben möchtest, dass der Arduino der Client ist und sich aussucht, wann er Daten versendet, dann mußt Du den Arduino als HTTP-Client programmieren. Und senden könnte er die Daten an einen Webserver, der diese Daten dann beispielsweise per PHP-Skript weiter verarbeitet, z.B. in einer Datenbank speichert und auch für andere Clients wieder zum Abruf zur Verfügung stellt.

Diese Lösung hätte dann auch den Vorteil, dass richtige Webserver sehr viel leistungsfähiger als ein Arduino sind, d.h. ein richtiger Webserver könnte Daten, die er von einem Arduino-Client erhalten hat, ggf. auch grafisch oder statistisch aufbereiten und ausgeben, sogar an gleichzeitig zugreifende Clients, die die Daten per Webbrowser anfordern.

Das sähe dann so aus:

  • ein leistungsfähiger Webserver ("mit PHP") steht beim Provider im Rechenzentrum
  • der Arduino-Client sendet seine Daten an den Webserver (der sie mit einem PHP-Skript verarbeitet)
  • Webbrowser-Clients rufen die Daten vom Webserver ab (der sie mit einem PHP-Skript ausliefert)

Hallo,

Danke für die Erklärung. Das klingt für mich schon logischer als anders herum.
Ich werde darauf irgendwann zurück kommen. :slight_smile:

Doc_Arduino:
Hallo,

Danke für die Erklärung. Das klingt für mich schon logischer als anders herum.
Ich werde darauf irgendwann zurück kommen. :slight_smile:

Funktioniert das Skript denn jetzt mit den 500ms delay?
Wenn ja, könntest Du ggf. natürlich auch niedrigere Werte wie 50, 25 oder 10 ms ausprobieren, damit der Sketch nicht so viel Zeit beim delay vertrödelt.

Hallo,

mit einem delay von 500ms funktioniert es wunderbar.

Also wenn der Arduino nur Daten senden soll wenn er Zeit hat bzw. wenn ich das möchte im Programmablauf, dann muß ich den Arduino als Web-Client laufen lassen und brauche dazu noch einen leistungsfähigen Webserver? Beim Webserver ist es dann egal ob das ein eigener Rechner im privaten Netzwerk ist oder ein großer in einem Rechenzentrum? Hauptsache ich kann darauf zugreifen.

Doc_Arduino:
Also wenn der Arduino nur Daten senden soll wenn er Zeit hat bzw. wenn ich das möchte im Programmablauf, dann muß ich den Arduino als Web-Client laufen lassen und brauche dazu noch einen leistungsfähigen Webserver? Beim Webserver ist es dann egal ob das ein eigener Rechner im privaten Netzwerk ist oder ein großer in einem Rechenzentrum? Hauptsache ich kann darauf zugreifen.

Auch als Server sendet der Arduino nur dann, wenn er Zeit hat.

Web-Clients wie Browser haben dazu eine Timeout-Zeit und warten schon einige Sekunden (z.B. 30s), bis sie von einem Fehler ausgehen und dass vom Server nix mehr kommt.

Du kannst ja mal spaßeshalber einen beschäftigten Arduino simulieren, indem Du ganz ans Ende der loop nochmal 10s delay einfügst:
delay(10000);
bevor die loop wieder neu startet. Dann wirst Du ja sehen, ob der Browser seine Seite immer noch bekommt (mit Verzögerung), oder ob er mit Timeout- oder NoConnection-Error abgewiesen wird.

Wenn Du den Arduino als Web-Client statt als Web-Server programmierst, dann ist es dem natürlich egal, ob er seine Daten an einen Server im Heimnetz oder im Internet sendet.

Hallo,

mit dem "beschäftigten Arduino" funktioniert es auch. Nach einem weiteren Reset des Arduino wollte der Browser scheinbar nicht mehr mitmachen. Immer bei einem manuellen Klick zum Refresh des Browser das er was anzeigt nach 20sec. , ging immer ein Fenster zum Dateidownload auf. Irgend so ein oct...stream. Nach etwas Geduld kamen dann Daten und ab da läuft es wieder von alleine.

Mit den Einstellungen
5sec. meta refresh tag
50ms receive data delay
10sec. loop delay

werden im Browser aller 12sec. neue Daten angezeigt.

Ist sehr lehrreich mit Dir. :slight_smile: