#include <SPI.h>    //deklarasi library SPI utk komunikasi modul SD-card
#include <SD.h>     //deklarasi library SD 
File myFile;        //deklarasi variabel myFile sebagai tipe File
File root;          //deklarasi variabel root sebagai tipe File
//======================================================================
String extension = ".txt"; //deklarasi variabel extension utk nama file
String fileName;    //variabel nama file utk membuat file
String dataSerial;  //variabel utk menampung data serial dari komputer
#define Buz 6       //deklarasi pin 6 terkonek ke Buz
int menuChoice;     //deklarasi variabel pemilihan menu
//======================================================================
void setup() {
  Serial.begin(9600);
  while (!Serial) { /*menunggu hingga Serial port terhubung*/ }
  Serial.print("Initializing SD card...");
  if (!SD.begin(4)) { //inisialisasi library SD dg Chip Select (CS)=4 
    Serial.println("initialization failed!"); //jika SD.begin(4)=0 maka
    while (1);        //berhenti
  }
  Serial.println("initialization done.");
}
//----------------------------------------------------------------------
void loop() {  menuSet(); }
//----------------------------------------------------------------------
void petunjuk() {
  tone(Buz, 400); Serial.println();
  Serial.println(F("!---------------------------------------------------!"));
  Serial.println(F("! MENU MEMBUAT, MENULIS, MEMBACA & MENGHAPUS FILE   !"));
  Serial.println(F("!---------------------------------------------------!"));
  Serial.println(F("! Ketik hanya angka desimal untuk pilih Menu        !"));
  Serial.println(F("!---------------------------------------------------!"));
  Serial.println(F("! Pilih 1 untuk membuat File                        !"));
  Serial.println(F("! Pilih 2 untuk membuat & menulis ke dalam File     !"));
  Serial.println(F("! Pilih 3 untuk membaca isi File                    !"));
  Serial.println(F("! Pilih 4 untuk menghapus File                      !"));
  Serial.println(F("! Pilih 5 untuk menampilkan isi SD-card             !"));
  Serial.println(F("!---------------------------------------------------!"));
  noTone(Buz); }
//----------------------------------------------------------------------
void bacaNamaFile() {
  while(Serial.available() == 0 ) {} //tunggu hingga ada data serial masuk
    dataSerial = Serial.readString();//membaca teks yang ditulis dari Serial
    dataSerial.concat(extension);    //menggabung dengan 'TXT'
    fileName = dataSerial;
}
void bacaDataFile() {
  while(Serial.available() == 0 ) {} //tunggu hingga ada data serial masuk
    dataSerial = Serial.readString();//membaca teks yang ditulis dari Serial   
}
//----------------------------------------------------------------------
void menuSet() {
  petunjuk();     //panggil fungsi petunjuk
  tone(Buz, 400); delay(100); noTone(Buz);
  while(Serial.available() == 0) {} // menunggu data serial masuk
  menuChoice = Serial.read() - 48;  // baca data byte serial, koreksi dg -48
  switch (menuChoice) {
  case 1:
    Serial.println(F("MEMBUAT FILE TEXT"));
    Serial.print(F("Ketik nama file : "));
    Serial.end();                //matikan Serial komunikasi
    Serial.begin(9600);          //aktifkan kembali Serial komunikasi
    bacaNamaFile();              //panggil fungsi buatan 'bacaNamaFile'
    Serial.println(fileName);    //tampilkan nama file pd Serial Monitor
    if (SD.exists(fileName))     //cek nama file di SD-card
      Serial.print(" sudah ada");//jika sudah ada, lompat ke baris 73
    else {
      myFile = SD.open(fileName, FILE_WRITE); //jika belum, buat file & open
      myFile.close();            //close file
      Serial.print(("File " + fileName + " Sukses dibuat"));
    }
  break; //keluar dari blok 'switch'
//----------------------------------------------------------------------
  case 2:
    Serial.println(F("MEMBUAT & MENULIS DATA KE DALAM FILE"));
    Serial.print(F("Ketik Nama file : "));
    Serial.end();                //matikan Serial komunikasi
    Serial.begin(9600);          //aktifkan kembali Serial komunikasi
    bacaNamaFile();              //panggil fungsi buatan 'bacaNamaFile'
    myFile = SD.open(fileName, FILE_WRITE); //buat file dan open
    Serial.println(fileName);
    Serial.print(F("Ketik data untuk disimpan : "));
    bacaDataFile();
      Serial.println(dataSerial);
      myFile.println(dataSerial);//tulis dataSerial ke dlm SD-card
      myFile.close();            //tutup file
      Serial.println("Selesai menulis...");
  break; //keluar dari blok 'switch'
//----------------------------------------------------------------------
  case 3:
    Serial.println(F("MEMBACA DATA DARI FILE"));
    Serial.print(F("Ketik Nama file : "));
    Serial.end();               //matikan Serial komunikasi
    Serial.begin(9600);         //aktifkan kembali Serial komunikasi
    bacaNamaFile();             //panggil fungsi buatan 'bacaNamaFile'
    Serial.println(fileName);
    myFile = SD.open(fileName); //buka file
    if (myFile) {               //cek jika file ada & bisa dibuka
      while (myFile.available()) {         //tunggu hingga ada data serial masuk
        //membaca data dari SD-card dan tulis ke Serial Monitor      
        Serial.print(char(myFile.read())); 
      }
      myFile.close();  //close myFile
    } else { Serial.println("error membuka file"); }
  break; //keluar dari blok 'switch'
//----------------------------------------------------------------------
  case 4:
    Serial.println(F("MENGHAPUS FILE TEXT"));
    Serial.print(F("Ketik Nama file : "));
    Serial.end();              //matikan Serial komunikasi
    Serial.begin(9600);        //aktifkan kembali Serial komunikasi
    bacaNamaFile();            //panggil fungsi buatan 'bacaNamaFile'
    Serial.println(fileName);
    Serial.print("File "); Serial.print(fileName); Serial.print(" ");
    if (SD.exists(fileName)) { //cek jika apakah file sudah ada
      Serial.println("exists.");
      SD.remove(fileName);     //delete the file if existed
      myFile.close();    
      Serial.print("File "); Serial.print(fileName); 
      Serial.print(" sudah dihapus");
    } else { Serial.println("doesn't exist."); } //jika file tidak ada, tulis "dosen't exist"
  break; //keluar dari blok 'switch'
//----------------------------------------------------------------------  
  case 5:
    Serial.println(F("Menampilkan isi SD-card"));
    Serial.end();             //matikan Serial komunikasi
    Serial.begin(9600);       //aktifkan kembali Serial komunikasi
    Serial.println("\nFile yang ditemukan pada kartu (nama dan ukuran dalam bytes): ");
    root = SD.open("/");      //panggil fungsi open dengan parameter '/'
    printDirectory(root, 0);  //panggil fungsi baru 'printDirectory'
  break; //keluar dari blok 'switch'
  }
}        //akhir dari blok 'switch'
//----------------------------------------------------------------------
void printDirectory(File dir, int numTabs) {
  while (true) {
    File entry =  dir.openNextFile(); //fungsi root.openNextFile()
    if (! entry) {                    // jika tidak ada file lain
      break; //keluar dari blok 'switch'
    }
    Serial.print(entry.name()); //cetak nama file
    if (entry.isDirectory()) {  //apakah direktori ?
      Serial.println("/");
      printDirectory(entry, numTabs + 1);
    } else {                //jika bukan nama direktori maka ukuran file
      Serial.print("\t\t"); //file memiliki ukuran, direktori tidak
      Serial.println(entry.size(), DEC); //tulis ukuran file dalam desimal
    }
    entry.close(); //close entry
  }
}
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