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