Ethernet w5100

salve a tutti, sto utilizzando da qualche settimana il modulo Ethernet insieme all’arduino uno, ha sempre funzionato senza alcun problema. Da qualche giorno quando vado a caricare il codice sulla sceda mi esce la seguente scritta:

Low memory available, stability problems may occur.

non capisco la memori non e’ piena infatti uso circa la meta della memoria disponibile…

Sketch uses 15156 bytes (46%) of program storage space. Maximum is 32256 bytes.
Global variables use 1780 bytes (86%) of dynamic memory, leaving 268 bytes for local variables. Maximum is 2048 bytes.

Non capisco dove e’ il problema…

Questo e il codice che vado a caricare:

#include <SPI.h>

#include <Ethernet.h>

void HTML (void);

int led = 13;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   //physical mac address

byte ip[] = { 192, 168, 1, 155 };                      // ip in lan (that's what you need to use in your browser. ("192.168.1.178")

byte gateway[] = { 192, 168, 1, 1 };                   // internet access via router

byte subnet[] = { 255, 255, 255, 0 };                  //subnet mask

EthernetServer server(80); //server port
EthernetClient client;

String readString;

int a = 0;
int b = 0;
void PulsanteON (void);
void PulsanteOFF (void);
void Pagina2 (void);

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.println(Ethernet.localIP());
}
void loop() {
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {   
      if (client.available()) {
        char c = client.read();
        //read char by char HTTP request
        if (readString.length() < 100) {
          //store characters to string
          readString += c;
          //Serial.print(c);
         }
         //if HTTP request has ended
         if (c == '\n') { 
           Serial.println(readString);         
            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>Cascina Mozzini</TITLE>");
            client.println("<center>");
            client.println("<H1>Cascina Mozzini</H1>");
            client.println("<a href=\"/?Pagina2\"\"><button style='font-size:4vw;width: 20%;height: 10%;background-color:blue; color:bark; position:fixed; top:0%; left:0%;'>Pag.2</button></a>");
            client.println("<hr />");
            client.println("</HEAD>");
            Pagina2();
            switch(b)
            {
            case 0:
            client.println("<BODY>");
            client.println("<img src=\"https://static.vecteezy.com/system/resources/previews/000/140/802/non_2x/mountain-chalet-house-vector.jpg\") style=\"width: 40%;height: 30%; position:fixed; top:15%; left:10%;\" />");          
            PulsanteON();
            PulsanteOFF();
            switch (a)
	    {
            case 0:
            client.println("<img src=\"https://image.flaticon.com/icons/png/512/18/18310.png\") style=\"width: 20%; position:fixed; top:20%; left:60%;\" />");
            break;
            case 1:
            client.println("<img src=\"https://pngimage.net/wp-content/uploads/2018/06/lampadina-stilizzata-png-1.png\") style=\"width: 20%; position:fixed; top:20%; left:60%;\" />");
            break;
            }
            client.println("<a href=\"/?button1on\"\"><button style='font-size:10vw;width: 30%;height: 20%;background-color:blue; color:bark; position:fixed; bottom:5%; left:5%;'>ON</button></a>");
            client.println("<a href=\"/?button1off\"\"><button style='font-size:10vw;width: 30%;height: 20%;background-color:blue; color:bark; position:fixed; bottom:5%; right:5%;'>OFF</button></a>");
            delay(1);
            client.println("</BODY>");
            client.println("</HTML>");
            readString="";
            delay(1);
            break;
            case 1:
            client.println("<a href=\"/?Pagina1\"\"><button style='font-size:4vw;width: 20%;height: 10%;background-color:blue; color:bark; position:fixed; top:0%; left:0%;'>Pag.1</button></a>");
            break;
            }
            client.stop();
         }
       }
    }
}
}
void PulsanteON()
{              if (readString.indexOf("?button1on") >0){
               a = 1;
               digitalWrite(led, HIGH);
               }
}
void PulsanteOFF()
{
               if (readString.indexOf("?button1off") >0){
               a = 0;
               digitalWrite(led, LOW);
               }
}
void Pagina2 ()
{
               if (readString.indexOf("?Pagina2") >0){
               b = 1;
               }
               if(readString.indexOf("?Pagina1") >0){
               b = 0;
               } 
}

Forse non e corretto al 100% ma dovrebbe almeno caricarmelo…

Qualcuno sa come mai ho questo problema?
In attesa di una risposta auguro a tutti una buona giornata :slight_smile:

Caricare sicuramete te lo carica, ti avvisa solo che ti stai pericolosamente avvicinando al massimo della SRAM (86%).

Se già stai al 86% con solo le variabili statiche, immagina cosa può succedere appena comincia ad allocare memoria dinamica (stack, variabili delle funzioni, ecc. ecc.).

Purtroppo il ATmega328P NON è nato per fare queste cose e volerlo usare con schede di rete e semplicemente una "forzatura" ... ci si può "giocare", ma non molto di più.

Se vuoi fare cose un po' più complesse devi passare a schede di categoria sueriore (es. le nuove MKR) o ad altre schede ancora superiori.

Guglielmo

Se utilizzo un'arduino mega posso arginare il problema? se no posso mettere le variabili su una scheda di memoria e leggerle da li... non so se sia possibile.

Un'altra possibilità e quella di utilizzare un'arduino Uno per la lettura dei dati e un raspberry per la parte della pagina Web...

Cosa mi consigliate?

Sul raspberry posso usare Python che mi sembra abbastanza buono per gestire la pagina web

Arduino MEGA, purn non cambiando nulla in termini di performance, ti da 4KB di SRAM, quindi il doppio di un Arduino UNO ... ::slight_smile:

Intanto potresti cominciare ad usare la macro F() per tutte le strigne COSTANTI che usi nelle varie print()/prinln(); in pratica prendi la stringa e la racchiudi così: F("tua_stringa") e metti questo come contenuto della varie print/println spostando in questo modo tutte le stringhe costanti dalla SRAM alla Flash.

Detto questo ... onestamente, se dovessi fare un piccolo server web, io andrei direttamente su Raspi ... :wink:

Guglielmo

Io sono abbastanza agli inizi con la programmazione, potrebbe farmi un'esempio con le macro F nel mio codice?

Sto provando a spostarmi su Python solo che dopo devo utilizzare molti più programmi, mi spiego meglio, devo far comunicare Arduino con il Raspberry, scaricare apache e fare la pagina web e poi non so ancora come far partire uno script Python con HTML...

Volevo iniziare a fare un sistema funzionante utilizzando solo Arduino, anche se limitato e poi quando ho piu tempo mi studio come fare con il raspberry per creare una versione definitiva.

Se mi fa un esempio con le macro( che non ho mai utilizzato) posso liberare un po di spazio.

Grazie mille per la sua disponibilità :slight_smile:

mozzini97:
Io sono abbastanza agli inizi con la programmazione, potrebbe farmi un'esempio con le macro F nel mio codice?

... te l'ho detto ... devi semplicmente aggiungere F( "...." ) dove hai le stringhe fisse nei print/println.

es.: client.println( F( "HTTP/1.1 200 OK" ) ); //send new page

Guglielmo

Ahh Facilissimo,grazie mille per la dritta, ho risolto il problema.
Sono passato da 84% al 24% un netto miglioramento :slight_smile:

mozzini97:
.... Sono passato da 84% al 24% un netto miglioramento :slight_smile:

Urka ... ne avevi di stringhe costanti ... ;D ;D ;D

Guglielmo