Raspberry PiでIoT機器を作るときは、動作中に何が起こっているかを後で知るために普通に動作ログをファイルに残すようにすると思います。
今回はESP8266でも動作ログを後で確認できるようにするプログラムにチャレンジしてみます。
ログを表示する方法
ESP8266にはSPIFFSというファイルシステムが用意されていて、ファイルの作成や書き込み・読み込みをCライクに行うことができます。
しかし、ESP8266の場合はプログラムがOS上で動作している訳ではないので、ログをファイルに残したとしても、そのファイルを表示する手段が用意されていません。そのため、本来の仕事を行うプログラムの他にログを表示するプログラムを用意して、そのプログラムを実行するきっかけ(トリガ)を組み込むようにします。
動作モードの定義
本来の仕事を行うプログラムとログを表示するプログラムに動作モードを割り当てます。
const byte MODE_MAINTENANCE = 0; // メンテナンスモード
const byte MODE_NORMAL = 1; // 通常モード
byte run_mode; // 動作モード用グローバル変数
動作モードの切り替え
setup()でWiFi接続にかかる時間を利用して、WiFi接続中にファンクションボタンが押されたらメンテナンスモードに切り替えて、ログファイルを表示するようにしました。
WiFi.begin("ssid", "password"); // WiFi接続開始
Serial.print("Waiting for Wi-Fi connection");
while (WiFi.status() != WL_CONNECTED) { // 接続が完了するまでループ
if (digitalRead(FUNC_PIN) == LOW) {
Serial.println("\nMaintenance Mode!");
run_mode = MODE_MAINTENANCE; // メンテナンスモードに切り替え
printLog(); // ログ表示に用意した関数
return;
}
delay(500); // 500ミリ秒待つ
Serial.print(".");
}
メインループ
loop()では動作モードによってメンテナンス用プログラムと通常用のプログラムを切り替えます。
void loop() {
if (run_mode == MODE_MAINTENANCE) {
loopMaintenance(); // メンテナンス用プログラム
} else {
loopNormal(); // 通常用プログラム
}
}
メンテナンス用プログラム
setup()でファンクションボタンが押されたら、ログファイルの内容を表示してこのループが実行されます。誤ってファイルを消さないようにループの初めで5秒待つようにしています。
void loopMaintenance() {
delay(5000); // 5秒待つ
if (digitalRead(FUNC_PIN) == LOW) { // ボタンが押されたら
if (SPIFFS.remove(LOG_FILE_NAME)) { // ログファイルの削除
Serial.println("The log file removed!");
}
}
}
通常のプログラムに戻るにはリセットボタンを押します。
このプログラムでは以下の操作を行うためにファイルシステムを使用しています。
- SPIFFのマウント
- ファイル内容の表示
- ファイルへの文字列の書き込み
- ファイルの削除
SPIFFのマウント
ESP8266でファイルシステムを使用するには、最初にSPIFFSをマウントするメソッドを実行します。
SPIFFS.begin(); // SPIFFSのマウント
初めてこのメソッドを実行した時だけ実行に少し時間がかかりますが(数秒)、次回以降は時間がかからなくなります。
ファイル内容の表示
File f = SPIFFS.open(LOG_FILE_NAME, "r"); // 読み込みモードでオープン
while (f.available()) { // 未読文字がなくなるまでループ
Serial.write(f.read()); // 1文字読み込んで表示
}
f.close(); // ファイルクローズ
ファイルへの文字列の書き込み
File f = SPIFFS.open(LOG_FILE_NAME, "a"); // 追記モードでオープン
f.println("書き込む内容"); // 文字列の書き込み
f.close(); // ファイルクローズ
Fileオブジェクトの操作にはprintlnやStreamメソッドが使用できます。
ファイルの削除
SPIFFS.remove(LOG_FILE_NAME); // ファイルの削除
スケッチのダウンロード
ココからフルスケッチをダウンロードできます。
2017/5/11追記:アップロードしていたファイルの文字コードがSJISになっていたのをUTF-8に変更しました。
スケッチの実行例
スケッチ実行時のモニター表示例です。
ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v09f0c112
~ld
Waiting for Wi-Fi connection...
Maintenance Mode!
===== The log file Start! =====
Reset Reason: External System
count 0
count 1
count 2
count 3
===== The log file End! =====
Push function button long if you want to remove the log file.
The log file removed!