Arduino Due_Ethernet_Sd card_not working

hiii all...

I need your help..

I am Using Arduino Due, Ethernet shield R3, IDE version : 1.6.7, SAM Board version :1.6.6

Problem: I am trying a webserver Program.. the web page is copied to the SD card.. i want to access webpage stored in the SD card through Ethernet shield over internet.

When i try to do so, its not working...some times the webpage loads..again it goes off (cannot load the page)..i know that the problem is SPI Pin initialization.. but don't know how to declare them correctly ..so that it works.

My sketch is:

void setup() { // disable Ethernet chip

digitalWrite(10, HIGH); SPI.begin(52); Serial.begin(9600); // for debugging

// initialize SD card Serial.println("Initializing SD card..."); if (!SD.begin(4)) { Serial.println("ERROR - SD card initialization failed!"); return; // init failed }

what changes should i make in order for this setup to work...please help me as i am new to this arduino. Is there any problem with the libraries...but my program runs perfectly...consistently in Arduino UNO.

Regards, Jeevan

I don't use the SPI.begin call. That is called in the other library functions.

Thanks for the quick reply. Even if i don't use SPI.begin() its not working

Mine work with the Due. http://playground.arduino.cc/Code/WebServerST What are the symptoms of your fail? Post your code.

Complete code :

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ 60

// MAC address from Ethernet shield sticker under board
byte mac = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 20); // IP address, may need to change depending on network
IPAddress gateway(10, 0, 0, 1);
IPAddress subnet(255, 255, 255, 0);
EthernetServer server(80); // create a server at port 80
File webFile; // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0; // index into HTTP_req buffer
boolean LED_state[1] = {0}; // stores the states of the LEDs

void setup()
{
// disable Ethernet chip
SPI.begin();

Serial.begin(9600); // for debugging

// initialize SD card
Serial.println(“Initializing SD card…”);
if (!SD.begin(4)) {
Serial.println(“ERROR - SD card initialization failed!”);
return; // init failed
}
Serial.println(“SUCCESS - SD card initialized.”);
// check for index.htm file
if (!SD.exists(“index.htm”)) {
Serial.println(“ERROR - Can’t find index.htm file!”);
return; // can’t find index file
}
Serial.println(“SUCCESS - Found index.htm file.”);
// switches on pins 2, 3 and 5
// pinMode(2, INPUT);
// pinMode(3, INPUT);
//pinMode(5, INPUT);
// LEDs
pinMode(6, OUTPUT);

Ethernet.begin(mac, ip); // initialize Ethernet device
server.begin(); // start to listen for clients
}

void loop()
{
EthernetClient client = server.available(); // try to get client

if (client) { // got client?
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) { // client data available to read
char c = client.read(); // read 1 byte (character) from client
// limit the size of the stored received HTTP request
// buffer first part of HTTP request in HTTP_req array (string)
// leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
if (req_index < (REQ_BUF_SZ - 1)) {
HTTP_req[req_index] = c; // save HTTP request character
req_index++;
}
// last line of client request is blank and ends with \n
// respond to client only after last line received
if (c == ‘\n’ && currentLineIsBlank) {
// send a standard http response header
client.println(“HTTP/1.1 200 OK”);
// remainder of header follows below, depending on if
// web page or XML page is requested
// Ajax request - send XML file
if (StrContains(HTTP_req, “ajax_inputs”)) {
// send rest of HTTP header
client.println(“Content-Type: text/xml”);
client.println(“Connection: keep-alive”);
client.println();
SetLEDs();
// send XML file containing input states
XML_response(client);
}
else { // web page request
// send rest of HTTP header
client.println(“Content-Type: text/html”);
client.println(“Connection: keep-alive”);
client.println();
// send web page
webFile = SD.open(“index.htm”); // open web page file
if (webFile) {
while(webFile.available()) {
client.write(webFile.read()); // send web page to client
}
webFile.close();
}
}
// display received HTTP request on serial port
Serial.print(HTTP_req);
// reset buffer index and all buffer elements to 0
req_index = 0;
StrClear(HTTP_req, REQ_BUF_SZ);
break;
}
// every line of text received from the client ends with \r\n
if (c == ‘\n’) {
// last character on line of received text
// starting new line with next character read
currentLineIsBlank = true;
}
else if (c != ‘\r’) {
// a text character was received from client
currentLineIsBlank = false;
}
} // end if (client.available())
} // end while (client.connected())
delay(1); // give the web browser time to receive the data
client.stop(); // close the connection
} // end if (client)
}

// checks if received HTTP request is switching on/off LEDs
// also saves the state of the LEDs
void SetLEDs(void)
{
// LED 1 (pin 6)
if (StrContains(HTTP_req, “LED1=1”)) {
LED_state[0] = 1; // save LED state
digitalWrite(6, HIGH);
}
else if (StrContains(HTTP_req, “LED1=0”)) {
LED_state[0] = 0; // save LED state
digitalWrite(6, LOW);
}

}

// send the XML file with analog values, switch status
// and LED status
void XML_response(EthernetClient cl)
{
int analog_val; // stores value read from analog inputs
int count; // used by ‘for’ loops
int sw_arr = {2, 3, 5}; // pins interfaced to switches

cl.print("<?xml version = \"1.0\" ?>");
cl.print("");
// read analog inputs
for (count = 2; count <= 5; count++) { // A2 to A5
analog_val = analogRead(count);
cl.print("");
cl.print(analog_val);
cl.println("");
}
// read switches
for (count = 0; count < 3; count++) {
cl.print("");
if (digitalRead(sw_arr[count])) {
cl.print(“ON”);
}
else {
cl.print(“OFF”);
}
cl.println("");
}
// checkbox LED states

// LED1
cl.print("");
if (LED_state[0]) {
cl.print(“on”);
}
else {
cl.print(“off”);
}
cl.println("");

}

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
for (int i = 0; i < length; i++) {
str = 0;

  • }*
    }
    // searches for the string sfind in the string str
    // returns 1 if string found
    // returns 0 if string not found
    char StrContains(char *str, char *sfind)
    {

  • char found = 0;*

  • char index = 0;*

  • char len;*

  • len = strlen(str);*

  • if (strlen(sfind) > len) {*

  • return 0;*

  • }*

  • while (index < len) {*

  • if (str[index] == sfind[found]) {*

  • found++;*

  • if (strlen(sfind) == found) {*

  • return 1;*

  • }*

  • }*

  • else {*

  • found = 0;*

  • }*

  • index++;*

  • }*

  • return 0;*
    }

First things first!!! Use code tags!!! </> Kindly edit your post.

Just a casual observation though, your IP address and gateway IP address are on different sub-nets!! Is this intentional?

Regards,

Graham

noo....it was by mistake...sorry.

The problem is The webpage stored in SD card loads once(through browser)...but if the power is switched OFF....and ON again it doesn't work...

Hi @JEEVANKUMARSHETTY

continue here the discussion, stop PM please, i send u correct sketch for setting SD card and ethernet card for arduino DUE and I’m sure it works.

the my answer is for your request “i have error setup SD and in find index.htm file in SD card” …

Test work in this topic http://forum.arduino.cc/index.php?topic=242890.0

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

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 0, 0, 9);

EthernetServer server(80);  // create a server at port 80

boolean has_filesystem = true;
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;

void setup() {
  delay(1000);
  Serial.begin(9600);
                   
  pinMode(4, OUTPUT);     
  digitalWrite(4, 1); 
                               
  Serial.println("Setting SD card...");
  if (!card.init(SPI_FULL_SPEED, 4)) {
    Serial.println("SD card failed");
    has_filesystem = false;
  }
  if (!volume.init(&card)) {
    Serial.println("SD vol.init failed!");
    has_filesystem = false;
  }
  if (!root.openRoot(&volume)) {
   Serial.println("SD openRoot failed");
    has_filesystem = false;
  }

  if (!has_filesystem)  Serial.println("General SD error !!");
  else
  Serial.println("Sd OK and Ready ....");
 
  Serial.println("Setting up the Ethernet card...");
  Ethernet.begin(mac, ip);

  //if (!SD.exists("index.htm")) {
        //Serial.println("ERROR - Can't find index.htm file!");     
  //}
   
    if (!file.open(&root, "index.htm", O_READ)) {
      Serial.println("ERROR - Can't find index.htm file!");
      file.close();
    }
    else  Serial.println("index.htm file is present!");       
}

void loop(){
}

Add line for serial debug
Ok… now u have this response in serial monitor? yes or no?

Setting SD card…
Sd OK and Ready …
Setting up the Ethernet card…
index.htm file is present!

if “NO”: verify and use
SD card type SDHC
over 2 Gb
format fat32
model Kingston is good

Ps:Use tag code pls “</>”

Ps_bis:
if you have problems with the .htm page and not post the html file it will be difficult to help you :frowning:

sorry for my english
Regards,
Pablos

Yes it prints…

Setting SD card…
Sd OK and Ready …
Setting up the Ethernet card…
index.htm file is present!

in the serial monitor. But webpage doesn’t get loaded.

find the attachment for index.htm file.

index.htm


Arduino Ajax I/O .IO_box { text-align: center margin: 0 50px 50px 0; border: 2px solid blue; padding: 0 5px 0 5px; width: 250px; } h1 { font-size: 150%; color: blue; margin: 0 0 10px 0; } h2 { font-size: 95%; color: #5734E6; margin: 5px 0 5px 0; } p, form, button { font-size: 80%; color: #252525; } .small_text { font-size: 70%; color: #737373; }

HOME AUTOMATION

LIGHT

LED1 is OFF (D8)

LED2 is OFF (D9)

LED3 is OFF (D8)

LED4 is OFF (D9)

example open html file from sd and print in browser, but you have many examples in the internet
Test in my arduino DUE and load your page html successfully… I have not tried the ajax requests, this is your job :slight_smile:

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,2, 177 };
File webFile;
EthernetServer server(80);
 
void setup(){
  Ethernet.begin(mac, ip);
  server.begin();
  if (SD.begin(4)) { return; }
}
 
void loop()
{
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
 
          webFile = SD.open("index.htm");
          if (webFile) {
            while (webFile.available()) {
                client.write(webFile.read());
            }
            // close the file:
            webFile.close();
          }
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}

bye

ps: Read this for use PIO register and use the speed communications http://forum.arduino.cc/index.php?topic=243791.0;nowap

@pablos

Thank u very much again...your code works fine and html file appears on the Browser.

But on power up, its not working again. once i press the Reset Button, it starts working.

have any solution for this?? :)

Regards, Jeevan

mmmm ... you press small white button in board arduino DUE?

No... are you speaking about erase button??

Going through the following link https://forum.arduino.cc/index.php?topic=256771.45

i found out that its issue with hardware..have more info about this??

regards, Jeevan

No... are you speaking about erase button??

yes :)

I do not know solutions for DUE clones sorry. but it certainly is a problem Synchronizing with the reset as with clones UNO and MEGa 2560