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:
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.
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 :~
Also W5100 ist der Chip auf den Wiznet Ethernet Shileds. Hast du denn so eins?
Ja genau, so eins hab ich
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
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
Was sein kann ist, dass du deinen RAM voll geschrieben hast (Der ist nämlich nur 2 KB groß bei deinem Arduino ). 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
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.
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.
Puuh 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);
}
}
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
Ich schau mir das morgen ma genaurer an, danke dir !
PS: Habe auch noch was nützliches gefunden, dass mir lesenswert erscheint
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.
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.
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)
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.