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