Betreibe einen UNO mit Ethernet Shield als Webserver um mit ein paar Buttons
meine Funksteckdosen anzusteuern.
Funktioniert soweit eigentlich sehr zuverlässig.
Leider kann ich keine weiteren Buttons nicht mehr hinzufügen, da ich sonst
keinen Zugriff auf den Webserver nicht mehr erhalte.
Denke daher, dass vielleicht der RAM vom UNO nicht mehr hergibt?!
Besteht die Möglichkeit den aktuell verwendeten Speicher bzw. die Auslastung des UNO's anzuzeigen
z.b. über Serial Monitor?
EMAChris:
Besteht die Möglichkeit den aktuell verwendeten Speicher bzw. die Auslastung des UNO's anzuzeigen
z.b. über Serial Monitor?
Wie der Zufall so will, habe ich sowas in meinem Code, im Endeffekt hat sic aber hearusgestellt, daß die Ethernet Lib 'nen Schaden hatte. Seit dem ich Arduino 1.0.5 benutze, hab ich keinen Ausstieg mehr gehabt.
Hier nun der Code:
int freeRam () {
// __brkval is the address of the top of the heap if memory has been allocated.
// If __brkval is zero then it means malloc has not used any memory yet, so
// we look at the address of __heap_start.
extern int __heap_start;
extern int *__brkval; // address of the top of heap
int stack_top;
return (int)&stack_top - ((int)__brkval == 0 ? (int)&__heap_start : (int)__brkval);
}
Wenn Du den Wert anzeigen möchtest, machst Du einfach
So, funktioniert jetzt Vielen Dank für den Denkanstoß!
Falls es nochmal wer braucht:
#include <MemoryFree.h>
Serial.println(freeMemory());
Liegt wirklich am Speicher, dass ich keine weiteren Buttons mehr hinzufügen kann
Werd dann wohl auf einen Mega umsteigen müssen, oder gibt es noch eine andere Möglichkeit?
Hätte dran gedacht den Webserver- Inhalt auf mehrere Zyklen aufzuteilen, um mit dem Ram auszukommen…
Hat jemand Erfahrung damit?
Denke daran, dass alle Strings im RAM landen. Das ist anders als man vielleicht denkt. Liegt daran dass AVRs eine Harvard-Architektur haben und Flash und RAM damit getrennte Adress-Räume haben. Normale Funktionen können also nicht ins Flash greifen.
Mit Serial.println(F("String im Flash")); kann man Strings für Serial Ausgaben bequem ins Flash schreiben.
Erstmal vielen Dank für die freundliche Unterstützung!
F-Makros, nehm ich meines Wissens nicht her. Hab ehrlich gesagt auch keine Ahnung was das ist :~
Hier mal ein kleiner Ausschnitt aus meinem Code:
Die Speicherfresser sind anscheinend die Buttos?!
Kanns an der Größe liegen? Sind halt super fürs Smartphone…
3 Kanäle sind kein Problem, ab dem 7. Button startet mir der Webserver nicht mehr durch…
// Netzwerkverbindung herstellen
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
//HTTP Request einledsen
if (readString.length() < 100) {
//Eingelesene Daten auf String zwischenspeichern
readString += c;
if (Diagnose)Serial.print(c);
}
//if HTTP request has ended
if (c == '\n')
{
//String für Schaltwert aufbereiten
String temp_1 = readString.substring(5);
int schaltwert=(temp_1.toInt());
if (Diagnose)Serial.println(readString); //Ausgeben "String" für Diagnose
if (Diagnose)Serial.println(schaltwert); //Ausgeben "Schaltwert" für Diagnose
client.println("HTTP/1.1 200 OK"); //send new page
client.println("Content-Type: text/html");
client.println();
client.println("<HTML>");
client.println("<HEAD>");
client.println("<TITLE>Homeautomation CG</TITLE>");
client.println("</HEAD>");
client.println("<BODY>");
//Website
client.println("<H1>Homeautomation CG</H1>");
client.println("<p>Webserver<p>");
client.println("<H1><H1>");
//Kanal 1
client.println("<hr/>");
client.println("
");
client.println("<H1>Kanal 1 --> Deckenfluter</H1>");
// Buttons
client.println("<H1><H1>");
client.print("<input type=submit value='Deckenfluter Einschalten' style=width:975px;height:150px onClick=location.href='/1;'>");
client.println("<H1><H1>");
client.print("<input type=submit value='Deckenfluter Ausschalten' style=width:975px;height:150px onClick=location.href='/2;'>");
client.println("
");
Du hältst deine Zeichenketten zur generierung einer HTML-Seite im RAM, der ist beim Uno mit 2 kB recht klein. Abhilfe schafft das F-Makro, wie es hier beschrieben ist: http://playground.arduino.cc/Learning/Memory
Vorteil: Dein HTML-Code liegt nun im Flash, der seinerseits ja 16mal so groß ist (32 kB).
Der Vollständigkeit halber: Der Atmega2560 hätte 8kB RAM, beschränkt also nicht so sehr.
Hm... mit dem Mega würds dann wohl gehn...
Wär halt dann mit Kanonen auf Spatzen... smiley
Uhh..so weit würde ich mich nicht aus dem Fenster lehnen
Wenn die "Bastelsucht" ausbricht und dir immer mehr Dinge einfallen die du einbauen willst kommst du auch mit dem Mega
relativ schnell an die Grenzen - trotz F-Macro.
Ich habe festgestellt, wenn die Html Daten im Flash liegen ist der Aufbau der Website spürbar langsamer.
Inwischen habe ich beim Mega eine 64k Ram Extention dran, die dank der Genialität einiger Leute hier als Heap genutzt werden kann.
Dir ist mit dem F-Macro auf dem UNO auf jeden Fall geholfen.
Hol nur die Buttons aus dem Flash, und hab genügend Reserven um noch einige Buttons einzufügen
Bin mal gespannt wies ausschaut, wenn ich noch eine RTC dranhänge um die letzte Schaltzeit zu loggen und anzuzeigen.
Außerdem sind noch ein paar Thermofühler, die ich über 433Mhz anbinden möchte...
Naja, der Mega ist bestellt 8)
Vielen Dank euch allen, hätt mich wohl schon früher im Forum anmelden sollen... Hätt mir einiges an Zeit und Nerven erspart