ESP32でSPIFFSにファイルを読み書きする方法
ESP32-WROOM-32では搭載されているフラッシュメモリの一部をストレージとして使用できる機能「SPIFFS」があります。
ちょっとしたWebサーバーを構築してテンプレートファイルを保存するときわざわざSDカードなどの外部メディアに保存せずにどうにかならないか探したところ、この機能を知りました。
Contents- 1. 開発環境
- 2. 特徴
- 3. SPIFFSのサンプルプログラム
- 3.1. include、定義
- 3.2. 初期処理
- 3.3. ディレクトリ、ファイル一覧を取得(サブフォルダを含む)
- 3.4. ファイル書き込み
- 3.5. ファイル追記
- 3.6. ファイル読み込み
- 3.7. ファイル削除
- 4. Arduino IDEからファイルをアップロードする
- 5. Arduino IDEからESP32へファイルをアップロード
開発環境
- Arduino IDE
- ESP32-WROOM-32 NodeMCU開発ボード
特徴
一度書き込んだファイルはスケッチを書き換えても消えません。
スケッチにバイナリを保存する手間が省けます。
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」をクリックすればアップロード完了です。
BOT