Создаем файловую систему SPIFFS на микроконтроллере ESP8266/ESP32 для хранения данных в среде программирования Arduino IDE.

В данном уроке мы с Вами рассмотрим технологию SPIFFS. 

SPIFFS – это файловая система для записи и чтения файлов, хранящихся во
флеш-памяти микроконтроллеров. Раздел флеш-памяти для SPIFFS настраивается в среде Arduino IDE в зависимости от требований скетча:

Раздел SPIFFS по умолчанию для микроконтроллера ESP32 составляет 1472 кБ. Файловая система SPIFFS может использоваться для хранения файлов данных, файлы с HTML код для веб-страниц, а также файлов изображения.
Микроконтроллеры ES8266 использует библиотеку LittleFS, а ESP32 используют библиотеки SPIFFS.
Файловая система SPIFFS имеет одноуровневую структуру,
структура в виде каталогов не поддерживается. Файл с указанием пути temp/filename.txt создает файл с именем temp/filename.txt, а не файл с именем filename.txt в папке temp.  Не смотря на это файлы распределяются по каталогам с помощью префикса имени файла с именем каталога, например /temp/filename.txt. Так же надо учитывать тот факт, что максимальная длина символов может достигать 31 символ включая каталоги и имя файла. 

Для работы с файлами используются следующие параметры: 
r (для ESP8266) и FILE_READ (ESP32) — Чтение файла с начала
w (для ESP8266) и FILE_WRITE (ESP32) — Создать файл для записи с начала
a (для ESP8266) и FILE_APPEND (ESP32) — Добавить с конца

Для работы с файловой системой нам нужно включить ее : LittleFS.begin(), если файловая система создана, функция вернет TRUE, тем самым мы можем проверять факт создания файловой системы. Дальше нам нужно создать нужный файл, если он не создан, для этого нам достаточно открыть файл на запись, и если его нет, — он будет создан:

File file = LittleFS.open(filename, » w»); 

Для добавления записи в конец строки мы используем ту же команду, только ставим ключ а:

file = LittleFS.open(filename, «a»);

Так же есть команда переименования файла: LittleFS.rename(oldname, newname);

И при необходимости мы можем удалить файл: LittleFS.remove(filename); Но перед удалением надо убедится командой  LittleFS.exists(filename), что мы уже не работаем с данным файлом:

if(LittleFS.exists(filename)) LittleFS.remove(filename);

Так же обязательно после любых действий с файлом, его необходимо закрывать: file.close();

Теперь мы напишем код, в котором будем мерять температуру раз в секунду и записывать данные в файл, после 10 измерений мы будем отправлять данные в монитор порта имитируя передачу данных в облако или куда Вам надо.

Программный код:

#if(ESP8266)
#include <LittleFS.h>
#define DHTPIN D2 //GPIO4
#endif
#if(ESP32)
#include <SPIFFS.h>
#define DHTPIN 22
#endif

 

#include <DHT.h>;
String filename = «/temp/HT22.txt»;

#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
float temp; //Stores temperature value
int n=0;

void setup() {
Serial.begin(9600);
dht.begin();
#if(ESP8266)
if(LittleFS.begin()) Serial.println(«initialised OK»);
#endif
#if(ESP32)
if(SPIFFS.begin(true)) Serial.println(«initialised OK»);
#endif

}

void loop() {
temp= dht.readTemperature();
if(n<=9){
n++;
#if(ESP8266)
File file = LittleFS.open(filename, «a»); // append to file
#endif
#if(ESP32)
File file = SPIFFS.open(filename, «a»); // append to file
#endif

file.print(«t=»);
file.println(temp);
file.close();
}else{
dirContent(«/temp»);
fileContent(filename);
#if(ESP8266)
if(LittleFS.exists(filename)) LittleFS.remove(filename);
#endif
#if(ESP32)
if(SPIFFS.exists(filename)) SPIFFS.remove(filename);
#endif

n=0;
}
delay(1000);
}

void dirContent(String dname){ // function to display directory content
Serial.print(dname);
Serial.println(» content»);
#if(ESP8266)
Dir dir = LittleFS.openDir(dname);
while(dir.next()){
File file = dir.openFile(«r»); // read file

Serial.print(«file «);
Serial.print(file.name());Serial.print(«\t»);
Serial.print(«size «);
Serial.println (file.size()); // filesize
}
#endif
#if(ESP32)
File dir = SPIFFS.open(dname);
File file = dir.openNextFile(); // openNextFile
while(file)
{
Serial.print(«file «);Serial.print(file.name());
Serial.print(«\t»);
Serial.print(«size «);Serial.println(file.size());
file = dir.openNextFile(); // openNextFile
}
#endif
}
void fileContent(String fname){ // function to display file content
#if(ESP8266)
File file = LittleFS.open(fname, «r»);
#endif
#if(ESP32)
File file = SPIFFS.open(fname, «r»);
#endif
while(file.available()) Serial.write(file.read());
file.close();
}