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);
}