Arduino ethernet problema con sd

Riguardo alla memoria quando compilo lo sketch ho 26kb su 32 disponibili

Non parliamo della stessa memoria.

Arduino Uno:
Flash Memory 32 KB (ATmega328) 0.5 KB usato dal bootloader .... il resto viene usato per il tuo programma
SRAM 2 KB (ATmega328) .... spazio dedicato alle variabili int, byte, float, long .......
EEPROM 1 KB (ATmega328) ... memoria non volatile dove è l'utente che decide dove, quando e perchè scrivere

Anche io presento lo stesso problema, nel momento in cui cerco di scrivere su sd si pianta tutto, se commento il metodo che lancia la scrittura tutto funziona senza problemi.
Onestamente mi vien da pensare che il problema derivi in qualche modo dalle 2 librerie
allego il codice:

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] =  { 192,168,200,177 };

const int MAX_PAGENAME_LEN = 8; // max characters in page name 
char buffer[MAX_PAGENAME_LEN+1]; // additional character for terminating null

EthernetServer server(80);

const int chipSelect = 4;
File dataFile;

void setup()
{
  
  Serial.begin(9600);
  
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  
  Serial.print("\nInitializing SD card...");
 
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
  digitalWrite(chipSelect,HIGH);
  
  Ethernet.begin(mac, ip);
  server.begin();
  digitalWrite(10,HIGH);
  delay(2000);
}

void loop()
{
  EthernetClient client = server.available();
  if (client) 
  {
    int type = 0;
    while (client.connected()) 
     {
        if (client.available()) 
        {
        // GET, POST, or HEAD
         memset(buffer,0, sizeof(buffer)); // clear the buffer | scrive l'array con 0
         if(client.readBytesUntil('/',buffer,sizeof(buffer)))
         { 
          if(strcmp(buffer,"POST ") == 0)  //cerca la scritta post http://ruturajv.wordpress.com/2005/12/25/http-post-request/
          {
            client.find("\n\r"); // skip to the body
            // find string starting with "pin", stop on first blank line
            // the POST parameters expected in the form pinDx=Y
            // where x is the pin number and Y is 0 for LOW and 1 for HIGH
            while(client.findUntil("pinD", "\n\r")){
              int pin = client.parseInt();       // the pin number
              int val = client.parseInt();       // 0 or 1
              pinMode(pin, OUTPUT);
              digitalWrite(pin, val);
              digitalWrite(10,HIGH);
              scriviLog(pin,val);
              digitalWrite(10,LOW);
            }
          }
          sendHeader(client,"Domotica");
          //create HTML button to control pin 8
          client.println("<h2>Controllo Pin Digitali</h2>");
          client.println("<table border='1' >");
          for(int i=2;i<=3;i++)
           {
            client.print("<tr><td>digital pin ");
            client.print(i);
            client.print(" </td><td>");
            client.print("<form action='/' method='POST'><p><input type='hidden' name='pinD");
            client.print(i);
            client.print("'");
            client.println(" value='0'><input type='submit' value='Off'/></form>");
            client.print(" </td><td>");
            client.print("<form action='/' method='POST'><p><input type='hidden' name='pinD");
            client.print(i);
            client.print("'");
            client.print(" value='1'><input type='submit' value='On'/></form>");
            client.print(" </td><td>stato: ");
            if(digitalRead(i)==1)
               client.print("ON");
             else
               client.print("OFF");
            client.println("</td></tr>");
            }
          
          for(int i=5;i<10;i++)
           {
            client.print("<tr><td>digital pin ");
            client.print(i);
            client.print(" </td><td>");
            client.print("<form action='/' method='POST'><p><input type='hidden' name='pinD");
            client.print(i);
            client.print("'");
            client.println(" value='0'><input type='submit' value='Off'/></form>");
            client.print(" </td><td>");
            client.print("<form action='/' method='POST'><p><input type='hidden' name='pinD");
            client.print(i);
            client.print("'");
            client.print(" value='1'><input type='submit' value='On'/></form>");
            client.print(" </td><td>stato: ");
            if(digitalRead(i)==1)
               client.print("ON");
             else
               client.print("OFF");
            client.println("</td></tr>");
            }
          
          
          client.println("</table>");
          client.println("</body></html>");
          client.stop();
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    client.stop();
  }
}

void sendHeader(EthernetClient client, char *title)
{
  // send a standard http response header
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println();
  client.print("<html><head><title>");
  client.print(title);
  client.println("</title><body>");
}   


void scriviLog(int pin , int valore)
{
  
  digitalWrite(4,LOW);
  Serial.println("qua ci arrivo");
  dataFile = SD.open("LOG.txt", FILE_WRITE);
  Serial.println("anche qui");
  String dataString = "";
  // if the file is available, write to it:
  dataString="Scrittura del pin n° ";
  dataString+=pin;
  dataString+="al valore:";
  dataString+=valore;
  Serial.println("str creata");
    if (dataFile) 
    {
     Serial.println("inizio scrittura");
     dataFile.println(dataString);
     Serial.println("ho scritto");
     dataFile.close();
     Serial.print("Scrittura avvenuta con successo");
    }
    else 
    {
     Serial.println("error opening datalog.txt");
    }
   digitalWrite(4,HIGH);
   
}

perchè metti il pin 4 a low?
Non sei tu che devi gestire i pin 4 e 10 dello shield

come non è corretto
digitalWrite(10,HIGH);
scriviLog(pin,val);
digitalWrite(10,LOW);

guarda lo fa già libreria w5100.cpp

uint8_t W5100Class::write(uint16_t _addr, uint8_t _data)
{
  setSS();  
  SPI.transfer(0xF0);
  SPI.transfer(_addr >> 8);
  SPI.transfer(_addr & 0xFF);
  SPI.transfer(_data);
  resetSS();
  return 1;

uint8_t W5100Class::read(uint16_t _addr)
{
  setSS();  
  SPI.transfer(0x0F);
  SPI.transfer(_addr >> 8);
  SPI.transfer(_addr & 0xFF);
  uint8_t _data = SPI.transfer(0);
  resetSS();
  return _data;
}
}

dove setSS(); e resetSS(); è

private:
  inline static void initSS()    { DDRB  |=  _BV(4); };  //pin 10
  inline static void setSS()     { PORTB &= ~_BV(4); }; //pin 10
  inline static void resetSS()   { PORTB |=  _BV(4); }; //pin 10

Si lo so e hai ragione, ho copiato l'ultima versione del codice in cui avevo provato a mettere sia il pin 4 che il 10 a H/L per vedere se cambiava qualcosa, ma il risultato è sempre quello...la prima volta il led si accende ma poi il tutto rimane bloccato dentro la funzione scriviLog...

dovresti salvare il messaggio in una variabile e scrivere dopo il client.stop, attenzione se è troppo lunga la stringa puoi incorrere nuovamente a un crash

tra l'altro nel tuo sketch ce ne sono 2 di client.stop ......??

intanto ti ringrazio tantissimo per i preziosi consigli che mi stai dando :wink:
il client.stop doppio è proprio un errore, me lo sono portato dietro da quando ho diviso la creazione della tabella in 2 cicli e non in uno solo...insomma è un copia e incolla mal riuscito...tra un attimo sistemo il tutto e poi ti faccio sapere.
Grazie ancora

Confermo che tutto funziona perfettamente ora, ho rimosso il doppio client.stop() ed effetuato la scrittura a client chiuso.
Ti ringrazio ancora!
lascio qui il codice corretto per i posteri :slight_smile:

/*
 * WebServerPost sketch
 * Turns pin 8 on and off using HTML form
 */

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] =  { 192,168,200,177 };

const int MAX_PAGENAME_LEN = 8; // max characters in page name 
char buffer[MAX_PAGENAME_LEN+1]; // additional character for terminating null

EthernetServer server(80);

Sd2Card card;
SdVolume volume;
SdFile root;
String dataString;

const int chipSelect = 4;
File dataFile;

boolean scrivi=false;
int strPin,strValue;

void setup()
{
  
  Serial.begin(9600);
  
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  
  Serial.print("\nInitializing SD card...");

  
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");

  Ethernet.begin(mac, ip);
  server.begin();
  
  delay(2000);
}

void loop()
{
  EthernetClient client = server.available();
  if (client) 
  {
    int type = 0;
    while (client.connected()) 
     {
        if (client.available()) 
        {
        // GET, POST, or HEAD
         memset(buffer,0, sizeof(buffer)); // clear the buffer | scrive l'array con 0
         if(client.readBytesUntil('/',buffer,sizeof(buffer)))
         { 
          if(strcmp(buffer,"POST ") == 0)  //cerca la scritta post http://ruturajv.wordpress.com/2005/12/25/http-post-request/
          {
            client.find("\n\r"); // skip to the body
            // find string starting with "pin", stop on first blank line
            // the POST parameters expected in the form pinDx=Y
            // where x is the pin number and Y is 0 for LOW and 1 for HIGH
            while(client.findUntil("pinD", "\n\r")){
              int pin = client.parseInt();       // the pin number
              int val = client.parseInt();       // 0 or 1
              pinMode(pin, OUTPUT);
              digitalWrite(pin, val);
              strPin=pin;
              strValue=val;
              scrivi=true; 
            }
          }
          sendHeader(client,"Domotica");
          //create HTML button to control pin 8
          client.println("<h2>Controllo Pin Digitali</h2>");
          client.println("<table border='1' >");
          for(int i=2;i<=3;i++)
           {
            client.print("<tr><td>digital pin ");
            client.print(i);
            client.print(" </td><td>");
            client.print("<form action='/' method='POST'><p><input type='hidden' name='pinD");
            client.print(i);
            client.print("'");
            client.println(" value='0'><input type='submit' value='Off'/></form>");
            client.print(" </td><td>");
            client.print("<form action='/' method='POST'><p><input type='hidden' name='pinD");
            client.print(i);
            client.print("'");
            client.print(" value='1'><input type='submit' value='On'/></form>");
            client.print(" </td><td>stato: ");
            if(digitalRead(i)==1)
               client.print("ON");
             else
               client.print("OFF");
            client.println("</td></tr>");
            }
          
          for(int i=5;i<10;i++)
           {
            client.print("<tr><td>digital pin ");
            client.print(i);
            client.print(" </td><td>");
            client.print("<form action='/' method='POST'><p><input type='hidden' name='pinD");
            client.print(i);
            client.print("'");
            client.println(" value='0'><input type='submit' value='Off'/></form>");
            client.print(" </td><td>");
            client.print("<form action='/' method='POST'><p><input type='hidden' name='pinD");
            client.print(i);
            client.print("'");
            client.print(" value='1'><input type='submit' value='On'/></form>");
            client.print(" </td><td>stato: ");
            if(digitalRead(i)==1)
               client.print("ON");
             else
               client.print("OFF");
            client.println("</td></tr>");
            }
          
          
          client.println("</table>");
          client.println("</body></html>");
          client.stop();   
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    if(scrivi)
      {
      scriviLog();
      scrivi=false;
      }
  }
}

void sendHeader(EthernetClient client, char *title)
{
  // send a standard http response header
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println();
  client.print("<html><head><title>");
  client.print(title);
  client.println("</title><body>");
}   


void scriviLog()
{
  dataFile = SD.open("LOG2.txt", FILE_WRITE);
  dataString="";
  dataString = "è stato modificato lo stato del pin n° ";
  dataString+=strPin;
  dataString+=" ora vale: ";
  dataString+=strValue;
  // if the file is available, write to it:
  if (dataFile) 
    {
     dataFile.println(dataString);
     dataFile.close();
    }
    else 
    {
     Serial.println("error opening datalog.txt");
    }
}