ESP8266のSPIFFS機能


ESP8266ではSPIFFSと呼ばれるファイルシステムを使うことができます。
SPIFFSについてはこ ちらこ ちらで紹介されていますが、いずれもデータアップロードツールを使って
事前にファイルをアップロードし、アップロードしたファイルを読む内容です。

そこで、スケッチ内部でSPIFFS領域をフォーマットし、ファイルを読み書きする方法を紹介します。
以下にサンプルスケッチが紹介されていますが、少し変更しました、
http://www.esp8266.com/viewtopic.php?f=29&t=8194

SPIFFSのドキュメントは以下にあります。
https://github.com/esp8266/Arduino/blob/master/doc/filesystem.md

なお、SPIFFSを使うためにはArduino-IDEのツールメニューでFlush SizeにSPIFFSのサイズを指定する必要があります。
例えば、Flush Size:"4M(3M SPIFFS)"と指定すると3MのSPIFFSが使えます。
/*
* Basic SPIFFS Example
*
* SPIFFS doc see :https://github.com/esp8266/Arduino/blob/master/doc/filesystem.md
*/
#include "FS.h"

void listDir() {
  char cwdName[2];

  strcpy(cwdName,"/");
  Dir dir=SPIFFS.openDir(cwdName);
  while( dir.next()) {
    String fn, fs;
    fn = dir.fileName();
    fn.remove(0, 1);
    fs = String(dir.fileSize());
    Serial.println("<" + fn + "> size=" + fs);
  } // end while
}


void setup() {
  delay(500);
  Serial.begin(9600);
  Serial.println();

  Serial.println("\nVery basic Spiffs example, writing 10 lines to SPIFFS filesystem, and then read them back");
  SPIFFS.begin();
  // Next lines have to be done ONLY ONCE!!!!!When SPIFFS is formatted ONCE you can comment these lines out!!
  Serial.println("Please wait 30 secs for SPIFFS to be formatted");
  SPIFFS.format();
  Serial.println("Spiffs formatted");

  // open file for writing
  File f = SPIFFS.open("/f.txt", "w");
  if (!f) {
    Serial.println("file open failed");
  } else {
    Serial.println("====== Writing to SPIFFS file =========");
    // write 10 strings to file
    for (int i=1; i<=10; i++){
      f.print("Line : ");
      f.println(i);
    } // end for
    f.close();
  } // end if

  // list directory
  listDir();

  // open file for reading
  f = SPIFFS.open("/f.txt", "r");
  if (!f) {
    Serial.println("file open failed");
  } else {
    Serial.println("====== Reading from SPIFFS file =======");
    // write 10 strings to file
    for (int i=1; i<=10; i++){
      String s=f.readStringUntil('\n');
      Serial.print(i);
      Serial.print(":");
      Serial.println(s);
    } // end for
    f.close();
  } // end if


}

void loop() {
}

結果は以下の通りです。
10行のテキストファイルが作られていることが分かります。


こちらで、RTCのユーザエリアはReset/Restartでも保持されるこ とを紹介しました。
そこで、Reset/RestartでSPIFFS上に作られたファイルが保持されるのかどうか、確認してみます。

続く....