[Ethernet-Shield] Probleme beim Implementieren eines iFrames - Ideen?

Hallo Leute!

Ich bin noch recht unerfahren auf dem Gebiet und bräuchte mal einen Rat.

Ich habe einen Webserver programmiert mit dem Ethernet-Shield, der funktioniert auch.

Zudem habe ich ein weiteres Projekt gemacht, in dem ich die Internetzeit abrufe und in ein lesbares Format bringe; funktioniert ebenso. :slight_smile:

Nun wollte ich hingehn, und diese beiden Projekte vereinen - funktioniert ebenfalls - ABER......

....nur wenn ich folgenden Code vom Webserver auskommentiere.
In diesem Code implementiere ich lediglich einen iFrame für ein Webcam-Video :roll_eyes:

        //  client.print("<iframe width='380' height='202' src='http://www.ustream.tv/embed/13190705?v=3&amp;wmode=direct' "); 
        //  client.print("scrolling='no' frameborder='0' style='border: 0px none transparent;'>");
        //  client.println("</iframe>
");

Bleibt der Code drin, hängt sich Arduino beim "void Setup" auf, und zwar an der Stelle, an der die Internetverbindung (w5100 ?) aufbauen will, also hier:

Serial.print(F("Starting w5100..."));
  if(!Ethernet.begin(mac))
  {
    Serial.println(F("failed"));
    while(1);    
  }
  else {
   Serial.println(F("ok"));
   Serial.print(F("ip = "));
   Serial.println(Ethernet.localIP());
  }

Bei Starting w5100... ist Schluss in der Serial-Konsole.

Das kuriose für mich ist, dass das funzt, wenn der Webserver allein läuft, alles geht (ohne die Funktion, die Zeit aus dem Internet abzurufen) mit genau diesen (nun auskommentierten) Zeilen.

Hat da jemand eine Idee??

Danke, Gruß
Chris

Okay, mittlerweile bin ich der Ansicht, dass ich vielleicht zuviel Ausgaben mit "println" habe.

Gibts da irgend ein Limit in irgendeiner Richtung?

Timeout, Buffer, irgendsowas? :~

Gruß
Chris

Also W5100 ist der Chip auf den Wiznet Ethernet Shileds. Hast du denn so eins?

Wo befindet sich der auskommentierte Code denn genau? Vielleicht wird er schon initialisiert bevor dein Ethernet Port initialisiert wird und somit hängt er sich auf.

Was ich auch recht verwunderlich finde, ist dass die den iframe befehl Splittest und warum du Ihn nicht einfach komplett einfügst bis '>' kommt.

Sind rein hypothetische Vermutungen ^^Aber manchmal sind es die einfachsten dinge :~

Hallo mrlowalowa!

Danke für Deine Antwort.

Also W5100 ist der Chip auf den Wiznet Ethernet Shileds. Hast du denn so eins?

Ja genau, so eins hab ich :slight_smile:
Würde auch dazu passen, dass es eigentlich ja funktioniert jeweils im Einzelnen.

Was ich auch recht verwunderlich finde, ist dass die den iframe befehl Splittest.....

Das war schon ein Verzweifelter Versuch, den Fehler zu finden :stuck_out_tongue:
Habe darauf getippt, dass ich vielleicht zuviel auf einmal mit println übertrage....

Wo befindet sich der auskommentierte Code denn genau? Vielleicht wird er schon initialisiert bevor dein Ethernet Port initialisiert wird und somit hängt er sich auf.

Der auskommentierte Code befindet sich mitten in der Übertragung des HTML-Codes im .
Danach und davor befinden sich weitere client.println("blabla");, die auch korrekt verarbeitet werden, wenn die 3 genannten wegfallen.


Was mir nun aufgefallen ist, was definitiv so sein muss:

Wenn ich einen großen Teil der html-seite weglassen (wieder mal client.println("irgendwas");) und diesen ersetze durch den o.g. Code geht es.
Es ist definitiv irgendwas zuviel, entweder Zeichen insgesamt, oder übertragene Befehle für die Sitzung... irgendwas läuft über.

Der Gesamte Code des Projektes vermutlich auch nicht, da ja noch Platz ist auf der Arduino? (richtig?)

Ich habe eine UNO mit einer binären Sketchgöße von

19.584 Bytes (von einem Maximum von 32.256 Bytes)

LG
Chris

UPDATE:

Also zuviele "println();"-Befehle sind es auch nicht, habe alles zusammengefasst, was möglich ist.

Also bleibt nur noch die Zeit für die Übertragung oder zuviele Zeichen, die ich senden will.

Keiner eine Idee, was man machen kann?

Grüße

Was sein kann ist, dass du deinen RAM voll geschrieben hast (Der ist nämlich nur 2 KB groß bei deinem Arduino :wink: ). Der Arduino muss ja deine ganze html Seite auf einmal ausgeben. (Also nehme ich mal an)

Du könntest jetzt einmal versuchen deine eine HTML Seite in Unterseiten aufzusplitten und dann schauen was nun passiert :wink:

So wird dein Arduino etwas entlastet.

Ein weiterer Punkt wäre, deine Internetseite auf einer SD Karte zu sichern und dann von dort aus zu öffnen. In deinem Ethernet Shield ist ja auch ein SD Karten Slot mit eingebaut.

Der Arduino Selbst lädt ja nicht den code aus dem iFrame, oder? Das macht das Empfänger gerät dann vom zugehörigen Server.
Den Punkt würd ich aber eher ausschließen, da du ja sagst, dass es klappt wenn du andere Code Passagen auslässt.

Grüße
Flo

Okay, genau das wirds sein!

Wie kann ich denn die html in mehrere Unterseiten aufteilen?
Meinst du generell die Seite mit Links unterteilen, und dann wenn der User auf den Link klickt, das auf der Arduino abfragen und entsprechend darauf dann reagieren?

Wenn ich die Daten von der SD-Karte lade und ausgebe, wird der gesamte Code nicht in den Ram geladen?

Bzw. was BEFINDET sich da zurzeit überhaupt, der gesamte Sketch? gg

Nein, der iFrame wird nur als Link ausgegeben, den der Browser dann selbst von nem andren Server läd.

LG
Chris

Puuh :smiley: Ehm ich fang damit auch gerade erst an, aber mit html kenn ich mich schon etwas aus.

Du könntest einfach einen Button per

oder im html einfügen und via $POST dann einen Wert übermitteln.

den Post Script kannst du dann in einer if-Schleife abfragen und dann den Content XY mit in die if-Schleife hängen.

Bzw dann eine Variable hochschalten die dann in einer weiteren if schleife deinen Content erst "freigibt"

das leichteste wäre jetzt im html wenn du jetzt unterschiedliche Seiten aufrufst.

Eine weitere Idee wäre es deinen gesamten jetzigen Client.print in eine if schleife zu setzen:

void setup(){
int i = 0;
}

void loop(){
if (i == 0){
  client.println("<body>");
  client.print(blabla); //deine "Hauptseite
  client.print(<form>); //der button mit Post Script

}
if ( i ==1){
  client.print("unterseite);

}
}

hier hab ich auch nen link dazu SELFHTML-Wiki.

Gruß
Flo

Ja gut, danke dir :grin:

Also mein Problem is, wie es scheint, dass ich den RAM grundsätzlich schon vollgeklatscht hab.

Da ich aber noch eigentlich LANGE nicht fertig bin, mit meinem Projekt, muss ich wohl so oder so anders rangehen.

Ich möchte beispielsweise noch die SD-Karte mit reinnehmen, da ich loggen will, also kann ich auch das html-zeugs auf SD auslagern.
Dann habe ich aber noch keine einzige Komponente angeschlossen, die ich abfragen will und überhaupt fehlen noch Libraries.

Mhhhh, ich muss wohl komplett umdenken oder es geht sowieso so nicht, wie ich vorhab :cold_sweat:

Ich schau mir das morgen ma genaurer an, danke dir !

PS: Habe auch noch was nützliches gefunden, dass mir lesenswert erscheint :smiley:

Danke für die Unterstützung, mrlowalowa!

Ich sag mal, was Sache war morgen :slight_smile:

Gruß, und gute Nacht!

sorath:
Also mein Problem is, wie es scheint, dass ich den RAM grundsätzlich schon vollgeklatscht hab.

Da ich aber noch eigentlich LANGE nicht fertig bin, mit meinem Projekt, muss ich wohl so oder so anders rangehen.

RAM-Speicher auf Mikrocontrollern ist absolute Mangelware, denn Du programmierst keinen PC mit Gigabytes an RAM-Speicher plus zusätzlich gigabytegroßer Auslagerungsdatei auf Festplatte! Je umfangreichere Dinge Du vorhast, desto wertvoller ist auf einem Mikrocontroller JEDE EINZELNE Speicherstelle!

D.h. Du mußt einerseits extrem speichersparend programmieren. Wenn das nicht ausreicht, mußt Du einen anderen Mikrocontroller mit mehr RAM verwenden. Wenn das nicht reicht, mußt Du mehrere Mikrocontroller verwenden, die untereinander zusammenspielen. Wenn das nicht reicht, mußt Du einen Mikrocontroller und einen Computer mit ordentlich RAM-Speicher verwenden und diese zusammenspielen lassen.

Bei der Ausgabe von feststehenden Texten per "print" und "println" könntest Du mit Speichersparen schon mal anfangen, indem Du die Texte nicht aus dem RAM-Speicher ausgibst, sondern direkt aus dem Programm-Flashspeicher. Dazu dient ab Arduino 1.0 die F-Schreibweise beim print-Befehl, um die Strings direkt aus dem Flash-Programmspeicher zu holen statt sie im RAM zu speichern.

Statt:
client.println("
");
Setze:
client.println(F("
"));

Und diese Umstellung auf das F-Makro erstmal überall dort vornehmen, wo feststehende Texte mit print oder printeln ausgegeben werden sollen.

Bei Serial.println im setup hast Du die F-Schreibweise offenbar schon drin, bei den ganzen client.print bzw. client.println Aufrufen jedoch wohl nicht.

Vielen Dank!

Das hilft mir schon mal sehr viel weiter!

Das mit dem F kommt daher, dass es aus einem Beispiel-Sketch war. Ich hab mir das auch schon angesehen, was das bedeutet, aber nicht so richtig verstanden 8)

Danke dir!

Gruß
Chris

was das bedeutet, aber nicht so richtig verstanden

Mach dir keine Sorgen. Das sind eine Reihe von Tricks, die helfen sollen, nicht zuviele Extra-Buchstaben tippen zu müssen.

Den Unterschied zwischen PROGMEM und RAM hast du bestimmt schon geschnallt.
print kann beides ausgeben, muss aber natürlich gesagt kriegen, wo der Text nun herkommt. Da ist die Definition des Marcos F() die kürzest mögliche Schreibweise.

Ja, besten Dank :slight_smile: