ESP32でSPIFFSにファイルを読み書きする方法

ESP32-WROOM-32では搭載されているフラッシュメモリの一部をストレージとして使用できる機能「SPIFFS」があります。

ちょっとしたWebサーバーを構築してテンプレートファイルを保存するときわざわざSDカードなどの外部メディアに保存せずにどうにかならないか探したところ、この機能を知りました。

開発環境

特徴

一度書き込んだファイルはスケッチを書き換えても消えません。

スケッチにバイナリを保存する手間が省けます。

SPIFFSのサンプルプログラム

include、定義

#include "FS.h"
#include "SPIFFS.h"
#define FORMAT_SPIFFS_IF_FAILED true

初期処理

void setup(){
  Serial.begin(115200);
  if(!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)){
      Serial.println("SPIFFS Mount Failed");
      return;
  }
}

ディレクトリ、ファイル一覧を取得(サブフォルダを含む)

void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
    File root = fs.open(dirname);
    if(!root){
        return;
    }
    // ルートがディレクトリなら処理終了
    if(!root.isDirectory()){
        return;
    }

    // 次のファイルまたはディレクトリを取得
    File file = root.openNextFile();
    while(file){
        if(file.isDirectory()){
            // ディレクトリ名を出力
            Serial.print("  DIR : ");
            Serial.println(file.name());
            if(levels){
                // サブディレクトリを出力
                listDir(fs, file.name(), levels -1);
            }
        } else {
            // ファイル名とファイルサイズを出力
            Serial.print("  FILE: ");
            Serial.print(file.name());
            Serial.print("\tSIZE: ");
            Serial.println(file.size());
        }
        file = root.openNextFile();
    }
}

呼び出し

// "/"以下のファイル、ディレクトリを出力。サブディレクトリは出力しない。
listDir(SPIFFS, "/", 0);

// "/"以下のファイル、ディレクトリを出力。サブディレクトリは2階層まで出力する。
listDir(SPIFFS, "/", 1);

ファイル書き込み

void writeFile(fs::FS &fs, const char * path, const char * message){
    File file = fs.open(path, FILE_WRITE);
    if(!file){
        return;
    }
    file.print(message);
}

呼び出し

writeFile(SPIFFS, "/test.txt", "test message");

ファイル追記

void appendFile(fs::FS &fs, const char * path, const char * message){
    File file = fs.open(path, FILE_APPEND);
    if(!file){
        return;
    }
    file.print(message);
}

ファイル読み込み

void readFile(fs::FS &fs, const char * path){
    File file = fs.open(path);
    if(!file || file.isDirectory()){
        return;
    }

    while(file.available()){
        Serial.write(file.read());
    }
}

呼び出し

readFile(SPIFFS, "/test.txt");

ファイル削除

void renameFile(fs::FS &fs, const char * path1, const char * path2){
    fs.rename(path1, path2);
}

呼び出し

deleteFile(SPIFFS, "/test.txt");

Arduino IDEからファイルをアップロードする

受信したメッセージやファイルをスケッチで書き込むのではなく、Arduino IDEから直接アップロードすることができます。

①以下サイトに接続し「release page」をクリック。
https://github.com/me-no-dev/arduino-esp32fs-plugin

② ESP32FSの最新版をダウンロード。

③Arduino IDEの「ファイル」→「環境設定」→スケッチブックの保存場所に記載のあるフォルダ配下に「tools」フォルダを作成。

④作成した「tools」フォルダに②でダウンロードして解凍したフォルダを配置し、Arduino IDEを再起動。

⑤「ESP32 Sketch Data Upload」が追加されました。

Arduino IDEからESP32へファイルをアップロード

①スケッチフォルダ配下に「data」フォルダを作成し、アップロードしたファイルを配置します。

test.txt

hello world

②Arduino IDEの「ESP32 Sketch Data Upload」をクリックすればアップロード完了です。