【M5】M5StickCでSPIFFS動作実験<書き込み遅い16byte/msec>

M5StickCは、M5StackのようにSDカードを搭載してませんが、数MBのデータなフラッシュメモリー内に記録保存できるシステムが用意されてます。それがSPIFFSです。書き込みが16.6byte/msecと遅いですがSSID等をメモ代わりに使うとか、遅いデータを少しずつログする用途なら便利です。

●SPIFFSを使う目的

M5StickCで作るコロナガジェットで、COCOA端末との接触カウントプログラムが公開されているのですが、表示するだけ接触データをログする機能がありませんので、SPIFFSを利用して接触データをログするためです。

●GITからサンプルプログラムをダウンロード
https://github.com/espressif/arduino-esp32/blob/master/libraries/SPIFFS/examples/SPIFFS_Test/SPIFFS_Test.ino

このプログラムでは、SPIFFSで必要な関数群が用意されていて、それぞれの動作が確認できるようになってます。ESP32用ですが、include  <M5StickC.h> と  M5.begin()の2行追加でM5StickCでも動作します。

関数名
※fs::FS&fsは、スコープ クラスfs内のFS&fsを値として識別
機能
void listDir(fs::FS &fs, const char * dirname, uint8_t levels) Dirのリストを作成してSerial出力
void readFile(fs::FS &fs, const char * path) 指定したファイルを読み込んでSerial出力
void writeFile(fs::FS &fs, const char * path, const char * message) 指定したファイルを書き込む 
データは chara配列のポインタで渡す
void appendFile(fs::FS &fs, const char * path, const char * message) 指定したファイルに追記書き込み
データは、char配列のポインタで渡す。
void renameFile(fs::FS &fs, const char * path1, const char * path2) ファイルのリネーム
void deleteFile(fs::FS &fs, const char * path) ファイルのデリート
void testFileIO(fs::FS &fs, const char * path) 1MBデータのWRITE速度、READ速度測定

1MB読み書き時間7分くらいかかります。

 ●M5StickC動作実験用ソース
GITHUBの
GISTに実験で使ったinoファイルアップしてあります。

①GITサンプルからM5StickC用に変更
https://gist.github.com/dj1711572002/45e814b2ed7cfd6b68d33b16c12ce172

これを走らせると、最後に1MBデータの書き込み時間と読込時間測定機能があります。連続書き込み速度16.6byte/msec 連続読み込み135byte/msec
で書き込みが遅いのはフラッシュの特徴です。大きなデータを一挙に書き込むのではなく小さなデータを少しずつ書き込む用途しか使えません。

②LIST関数の実験
Dir内のファイルをリストする関数も提供されてます。
hello_1.txt ~hello_3.txtまでファイルを書き込んでDIRをLIST

https://gist.github.com/dj1711572002/6ecb99f41ebe7bc15b30bd5abd807a16

③APPEND(追記書き込み)して、READする

https://gist.github.com/dj1711572002/a49968781e9f324b822f5c9361c280a0

millis()データを左ボタンを押して電源を一度オフにして再度電源オンすると、追記されて記録されてます。

●TIPS
①書き込みデータはchar配列に変換する
通常は数値データをログするので、数値をSTRINGにして
書き込みたいところですが、ここで提供されている関数はchar配列を
していますので、Stringをchar配列に変換する処理を関数にしました。
使う命令は .toCharArray()です。
StringのdataSを渡して、char 配列c[]に格納します。
作った関数はstr2char(ターゲットchar配列,変換したいデータString)
※まだバグがあります、関数をつくらないでそのままtoCharArray()を
使ったほうがいいです。

void str2char(char c[],String dataS)
{
//String dataS;
//dataS=”HELLO dataS”;
int dataS_len=dataS.length()+1;
//char char_array[dataS_len];
dataS.toCharArray(c,dataS_len);}

setup()内の呼び出し側では mills()をデータとして書き込む動作を10回繰り替えしてます。

for (j=0;j<10;j++)
{
dataStr=String(millis())+”,”;
str2char(char_array,dataStr);
appendFile(SPIFFS, “/hello.txt”,char_array);
//appendFile(SPIFFS, “/hello.txt”,String(millis())+”\r\n”);
}