ESP32[8] フラッシュメモリのへ書き込み

ESP32は内部にユーザー書込みができるフラッシュメモリを持っています。フラッシュメモリは不揮発メモリなので、電源を落としても消えないことから、初期値などをここに書き込むことで、ユーザビリティーが向上します。

以下のヘッダファイルを追加してください。

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

SPIFFS.begin(true);
  char buf[BUF_SIZE + 1];
  /* Read data from Flash memory.*/
  if (1) {
    File    fp = SPIFFS.open("/TEST.TXT", FILE_READ); // 読み取り
    if (!fp) Serial.println("Read Open file err");
    while (fp.read((uint8_t *)buf, BUF_SIZE) == BUF_SIZE)
      Serial.print(buf);
    fp.close();

    sscanf(buf, "%d %d %d %d %d %d %d %d %d %d",
           &f_mode,
           &brake_day_on_brightness,
           &brake_night_on_brightness,
           &flasher_day_on_brightness,
           &flasher_night_on_brightness,
           &brake_day_off_brightness,
           &brake_night_off_brightness,
           &flasher_day_off_brightness,
           &flasher_night_off_brightness,
           &seq_led_interval
          );

 /* CREATE FILE */
    File fp = SPIFFS.open("/TEST.TXT", FILE_WRITE); // 書き込み、存在すれば上書き
    if (!fp) Serial.println("Write Open file err");

    //  String s = "The quick brown fox jumps over the lazy dog.\r\n";
    //  s.toCharArray(buf, BUF_SIZE);
    sprintf(buf, "%d %d% d% d% d% d% d% d% d% d% %d\n",
            f_mode,
            brake_day_on_brightness,
            brake_night_on_brightness,
            flasher_day_on_brightness,
            flasher_night_on_brightness,
            brake_day_off_brightness,
            brake_night_off_brightness,
            flasher_day_off_brightness,
            flasher_night_off_brightness,
            seq_led_interval);

    for (int i = 0; i < 1; i++)
      fp.write((uint8_t *)buf, BUF_SIZE);
    fp.close();

  }
  SPIFFS.end();

普通のファイル操作と同じに扱えます。操作を誤るとゴミファイルが書き込まれてしまうので、その時のために、以下のようなスケッチを用意しておくといいです。

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

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

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();
  }
}

void setup() {
  // put your setup code here, to run once:

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

  }

  Serial.printf("dir\n");
  listDir(SPIFFS, "/", 0); // まずは、どんなファイルがあるか確認し、以下のような行を追加
 /* 
  SPIFFS.remove("/b_mode_value.txt");   //消したいファイルを消す。
  SPIFFS.remove("/b_int_blink_value.txt");
  SPIFFS.remove("/f_int_flow_value.txt");
  SPIFFS.remove("/f_mode_value.txt");
  SPIFFS.remove("/hi_intens_value.txt");
  SPIFFS.remove("/low_intens_value.txt");
  SPIFFS.remove("/mid_intens_value.txt");
*/  

  Serial.printf("dir\n");
  listDir(SPIFFS, "/", 0);        //消えたか再確認
}

void loop() {
}