Go Down

Topic: Arduino Due_Ethernet_Sd card_not working (Read 1 time) previous topic - next topic

JEEVANKUMARSHETTY

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

SurferTim

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

JEEVANKUMARSHETTY

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

SurferTim

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

JEEVANKUMARSHETTY

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("<inputs>");
    // read analog inputs
    for (count = 2; count <= 5; count++) { // A2 to A5
        analog_val = analogRead(count);
        cl.print("<analog>");
        cl.print(analog_val);
        cl.println("</analog>");
    }
    // read switches
    for (count = 0; count < 3; count++) {
        cl.print("<switch>");
        if (digitalRead(sw_arr[count])) {
            cl.print("ON");
        }
        else {
            cl.print("OFF");
        }
        cl.println("</switch>");
    }
    // checkbox LED states
   
// LED1
    cl.print("<LED>");
    if (LED_state[0]) {
        cl.print("on");
    }
    else {
        cl.print("off");
    }
    cl.println("</LED>");
   

   }

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

ghlawrence2000

#5
Dec 23, 2015, 06:59 pm Last Edit: Dec 23, 2015, 07:01 pm by ghlawrence2000
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
UTFT_SdRaw now included in library manager!! ;) High speed image drawing from SD card to UTFT displays for Mega & DUE.
UTFT_GHL - a VASTLY upgraded version of UTFT_CTE. Coming soon to a TFT near you! 8) Shipping April 1 2016!

JEEVANKUMARSHETTY

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

pablos71

#7
Dec 26, 2015, 10:47 pm Last Edit: Dec 26, 2015, 11:14 pm by pablos
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

Code: [Select]
#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?
Quote
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 :(

sorry for my english
Regards,
Pablos


L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

JEEVANKUMARSHETTY

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.



JEEVANKUMARSHETTY

index.htm
Code: [Select]

<!DOCTYPE html>

<html>
   
<head>
       
<title>Arduino Ajax I/O</title>
       
<script>
      
strLED1 = "";
      
strLED2 = "";
      
strLED3 = "";
      
strLED4 = "";
   
var LED1_state = 0;
      
var LED2_state = 0;
   
var LED3_state = 0;
      
var LED4_state = 0;
      
function GetArduinoIO()

{

nocache = "&nocache=" + Math.random() * 1000000;

var request = new XMLHttpRequest();

request.onreadystatechange = function()

{
            
if (this.readyState == 4)
{
               
if (this.status == 200)
{
                  
if (this.responseXML != null)
{
                     

// XML file received - contains analog values, switch values and LED states
                     
var count;
                     

// get analog inputs
                     
var num_an = this.responseXML.getElementsByTagName('analog').length;
                     
for (count = 0; count < num_an; count++)
{
                        

  document.getElementsByClassName("analog")[count].innerHTML =
this.responseXML.getElementsByTagName('analog')[count].childNodes[0].nodeValue;

}
                     
// get switch inputs
                     
var num_an = this.responseXML.getElementsByTagName('switch').length;
                     
for (count = 0; count < num_an; count++)
{
                        
document.getElementsByClassName("switches")[count].innerHTML =
 this.responseXML.getElementsByTagName('switch')[count].childNodes[0].nodeValue;

                     
}
                     

// LED 1
                     
if (this.responseXML.getElementsByTagName('LED')[0].childNodes[0].nodeValue === "on")
{
                        
document.getElementById("LED1").innerHTML = "LED 1 is ON (D8)";
                        
LED1_state = 1;
            
}
                     
else
{
                        
document.getElementById("LED1").innerHTML = "LED 1 is OFF (D8)";
                        
LED1_state = 0;
                     
}
                     

// LED 2
                     
if (this.responseXML.getElementsByTagName('LED')[1].childNodes[0].nodeValue === "on")
{
                        
document.getElementById("LED2").innerHTML = "LED 2 is ON (D8)";
                        
LED2_state = 1;
            
}
                     
else
{
                        
document.getElementById("LED2").innerHTML = "LED 2 is OFF (D8)";
                        
LED2_state = 0;
                     
}
                        

// LED 3
                     
if (this.responseXML.getElementsByTagName('LED')[2].childNodes[0].nodeValue === "on")
{
                        
document.getElementById("LED3").innerHTML = "LED 3 is ON (D8)";
                        
LED3_state = 1;
            
}
                     
else
{
                        
document.getElementById("LED3").innerHTML = "LED 3 is OFF (D8)";
                        
LED3_state = 0;
                     
}
                     
// LED 4
                     
if (this.responseXML.getElementsByTagName('LED')[3].childNodes[0].nodeValue === "on")
{
                        
document.getElementById("LED4").innerHTML = "LED 4 is ON (D9)";

LED4_state = 1;
                     
}
                     
else
{
                        
document.getElementById("LED4").innerHTML = "LED 4 is OFF (D9)";
                        
LED4_state = 0;
                     
}
                  
}
               
}
            
}
         
}

         
// send HTTP GET request with LEDs to switch on/off if any
         
request.open("GET", "ajax_inputs" + strLED1 + strLED2 + strLED3 + strLED4 + nocache, true);

request.send(null);
         
setTimeout('GetArduinoIO()', 1000);
         
strLED1 = "";
         
strLED2 = "";
         
strLED3 = "";
         
strLED4 = "";
      
}
      

   

function GetButton1()
      
{
         
if (LED1_state === 1)
{
            
LED1_state = 0;
            
strLED1 = "&LED1=0";
         
}
         
else
{
            
LED1_state = 1;
            
strLED1 = "&LED1=1";
         
}
      
}

      
function GetButton2()
      
{
         
if (LED2_state === 1)
{
            
LED2_state = 0;
            
strLED2 = "&LED2=0";
         
}
         
else
{
            
LED2_state = 1;
            
strLED2 = "&LED2=1";
         
}
      
}
   

function GetButton3()
      
{
         
if (LED3_state === 1)
{
            
LED3_state = 0;
            
strLED3 = "&LED3=0";
         
}
         
else
{
            
LED3_state = 1;
            
strLED3 = "&LED3=1";
         
}
      
}


function GetButton4()
      
{
         
if (LED4_state === 1)
{
            
LED4_state = 0;
            
strLED4 = "&LED4=0";
         
}
         
else
{
            
LED4_state = 1;
            
strLED4 = "&LED4=1";
         
}
      
}


</script>
   

<style>
      
.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;
      
          }
   
</style>
   
</head>
   

<body onload="GetArduinoIO()">
   
   
<h1>HOME AUTOMATION</h1>
 

<div class="IO_box">
         
<h2>LIGHT</h2>

<br />         
<button type="button" id="LED1" onclick="GetButton1()">LED1 is OFF (D8)</button>
<br /><br />      
<button type="button" id="LED2" onclick="GetButton2()">LED2 is OFF (D9)</button>
<br /><br />         
<button type="button" id="LED3" onclick="GetButton3()">LED3 is OFF (D8)</button>
<br /><br />      
<button type="button" id="LED4" onclick="GetButton4()">LED4 is OFF (D9)</button>
<br /><br />
            
</div>
   
</body>

</html>

pablos71

#10
Dec 28, 2015, 01:30 pm Last Edit: Dec 28, 2015, 02:53 pm by pablos
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 :)

Code: [Select]
#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
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

JEEVANKUMARSHETTY

@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

pablos71

#12
Dec 28, 2015, 07:17 pm Last Edit: Dec 28, 2015, 07:17 pm by pablos
mmmm ... you press small white button in board arduino DUE?
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

JEEVANKUMARSHETTY

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

pablos71

Quote
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
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

Go Up