Arduino UNO mit Ethernet Shield --> Speicherauslastung anzeigen?

Hallo zusammen :slight_smile:

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?

Hallo

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

    Serial.print("Free RAM: ");
    Serial.println(freeRam());

Ist das OK f√ľr Dich?

Guten Rutsch

Hallo,

erstmal vielen Dank f√ľr die schnelle Antwort!

Muss ich f√ľr die Funktion eine Libary importieren?
Da der Compiler meckert wenn ich den Code so in meinen loop einf√ľge?

Ebenfalls einen guten Rutsch :slight_smile:

PS: Benutze Version 1.0.5

So, funktioniert jetzt :slight_smile: 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 :frowning:
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?

Viele Gr√ľ√üe

Ohne deinen Code kann man schlecht sagen, ob noch RAM-Einsparpotential vorhanden ist. Nutzt du denn das F-Makro?

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… :slight_smile:

Werd leider aus der Beschreibung nicht ganz schlau :frowning:
Seh ich das richtig, z.b. einfach

client.print("<input type=submit value=‚ÄėDeckenfluter Einschalten‚Äô style=width:975px;height:150px onClick=location.href=‚Äô/1;‚Äô>");

durch
Serial.println(F("<input type=submit value=‚ÄėDeckenfluter Einschalten‚Äô style=width:975px;height:150px onClick=location.href=‚Äô/1;‚Äô>"));

ersetzen?!

client.print(F("<input type=submit value=‚ÄėDeckenfluter Einschalten‚Äô style=width:975px;height:150px onClick=location.href=‚Äô/1;‚Äô>"));

Nicht Serial! Einfach das F() um den String machen. Dann bleibt der String im Flash wo auch der Programm Code an sich steht.

Ansonsten wird er beim Programm Start vom Flash ins RAM kopiert, damit der Rest der Funktionen darauf zugreifen kann.

hi,

schau hier mal rein:

http://forum.arduino.cc/index.php?topic=156252.msg1170775#msg1170775

damals gab' es das F-makro noch nicht, das hier verwendete P-makro ist das gleiche.
keinerlei platzprobleme auf einem UNO.

gruß stefan.

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 :slight_smile:
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.

So, habs jetzt erfolgreich implementiert :slight_smile:

Hol nur die Buttons aus dem Flash, und hab gen√ľgend Reserven um noch einige Buttons einzuf√ľgen :slight_smile:

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 :smiley:

Achja, nen guten Rutsch! Lasst es krachen :grin:

Naja, der Mega ist bestellt .. Au√üerdem sind noch ein paar Thermof√ľhler, die ich √ľber 433Mhz anbinden m√∂chte...

Also doch die "Bastelsucht" ausgebrochen :stuck_out_tongue:

Bin mal gespannt wies ausschaut, wenn ich noch eine RTC dranhänge

Wenn dein Arduino Verbindung zum Internet hat ? , w√ľrde ich die Time.h mit dem ntp-Server synchronisieren.
Also keine RTC nötig.

Achja, nen guten Rutsch! Lasst es krachen smiley-mr-green

Dito - Des mach mer scho..