// include the SD library:
#include <SPI.h>
#include <SD.h>

//deklarasi variabel menggunakan fungsi SD library:
Sd2Card card;    //deklarasi variabel card dg tipe Sd2Card
SdVolume volume; //deklarasi variabel volume dg tipe SdVolume
SdFile root;     //deklarasi variabel root dg tip SdFile
const int chipSelect = 4; //deklarasi chipSelect terhubung pd pin 4 pd Arduino

void setup() {
  //aktifkan komunikasi serial dan menunggu port dibuka
  Serial.begin(9600);
  while (!Serial) {
    ; //menunggu port serial terhubung
  }
  Serial.print("\nInisialisasi SD-card...");
//kita gunakan kode inisialisasi dari library, karena kita hanya menguji apakah kartunya berfungsi
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("inisialisasi gagal. Check hal berikut:");
    Serial.println("* apakah card sudah dimasukkan ke dalam modul ?");
    Serial.println("* apakah pengkabelan sudah benar ?");
    Serial.println("* apakah pin chipSelect dirubah ?");    
    while (1);
  } else {
    Serial.println("Pengkabelan sudah benar & kartu dikenali.");
  }

  Serial.println(); //cetak pada Serial Monitor tipe kartu
  Serial.print("Tipe kartu:         ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:  //tipe SD1
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:  //tipe SD2
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC: //tipe SDHC
      Serial.println("SDHC");
      break;  //keluar dari blok switch{}
    default:
      Serial.println("Tidak dikenal");
  }

  //kita coba membuka 'volume/partition' - seharusnya terbaca FAT16 atau FAT32
  if (!volume.init(card)) {
    Serial.println("Tdk menemukan FAT16/FAT32.\nPastikan anda telah memformat kartu");
    while (1);
  }

  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());      //cetak jumlah cluster
  Serial.print("Jumlah blok per cluster:  ");
  Serial.println(volume.blocksPerCluster()); //cetak jumlah blok per cluster

  Serial.print("Total Blok:      ");       //cetak total blok
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();

  uint32_t volumesize; //cetak tipe dan size dari volume FAT-type pertama
  Serial.print("Volume tipeadalah: FAT");
  Serial.println(volume.fatType(), DEC);

  volumesize = volume.blocksPerCluster();    //cluster adalah kumpulan dari blok
  volumesize *= volume.clusterCount();       //ada banyak cluster 
  volumesize /= 2;                           //blok Sd-card selalu 512 byte (2 blok = 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("\nFile ditemukan pd card (nama, tanggal & size dlm byte): ");
  root.openRoot(volume);

  root.ls(LS_R | LS_DATE | LS_SIZE);//list seluruh file dlm card dengan tanggal & ukuran
}

void loop(void) {
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5