こんにちは、ENGかぴです。
ESP32シリーズはFLASHを搭載しており基本的にはプログラム用に使用しますが一部をデータ用で使用することができます。SPIFFSライブラリを使用するとSDカードのようにFLASHにアクセスしてデータの読み書きができます。
ESP32のEEPROMライブラリを使用してデータを管理して動作確認した下記記事の内容をSPIFFSを使って実装します。
ESP32-WROOM-32E開発ボード(秋月電子)を使用しArduino IDEで開発を行います。また、LCDはAQM1602XA-RN-GBW(秋月電子)を使用しています。LCDの使い方については下記記事にまとめています。
Seeeduino XIAOを使ってBME280のデータをLCDに表示する
ESP32-WROOM-32Eで動作確認したことについてリンクをまとめています。
ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方
SPIFFSの使い方
FLASH領域は基本的にプログラム用に使用されますが、すべての領域を使用することはほとんどありません。そのためFLASH領域の一部をデータ用のストレージとして使用することができます。
ESP32シリーズ専用にSPIFFSライブラリが搭載されており、本ライブラリを使用することでArduino環境でSDカードを操作するようなイメージでFLASH領域にデータの読み書きができるようになります。
SPIFFSの初期設定
#include <FS.h>
#include <SPIFFS.h>
String settings = "/flash_dat.txt"; //フラッシュに置くテキストファイル
SPIFFS.begin(); //SPIFFSの初期化
SPIFFSライブラリを使用するためにSPIFFS.hをインクルードします。ファイルを開いて読み書きするためFS.hライブラリもインクルードします。ファイル名はファイルを開く際に文字列として指定してもよいですが、固定のパスとなるため変数で宣言しています。
例では文字列で/flash_dat.txtを宣言し保存するデータのファイルのパスとしています。SPIFFSの初期化を行うためbegin()関数を使用します。
PR:
わからないを放置せず、あなたにあったスキルを身に着けるコツを教える テックジムPython入門講座の申込
FLASHのデータを読み込む
void FfsRead(void){
File fp = SPIFFS.open(settings,"r"); //データを読み込む
if(fp){ //ファイルを開いて以下を処理
for(uint8_t i = 0; i < sizeof(flash_dat); i++){
flash_dat[i] = fp.read();
}
//fp.readBytes((char*)&flash_dat[0], sizeof(flash_dat));
fp.close(); //ファイルを閉じる
}
else{ //ファイルが開けなかった場合
Serial.println("Flash Read error");
//データを読み込めない場合の処理
}
}
SPIFFSを使ってファイルを開くためにopen()関数を使用します。第1引数にはファイルのパスを指定します。第2引数にデータを読み込む場合は”r”を指定します。
ファイルが開けるとフラッシュに保管したデータ分のサイズをread()関数を使用して読み込みます。read()関数の他にも読み込みのための関数が実装されています。読み込んだ後はファイルを閉じるためclose()関数を使用します。
ファイルをあらかじめESP32 Sketch Data Uploadを使ってアップロードしておくことでスケッチ書き込み後に初めて動作させる場合でもデータを読み込ませることもできます。
PR:(即戦力のスキルを身に着ける:DMM WEBCAMP 学習コース(はじめてのプログラミングコース))
FLASHにデータを書き込む
void FfsWrite(void){
File fp = SPIFFS.open(settings,"w");
if( fp ){
fp.write(btncnt);
fp.write(btncnt);
//fp.write( &btncnt, 2);
fp.close();
}
else{
Serial.println("Flash Write Error");
}
}
SPIFFSを使ってファイルを開くためにopen()関数を使用します。第1引数にはファイルのパスを指定します。第2引数にデータを書き込む場合は”w”を指定します。
ファイルを開きwrite()関数を使用して書き込むデータを指定します。例ではbtncntを2バイト分書き込んでいます。コメントアウトで記述している方法でも同じ処理になります。書き込んだ後はファイルを閉じるためにclose()関数を使用します。
ESP32 Sketch Data Uploadでファイルをアップロードする
ESP32-WROOM-32EではESP32 Sketch Data Uploadを使用することでファイルをFLASH領域にアップロードすることができます。ESP32 Sketch Data Uploadを追加する手順についてまとめています。
小規模のデータの格納であれば特にアップロードする必要はありませんが外部のAPIなど規模が大きなライブラリをFLASHに格納したい場合に有効です。
- 手順1SPIFFSのプラグインをダウンロード
- 手順2Arudinoスケッチ保存場所にtoolsフォルダを作成
- 手順3toolsフォルダにダウンロードしたファイルを解凍して移動(コピー)
SPIFFSプラグインをダウンロードしてArduino IDEのツールに「ESP32 Sketch Data Upload」を追加します。
GitHub-arduino-esp32fs-プラグインのダウンロード
ダウンロードしたファイルをArduinoフォルダに追加します。ダウンロードしたファイルを解凍すると「ESP32FS」フォルダが生成されます。Arduinoのスケッチブックの保存場所に指定しているフォルダ内で「tools」フォルダを作成してtoolsファルダー内にESP32FSをコピー(移動)します。

環境設定でスケッチブックの保存場所を確認することができます。初期のままであればドキュメント内のArduinoフォルダが指定されています。例ではC:\WorkSpace\Arduinoを指定しています。

toolsフォルダにESP32FSを追加した後でArduino IDEを起動するとツール欄にESP32 Sketch Data Upload」が追加されます。

ESP32 Sketch Data UploadをクリックするとFlashにデータを書き込むことができますがFlashにデータを書き込む前に書き込むファイルを準備する必要があります。Arduinoファイルが保管されているフォルダに「data」フォルダを作成します。

例ではArduinoファイルが「spiffs」フォルダにあります。このフォルダ内に「data」フォルダを作成しflash_dat.txtファイルを追加しています。
PR:わからないを放置せず、あなたにあったスキルを身に着けるコツを教える テックジム 「書けるが先で、理解が後」を体験しよう!
動作確認

ESP32-WROOM-32EのWire(I2C)をLCDに接続しSW1をDIに接続します。SW1を押した回数をLCD上に表示します。SW1を2秒間長押しすると現在のボタンを押した回数をFLASHに書き込みます。長押しする際もSW1を押した回数がカウントされるためFLASHに書き込む前にカウント値を-1するようにしています。
FLASHへの書き込みが終わる(カウントが-1された後)と電源をOFF(モジュール上のリセットボタンでもよい)します。FLASHに保存されているデータは電源をOFFしても保持されるため次に電源をONしたときにFLASHのデータの確認を行いデータが消えていないことを確認します。

電源をONすると初期画面が2秒表示されます。メイン処理に遷移すると初期化時に読み込んだFLASHのデータを表示します。LCDの1段目に「FLASH DATA READ:10」と表示されているためFLASHのデータが読み出せていることが分かります。
ソースコード全体
ソースコードは記事作成時点において動作確認できていますが、使用しているライブラリの更新により動作が保証できなくなる可能性があります。また、ソースコードを使用したことによって生じた不利益などの一切の責任を負いかねます。参考資料としてお使いください。
リンクからZIPファイル形式のファイルをダウンロードし、任意の場所に展開していただくとテキストファイルが生成されます。
関連リンク
Arduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。
Arduinoで学べるマイコンのソフト開発と標準ライブラリの使い方
Seeeduino XIAOで学べるソフト開発と標準ライブラリの使い方
ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方
PR:わからないを放置せず、あなたにあった最低限のスキルを身に着けるコツを教える テックジム 「書けるが先で、理解が後」を体験しよう!
最後まで、読んでいただきありがとうございました。