Go Down

Topic: Problem with a Wifi Webserver and using an SD card (Read 2256 times) previous topic - next topic



I'm using an Arduino Uno with the official Wifi shield. I would like to run a web server that reads a file from the SD card when a specific URL is requested.
So far I'm able to successfully connect to my Wifi network and also respond to URL requests I make from a browser on my computer.
I'm running into problems when trying to read from the SD card. When I read from the SD card in a seperate sketch, without using Wifi, it works fine.

According to the documentation SD and Wifi share the SPI bus. Here is the portion of the documentation:
Note that because the HDG104 and SD card share the SPI bus, only one can be active at a time. If you are using both peripherals in your program, this should be taken care of by the corresponding libraries. If you're not using one of the peripherals in your program, however, you'll need to explicitly deselect it. To do this with the SD card, set pin 4 as an output and write a high to it. For the HDG104, set digital pin 10 as a high output.

So I thought that I have to do the following to switch between SD and Wifi:
Code: [Select]
    // Switch to SD

    // Read from SD

    // Switch back to Wifi

Unfortunately that does not work. The http request comes in and as soon as SD.open("test.txt") is called the Arduino stops working. Looses Wifi connection and does not accept any subsequent http requests.

Any ideas on how I can get the Wifi to work with the SD card?

Here is the complete code from my sketch: (mostly copied and glued together from the examples)
Code: [Select]

Universal Remote - IR Remote control for a smartphone

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

char ssid[] = "myssid";      //  your network SSID (name)
char pass[] = "mypassword";   // your network password
int status = WL_IDLE_STATUS;
WiFiServer server(80);

File currentIRSignalFile;

void setup() {
  Serial.begin(9600);      // initialize serial communication

  pinMode(10, OUTPUT);
  pinMode(4, OUTPUT);

  Serial.print("Initializing SD card...");   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
  Serial.println("initialization done.");

  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    while(true);        // don't continue

  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to Network named: ");
    Serial.println(ssid);                   // print the network name (SSID);

    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:   
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
  server.begin();                           // start the web server on port 80
  printWifiStatus();                        // you're connected now, so print out the status

void loop() {
  WiFiClient client = server.available();   // listen for incoming clients
if (client) {
    Serial.println("new client");   
    String httpResponse = String("IRSIGNAL_NOT_FOUND");
    String httpRequest = "";
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        httpRequest +=c;
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // I would like to listen to http://<ip address>/IRSignal/IRSignalName
          if (httpRequest.substring(5,13) == "IRSignal") {
            String httpSubRequest = httpRequest.substring(13);
            String httpCodeRequest = httpSubRequest.substring(httpSubRequest.indexOf('/')+1, httpSubRequest.lastIndexOf("HTTP"));
            Serial.print("IR Signal Requested:");
            if (httpCodeRequest == "SonyVolumeUp") {
              Serial.println("Trying to read from the SD Card");
              // switch to SD card
              File signalFile = SD.open("test.txt");
              if (signalFile) {
                Serial.println("IR Signal File found.");
                // read from the file until there's nothing else in it:
                while (signalFile.available()) {
                // close the file:
                Serial.println("Error opening file.");
              // switch back to Wifi 
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/plain");
          client.println("Connnection: close");
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
    // give the web browser time to receive the data
    // close the connection:
    Serial.println("client disonnected");

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.println(" dBm");
  // print where to go in a browser:
  Serial.print("To see this page in action, open a browser to http://");

And here is the serial output:

Initing SD card...initialization done.
Attempting to connect to Network named: myssid
Initializing SD card...initialization done.
Attempting to connect to Network named: myssid
SSID: myssid
IP Address:
signal strength (RSSI):-68 dBm
To see this page in action, open a browser to
new client
GET /IRSignal/SonyVolumeUp HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:16.0) Gecko/20100101 Firefox/16.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

client disonnected
new client
client disonnected
new client
GET /IRSignal/SonyVolumeUp HTTP/1.1
User-Agent: Moz´R+?¥?±¥é¥¹SD card...initialization done.
Attempting to connect to Network named: myssid


It says "If you're not using one of the peripherals in your program, however, you'll need to explicitly deselect it."  Since you are using both peripherals you should let the libraries do the selecting.
Send Bitcoin tips to: 1G2qoGwMRXx8az71DVP1E81jShxtbSh5Hp


Yes I found that in the documentation as well. But what does it mean? If I try to access the SD card while also using Wifi without setting the LOW and HIGH pins it does not work either. I get the same result. Any ideas?
Thanks and best regards,

Go Up