3 de junho de 2021

Gravar Arquivos no ESP32 - SPIFFS

SPI Flash File System é o sistema de arquivos do ESP32. É possível acessar a memória flash para ler, gravar, renomear e excluir arquivos.

Um sistema de monitoramento gerando arquivos de log em txt, o html de uma página, ou um arquivo com parâmetros de configurações são bons exemplos para uso.

No ambiente Arduino, a biblioteca SPIFFS já está incluída no pacote do ESP32.

Para realizar o upload de um arquivo já escrito para a memória, é necessário baixar o plugin ESP32 Sketch Data Upload.

O arquivo deverá ser salvo dentro do diretório "tools" da Arduino IDE.

No diretório do seu programa, crie uma pasta chamada "data" e, dentro dela, salve os arquivos que serão enviados para a memória do ESP32.

Após reiniciar a IDE, no menu Ferramentas estará disponível a opção para realizar o upload dos arquivos para a memória.

Para listar os arquivos salvos, ler os conteúdos, criar novos arquivos, deixo os exemplos no código fonte.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*---------------------------------------------------------
  Programa : SPIFFS - SPI Flash File System
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 02/06/2021
  ---------------------------------------------------------*/
#include <FS.h>     //File System [ https://github.com/espressif/arduino-esp32/tree/master/libraries/FS ]
#include <SPIFFS.h> //SPI Flash File System [ https://github.com/espressif/arduino-esp32/tree/master/libraries/SPIFFS ]

void setup() {
  int t = 5000;
  Serial.begin(115200);
  delay(1000);
  Serial.println("SPIFFS - SPI Flash File System");
  Serial.println("www.efeitonerd.com.br");
  delay(t);

  Serial.println("\nEscreve novo arquivo");
  writeFile("Linha1", "/Arquivo01.txt", false);
  delay(t);

  Serial.println("\nEscreve no arquivo criado, adicionando nova linha");
  writeFile("Linha2", "/Arquivo01.txt", true);
  delay(t);

  Serial.println("\nEscreve novo arquivo em sub diretório");
  writeFile("Linha1-AA", "/Subdir/ArquivoAA.txt", false);
  delay(t);

  Serial.println("\nLista todos os arquivos");
  listFiles("/");
  delay(t);

  Serial.println("\nLista todos os arquivos do sub diretorio");
  listFiles("/Subdir");
  delay(t);

  Serial.println("\nVisualiza o conteudo do ArquivoAA.txt do sub diretório");
  readFile("/Subdir/ArquivoAA.txt");
  delay(t);

  Serial.println("\nRenomeia o Arquivo01.txt para Arq001.txt");
  renameFile("/Arquivo01.txt", "/Arq001.txt");
  delay(t);

  Serial.println("\nApaga o arquivo Arq001.txt");
  deleteFile("/Arq001.txt");
  delay(t);

  Serial.println("\nLista todos os arquivos novamente");
  listFiles("/");
  delay(t);

  Serial.println("\nwww.efeitonerd.com.br");
}

void loop() {
}

/*--- ESCREVE O ARQUIVO ---*/
bool writeFile(String values, String pathFile, bool appending) {
  char *mode = "w"; //open for writing (creates file if it doesn't exist). Deletes content and overwrites the file.
  if (appending) mode = "a"; //open for appending (creates file if it doesn't exist)
  Serial.println("- Writing file: " + pathFile);
  Serial.println("- Values: " + values);
  SPIFFS.begin(true);
  File wFile = SPIFFS.open(pathFile, mode);
  if (!wFile) {
    Serial.println("- Failed to write file.");
    return false;
  } else {
    wFile.println(values);
    Serial.println("- Written!");
  }
  wFile.close();
  return true;
}

/*--- LEITURA DO ARQUIVO ---*/
String readFile(String pathFile) {
  Serial.println("- Reading file: " + pathFile);
  SPIFFS.begin(true);
  File rFile = SPIFFS.open(pathFile, "r");
  String values;
  if (!rFile) {
    Serial.println("- Failed to open file.");
  } else {
    while (rFile.available()) {
      values += rFile.readString();
    }
    Serial.println("- File values: " + values);
  }
  rFile.close();
  return values;
}

/*--- APAGA O ARQUIVO ---*/
bool deleteFile(String pathFile) {
  Serial.println("- Deleting file: " + pathFile);
  SPIFFS.begin(true);
  if (!SPIFFS.remove(pathFile)) {
    Serial.println("- Delete failed.");
    return false;
  } else {
    Serial.println("- File deleted!");
    return true;
  }
}

/*--- RENOMEIA O ARQUIVO ---*/
void renameFile(String pathFileFrom, String pathFileTo) {
  Serial.println("- Renaming file " + pathFileFrom + " to " + pathFileTo);
  SPIFFS.begin(true);
  if (!SPIFFS.rename(pathFileFrom, pathFileTo)) {
    Serial.println("- Rename failed.");
  } else {
    Serial.println("- File renamed!");
  }
}

/*--- FORMATA O FILE SYSTEM ---*/
bool formatFS() {
  Serial.println("- Formatting file system...");
  SPIFFS.begin(true);
  if (!SPIFFS.format()) {
    Serial.println("- Format failed.");
    return false;
  } else {
    Serial.println("- Formatted!");
    return true;
  }
}

/*--- LISTA OS ARQUIVOS DOS DIRETÓRIOS ---*/
void listFiles(String path) {
  Serial.println("- Listing files: " + path);
  SPIFFS.begin(true);
  File root = SPIFFS.open(path);
  if (!root) {
    Serial.println("- Failed to open directory");
    return;
  }
  if (!root.isDirectory()) {
    Serial.println("- Not a directory: " + path);
    return;
  }

  File file = root.openNextFile();
  while (file) {
    if (file.isDirectory()) {
      Serial.print("- Dir: ");
      Serial.println(file.name());
    } else {
      Serial.print("- File: ");
      Serial.print(file.name());
      Serial.print("\tSize: ");
      Serial.println(file.size());
    }
    file = root.openNextFile();
  }
}

Um comentário: