M5StickC
前回、ENV II HATのスケッチを見て、気温、湿度、気圧、磁気の取得の仕方を勉強してみました。
今回は取得したデータをM5StickC内に保存する方法を勉強していきたいと思います。
データを保存するにはSDカードなどを接続してその中に保存するのが楽そうなのではありますが、実はENV II HATを使って取得したデータを保存したいため、HATの端子は使えない状態にあります。
ということで何とかしてM5StickC内部にデータを保存したいなと思ったわけです。
そこで調べてみたところ、プログラムを書き込む領域を区切って、データを保存するための領域を確保するSPIFFSなるものがあるらしいことがわかりました。
そしてそのスケッチ例もArduinoにあるので、ちょっと見て勉強してみましょう。
スケッチの場所は「ファイル > スケッチ例 > M5StickC > Advanced > Storage > SPIFFS」です。
この中に「SPIFFS」、「SPIFFS_Add」、「SPIFFS_Delete」の3つのスケッチ例があります。
「SPIFFS_Add」がSPIFFSのデータ保存領域を作成するためのスケッチ、「SPIFFS」が実際に書き込むためのスケッチ、そして「SPIFFS_Delete」が作成したデータ保存領域を削除するためのスケッチです。
今回は何はともあれデータ保存領域を作成しなければ始まらないので「SPIFFS_Add」のスケッチを見てみましょう。
そして次回、書き込むための「SPIFFS」のスケッチ、そしてその後に「SPIFFS_Delete」と3回に分けてみていくことにします。
それでは始めましょう。
プログラム全体
まずはコメント部分を省いたプログラム全体を見ていきましょう。
#include <M5StickC.h>
#include <SPIFFS.h>
String file_name = "/M5Stack/notes.txt";
bool SPIFFS_FORMAT = true;
void setup() {
M5.begin(); //Init M5StickC. 初始化 M5StickC
M5.Lcd.setRotation(3); //Rotate the screen. 旋转屏幕
if(SPIFFS_FORMAT){
M5.Lcd.println("\nSPIFFS format start..."); //Screen prints format String. 屏幕打印格式化字符串
SPIFFS.format(); // Formatting SPIFFS. 格式化SPIFFS
M5.Lcd.println("SPIFFS format finish");
}
if(SPIFFS.begin()){ // Start SPIFFS, return 1 on success. 启动闪存文件系统,若成功返回1
M5.Lcd.println("\nSPIFFS Started.");
} else {
M5.Lcd.println("SPIFFS Failed to Start.");
}
if (SPIFFS.exists(file_name)){ //Check whether the file_name file exists in the flash memory. 确认闪存中是否有file_name文件
M5.Lcd.println("FOUND.");
M5.Lcd.println(file_name);
File dataFile = SPIFFS.open(file_name, "a"); // Create a File object dafaFile to add information to file_name in the SPIFFS. 建立File对象dafaFile用于向SPIFFS中的file_name添加信息
dataFile.println("This is Appended Info."); // Adds string information to dataFile. 向dataFile添加字符串信息
dataFile.close(); // Close the file when writing is complete. 完成写入后关闭文件
M5.Lcd.println("Finished Appending data to SPIFFS");
}else {
M5.Lcd.println("NOT FOUND.");
M5.Lcd.print(file_name);
M5.Lcd.println("is creating.");
File dataFile = SPIFFS.open(file_name, "w"); // Create aFile object dafaFile to write information to file_name in the SPIFFS. 建立File对象dafaFile用于向SPIFFS中的file_name写入信息
dataFile.close(); // Close the file when writing is complete. 完成写入后关闭文件
M5.Lcd.println("Please disable format and Reupload");
}
}
void loop() {
}
初期設定部分
まずは初期設定部分としてこの部分を見ていきます。
#include <M5StickC.h>
#include <SPIFFS.h>
String file_name = "/M5Stack/notes.txt";
bool SPIFFS_FORMAT = true;
今回はSPIFFSを使用すると言うことで、そのヘッダーファイル「SPIFFS.h」をインクルードしています。
そして「String file_name = “/M5Stack/notes.txt”;」でファイル名の定義を、「bool SPIFFS_FORMAT = true;」でSPIFFS_FORMATの値を「true」に定義しています。
これらの値は後ほどまた出てきますので、頭の片隅に入れておいてください。
SPIFFSのフォーマット部分
今回のプログラムは「setup関数」 だけで「loop関数」は空欄になっています。
ということで「setup関数」を順に見ていきましょう。
そして最初に出てくるのが、今回の目的であるSPIFFSのデータ領域のフォーマットからです。
M5.begin(); //Init M5StickC. 初始化 M5StickC
M5.Lcd.setRotation(3); //Rotate the screen. 旋转屏幕
if(SPIFFS_FORMAT){
M5.Lcd.println("\nSPIFFS format start..."); //Screen prints format String. 屏幕打印格式化字符串
SPIFFS.format(); // Formatting SPIFFS. 格式化SPIFFS
M5.Lcd.println("SPIFFS format finish");
}
if(SPIFFS.begin()){ // Start SPIFFS, return 1 on success. 启动闪存文件系统,若成功返回1
M5.Lcd.println("\nSPIFFS Started.");
} else {
M5.Lcd.println("SPIFFS Failed to Start.");
}
「M5.begin();」はM5StickCのイニシャライズ、「M5.Lcd.setRotation(3);」は画面の向きの変更(横向き)でした。
そしてこの部分で設定部分で出てきた「SPIFFS_FORMAT」の値を読み取り、trueの場合は「SPIFFS.format();」でフォーマットすると言う流れです。
if(SPIFFS_FORMAT){
M5.Lcd.println("\nSPIFFS format start..."); //Screen prints format String. 屏幕打印格式化字符串
SPIFFS.format(); // Formatting SPIFFS. 格式化SPIFFS
M5.Lcd.println("SPIFFS format finish");
}
この書き方をみるとif文ではbool値(trueとfalse)で「ture」の場合を選択する場合は、「if(bool値を出力する関数){}」で条件分岐できるようです。
他人のプログラムを読むと勉強になりますね。
次にSPIFFS領域をイニシャライズして正常に動作した場合は「SPIFFS Started.」を、エラーの場合は「SPIFFS Failed to Start.」を画面に出力します。
if(SPIFFS.begin()){ // Start SPIFFS, return 1 on success. 启动闪存文件系统,若成功返回1
M5.Lcd.println("\nSPIFFS Started.");
} else {
M5.Lcd.println("SPIFFS Failed to Start.");
}
こちらもbool値での条件分岐かと思いましたが、コメントによればこちらは返り値が「1」になる場合が「true」と扱われているようです。
ここまででSPIFFSのフォーマット、イニシャライズが行われています。
ファイルが存在する場合+書き込み
次にファイルの存在を確認し、ファイルが存在している場合は書き込み、ファイルがない場合はファイルを作成しています。
まずはファイルがあった場合のプログラムを見ていきましょう。
if (SPIFFS.exists(file_name)){ //Check whether the file_name file exists in the flash memory. 确认闪存中是否有file_name文件
M5.Lcd.println("FOUND.");
M5.Lcd.println(file_name);
File dataFile = SPIFFS.open(file_name, "a"); // Create a File object dafaFile to add information to file_name in the SPIFFS. 建立File对象dafaFile用于向SPIFFS中的file_name添加信息
dataFile.println("This is Appended Info."); // Adds string information to dataFile. 向dataFile添加字符串信息
dataFile.close(); // Close the file when writing is complete. 完成写入后关闭文件
M5.Lcd.println("Finished Appending data to SPIFFS");
}
「if (SPIFFS.exists(file_name))」で設定部分で定義したfile_nameのファイルが存在しているか確認し、存在している場合は「FOUND.」とファイル名を出力します。
そして「File dataFile = SPIFFS.open(file_name, “a”);」でSPIFFSのファイルを「aモード」、つまり追記モードで開きます。
ここで「dataFile.println(“This is Appended Info.”);」と、println関数を用いていますが、これは画面に表示するためではなく、SPIFFSのファイルに書き込むためのコマンドです。
書き込んだ後は「dataFile.close();」でファイルを閉じています。
ファイルが存在しない場合+ファイル作成
次にファイルが存在しない場合の条件分岐でファイルの作成をしている部分を見ていきましょう。
ちなみに「else」で始まっていますが、先ほどのファイルの存在の有無の条件分岐の続きです。
else {
M5.Lcd.println("NOT FOUND.");
M5.Lcd.print(file_name);
M5.Lcd.println("is creating.");
File dataFile = SPIFFS.open(file_name, "w"); // Create aFile object dafaFile to write information to file_name in the SPIFFS. 建立File对象dafaFile用于向SPIFFS中的file_name写入信息
dataFile.close(); // Close the file when writing is complete. 完成写入后关闭文件
M5.Lcd.println("Please disable format and Reupload");
}
ファイルがない場合は「NOT FOUND.」とファイル名、さらに「is creating.」を表示します。
そして「File dataFile = SPIFFS.open(file_name, “w”);」でファイルを作成し、「dataFile.close();」で閉じています。
こちらの場合は何も書き込みをしていないようです。
最初このスケッチを見たときは、なんだこりゃ難しいなと思ったのですが、誤解を恐れずものすごく単純に言うと、「SPIFFS.format();」でSPIFFSのフォーマット、「SPIFFS.begin()」でSPIFFSのイニシャライズ、「SPIFFS.open(ファイル名)」でファイルを開き、「ファイルの変数名.println(“内容”)」で書き込み、「ファイルの変数名.close()」でファイルを閉じる、これだけ。
ぱっと見で判断するんじゃなくて、中身をじっくり見ていくことも結構大事なことだなと思った一件でした。
今回、ファイルの書き込みも出てきていましたが、せっかくなので次回は「SPIFFS」のスケッチを見ていきましょう。
ではでは今回はこんな感じで。
コメント