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