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();
  }
}

7 comentários:

  1. Realmente muito bom! me ajudou muito!

    ResponderExcluir
  2. Como eu faria um upload GET/POST, eu fiz um form simples, tipo um webserver pedreiro para GET/POST direto para o SPIFFs ...

    client.println(" p> Upload de Arquivos: /p>");
    client.println(" form method='POST' enctype='multipart/form-data'>");
    client.println(" input type='file' name='name'>");
    client.println(" input class='button' type='submit' value='Upload'> /form>");

    Eu nao sei como fazer a ponte entre isso acima e o writefile... conhece algum exemplo? Só acho para o ESP8266 que reclama que server nao tem o metodo upload

    ResponderExcluir
    Respostas
    1. Seria enviar um arquivo para o SPIFFS via página web? Não sei como seria. Preciso estudar sobre. É interessante! Anotado aqui para eu verificar sobre isso também.

      Excluir
  3. Estou iniciando como ESP32. Gostei muito do seu post. Valeu!!!

    ResponderExcluir
  4. Onde acho esta biblioteca para o 8266, no link não consegu baixar

    ResponderExcluir
    Respostas
    1. Boa tarde! Os links do github estão na postagem.
      Vou deixa-los aqui no comentário também:
      https://github.com/espressif/arduino-esp32/tree/master/libraries/SPIFFS
      https://github.com/me-no-dev/arduino-esp32fs-plugin/releases/

      Excluir