SD Card Reader Module with Arduino Tutorial

SD card is simple way to save data because its size and capacity. SD Card become so popular to save data in mobile implementation.  This is tutorial about how to use SD Card module with arduino. We will learn how to create, read, delete file and use this SD Card module as data logger.

OK let’s just start wire the module with arduino like picture below

arduino and sd card module wiring
arduino and sd card module

First, we will test if SD card read by arduino successfully. You can use the cardInfo sketch from library like this :

/*
  SD card test

  This example shows how use the utility libraries on which the'
  SD library is based in order to get info about your SD card.
  Very useful for testing a card when you're not sure whether its working or not.

  The circuit:
    SD card attached to SPI bus as follows:
 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 ** CS - depends on your SD card shield or module.
 		Pin 4 used here for consistency with other Arduino examples


  created  28 Mar 2011
  by Limor Fried
  modified 9 Apr 2012
  by Tom Igoe
*/
// include the SD library:
#include <SPI.h>
#include <SD.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// MKRZero SD: SDCARD_SS_PIN
const int chipSelect = 4;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("\nInitializing SD card...");

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    while (1);
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.println();
  Serial.print("Card type:         ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    while (1);
  }

  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());
  Serial.print("Blocks x Cluster:  ");
  Serial.println(volume.blocksPerCluster());

  Serial.print("Total Blocks:      ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();

  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("Volume type is:    FAT");
  Serial.println(volume.fatType(), DEC);

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize /= 2;                           // SD card blocks are always 512 bytes (2 blocks are 1KB)
  Serial.print("Volume size (Kb):  ");
  Serial.println(volumesize);
  Serial.print("Volume size (Mb):  ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Gb):  ");
  Serial.println((float)volumesize / 1024.0);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) {
}

Upload the program and open Serial Monitor.

SD Card read file using arduino successfully
SD Card read file using arduino successfully

After in the serial monitor indicates no error and the card can read successfully then it’s time for try to create,open, and erase file.

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

File test;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  Serial.print("SD Card init...");
  //test if wiring is correct
  if (!SD.begin(4)) {
    Serial.println("init failed..");
    while (1);
  }
  Serial.println("init ok");

  //test if file exist
  if (SD.exists("testing.txt")) {
    Serial.println("Yes that is exist..");
  } else {
    Serial.println("Nope there is not..");
  }

  //create file
  Serial.println("Creating file..");
  test = SD.open("testing.txt", FILE_WRITE);
  test.close();

  //test again if file exist to verify
  if (SD.exists("testing.txt")) {
    Serial.println("Yes that is exist..");
  } else {
    Serial.println("Nope there is not..");
  }

  //Delete file
  Serial.println("Deleting file...");
  SD.remove("testing.txt");

  //test again
  if (SD.exists("testing.txt")) {
    Serial.println("Yes that is exist..");
  } else {
    Serial.println("Nope there is not..");
  }
  delay(1000);
  Serial.println("Testing done...");
}

void loop() {
  // put your main code here, to run repeatedly:

}

If everything’s right it should show like this in serial monitor :

create,open, and erase file success
create,open, and erase file success

That means we have successfully check if file exist, create file, delete file, and check again if file has deleted.

Now if you want to make the SD card as data logger, we will simulate random number to be saved at SD card. Use this sketch :

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

File data;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  Serial.print("SD Card init...");
  //test if wiring is correct
  if (!SD.begin(4)) {
    Serial.println("init failed..");
    while (1);
  }
  Serial.println("init ok");
}

void loop() {
  // put your main code here, to run repeatedly:
  int number = random(0, 10); //create random number
  String stringData = (String)number; //convert number to string
  data = SD.open("data.txt", FILE_WRITE); //open file

  if (data) {
    data.println(stringData); //print the data to file
    data.close();
    Serial.println(stringData);
  } else {
    Serial.println("Cannot open file");
  }
}

In the sketch above, we generate random number between 0 to 10. And then save that number in data.txt file to the SD card. 

If this success, you should able to open the data.txt to your computer using memory card.

You can see full video tutorial below

Youtube full video how to use SD Card with arduino

Leave a Reply

Your email address will not be published. Required fields are marked *