/*############################################################################
  Autor: Mario Parente
  Projeto: Criação e leitura de arquivos no Cartão SD 
  Data: 23/06/2023
  Detalhes do projeto: Demostração de algumas funções do leitor de SD_Card
############################################################################*/

#include <SD.h>
#include <SPI.h>
 
File Arquivo;

int pinoSS = 10; // Pin 53 para Mega / Pin 10 para UNO
 
void setup() { // Executado uma vez quando ligado o Arduino
  pinMode(2, INPUT_PULLUP);
  Serial.begin(9600); // Define BaundRate
  pinMode(pinoSS, OUTPUT); // Declara pinoSS como saída
 
  if (SD.begin(pinoSS)) { // Inicializa o SD Card
    Serial.println("SD Card pronto para uso."); // Imprime na tela
  }

  else {
    Serial.println("Falha na inicialização do SD Card.");
    return;
  }

  Arquivo = SD.open("/");
  Lendo_Diretorio(Arquivo, 0);
  Escrevendo_dados();

}
 
void loop() {
 
  if (digitalRead(2) == 0) {              //se o borao for pressionado
    Serial.println("Conteúdo do Arquivo:"); // Imprime na tela
    Arquivo = SD.open("SD.txt");            // Abre o Arquivo
    while (Arquivo.available()) {           // 
      Serial.write(Arquivo.read());           //Exibe o conteúdo do Arquivo
    }
    Arquivo.close(); // Fecha o Arquivo após ler
  }

}

// Função de escreve os dado em um arquivo do Cartão..........................................................
void Escrevendo_dados(){
  Arquivo = SD.open("SD.txt", FILE_WRITE); // Cria / Abre arquivo .txt
   if (Arquivo) { // Se o Arquivo abrir imprime:
    Serial.println("Escrevendo no Arquivo"); // Imprime na tela
    Arquivo.println("");     // Pula a ultima linha do arquivo
    Arquivo.println("Escrevendo isso na ultima linha e pula para a proxima.");  //Escreve e depois pula uma linha
    Arquivo.close(); // Fecha o Arquivo após escrever
    Serial.println("Terminado."); // Imprime na tela
    Serial.println(" ");
  }
  else {     // Se o Arquivo não abrir
    Serial.println("Erro ao Abrir"); // Imprime na tela
  }
}
//.........................Fim da função.........................................................................


// Função de leitura de todos o arquivos na raiz do Cartão...............................
void Lendo_Diretorio(File dir, int numTabs) {
  while (true) {
    File entry =  dir.openNextFile();
    if (! entry) {       // sem mais arquivos
      break;
    }

    for (uint8_t i = 0; i < numTabs; i++) {
      Serial.print('\t');
    }

    Serial.print(entry.name());
    if (entry.isDirectory()) {
      Serial.println("/");
      Lendo_Diretorio(entry, numTabs + 1);
    }

    else {      // arquivos têm tamanhos, diretórios não
      Serial.print("\t\t");
      Serial.println(entry.size(), DEC);
    }
      entry.close();
  }
  Serial.println(" ");
}
//.........................Fim da função.........................................................................