ESP32S3 SPIFFSを使った設定値のファイル保存と読み出し

2026.7.9 Coskx Lab  

1 はじめに

マイコンが電源OFFになるとき,それまで使っていた設定値をファイル保存し, 次にマイコンが起動したとき保存しておいた設定値を読み込んで使えるようにします。
このとき使う,ファイルシステムSPIFFSはマイコン内のフラッシュメモリの一部を使うので,SDカードなどは不要です。
フラッシュメモリを使ったファイルシステムなので,1回の起動で一千回も値を書き込むような用途には向きません。
設定値の保存と読み込みの用途なら,問題なく使えるでしょう。


2 使用環境

3 SPIFFSデモプログラム

設定値を想定した2つの変数value1,value2があり,初期値は両方とも0です。
シリアル入力からのコマンドで操作します。コマンドは次の3つです。
wrt 設定値をファイル書き込み
red ファイルから設定値を読み込む
chg 設定値が変化した想定で,設定値を変更
設定値ファイルの名前はsettings.txtで,ファイルの一行の形式は
キーワード+'='+設定値
としています。
設定値の読み込みでは,キーワードと'='を目安に値を読み込んでいます。

PIFFSを使用するには、ファイルシステム領域をパーティション分割し、フォーマットする必要があります。
'SPIFFS.begin()'に'true'を渡すと、フォーマットが既に完了している場合はSPIFFSはすぐに使用可能になります。
フォーマットが完了していない場合は、自動的にフォーマット処理が実行され、その後使用可能になります。
したがって、事前の準備は不要です。

変数がint型なので読み込み時にはtoInt()を使いましたが,変数がDouble型の場合にはtoDouble()を使います。


  SPIFFSデモプログラム

//SPIFFS_Test01.ino

#include "FS.h"
#include "SPIFFS.h"

/*
When using SPIFFS, the file system area must be partitioned and formatted.
If you pass `true` to `SPIFFS.begin()`,
SPIFFS becomes ready for use immediately if the formatting has already been done;
if not, it automatically performs the formatting process and then becomes ready for use.
Therefore, no preparation is required.
*/

#define FORMAT_SPIFFS_IF_FAILED true
const String path = "/settings.txt";
int value1 =0;
int value2 =0;

void readSettings(void) {
  String str;
  str = "Reading file: " + path;
  Serial.println(str);
  File file = SPIFFS.open(path);
  if(!file){
      Serial.println("- failed to open file for reading");
      return;
  }
  str = "";
  while(file.available()){
    char c;
    c = file.read();
    if (isprint(c)) str += c;
    else if (iscntrl(c)) {
      if (str.indexOf("value1") == 0) {
        String str1 = str.substring(str.indexOf("=") + 1);
        value1 = str1.toInt();    
      } else if (str.indexOf("value2") == 0) {
        String str1 = str.substring(str.indexOf("=") + 1);
        value2 = str1.toInt();
      }
      str = "";
    }
  }
  file.close();
}

void writeSettings(void) {
  String str;
  str = "Writing file: " + path;
  Serial.println(str);
  File file = SPIFFS.open(path, FILE_WRITE);
  if(!file){
      Serial.println("- failed to open file for writing");
      return;
  }
  str = "value1 = " + String(value1) + "\r\n";
  str += "value2 = " + String(value2) + "\r\n";
  file.print(str);
  file.close();
}

void setup(){
    Serial.begin(115200);
    delay(1000);
    if(!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)){
        Serial.println("SPIFFS Mount Failed");
        return;
    }
    Serial.println("\n\nSPIFFS_Test01");
    Serial.println("data = " + String(value1) + ", " + String(value2));
    Serial.println("send me 'wrt', 'red', or 'chg'");
}

void loop(){
  if(Serial.available() > 0) {
    String str = Serial.readString();
    str.trim();
    Serial.println("CMD: '" + str + "'");
    if (str.indexOf("wrt") == 0) {
        writeSettings();
        Serial.println("data = " + String(value1) + ", " + String(value2));
    } else if (str.indexOf("red") == 0) {
        readSettings();
        Serial.println("data = " + String(value1) + ", " + String(value2));
    } else if (str.indexOf("chg") == 0) {
        value1++;
        value2--;
        Serial.println("data = " + String(value1) + ", " + String(value2));
    } 
  }
}

6 実行の様子

起動時に2つの設定値はともに0です。 シリアルターミナルから'chg'コマンドを2回与えて,値を変化させて,2つの設定値をそれぞれ2,-2にしました。 そして,'wrt'コマンドを与えて,ファイルsettings.txtに保存しました。 ここで電源をOFFにしてから再起動します。 再起動時でも2つの設定値はともに0です。 'red'コマンドを与えて,ファイルsettings.txtを読み込むと,2つの設定値はそれぞれ2,-2に復元されました。
    SPIFFS_Test01.ino実行時のシリアルターミナル画面

PIFFS_Test01
data = 0, 0
send me 'wrt', 'red', or 'chg'
CMD: 'chg'
data = 1, -1
CMD: 'chg'
data = 2, -2
CMD: 'wrt'
Writing file: /settings.txt
data = 2, -2


SPIFFS_Test01
data = 0, 0
send me 'wrt', 'red', or 'chg'
CMD: 'red'
Reading file: /settings.txt
data = 2, -2

7 まとめ


ファイルに設定値を保存し,マイコンを再起動した後,ファイル読み込みをすれば,設定値が復元されるデモプログラムを作成しました。