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”); } |
※2021年1月追記
SPIFFS プログラム改良してます。キーボード入力で、ファイルを書いたり読んだり、消したりできるようにしました。