例のESP-WROOM-02(ESP8266)に突如アクセス不能になる件。
事象は1週間で発生したり、2日で発生したりと規則性がない。
内部からWi-Fiのコネクションを確認して、切れていたら再接続 って処理を加えたけど
どうやらそのルートは通っていない模様。
試しにログを仕込んでみたけど、それに気づいた(?)のか1週間経っても事象は発生せず。
謎だ。
トラブル対処でもの凄く面倒な問題の1つ。
シリアルでログを出す
ログをESP8266内のファイルシステムに出力すれば後から確認できるけど
フラッシュメモリな上に1MBと容量が少ないため、シリアルで繋いでそこから読み取ることにした。
ファイルシステムに出力すると、それを取得して表示するスケッチを作らなきゃならんので面倒。
出力方法は簡単。
これを要所要所に入れていくだけ。
要所な場所はこれで良いけど、問題が1つある。
定期的に(例えば1時間ごとに)どう出力するよ という話。
基本的にArduino系のモノはvoid loop()の中でグリグリ回して、
その中で処理を組んで、入出力値を得たり表示したりする。
1時間ごとにログを出力したい となった場合、
server.handleClient(); // Webサーバとしてリクエストが来るのを待っている
Serial.println("hogehoge");
delay(3600000); // 指定は1msなので1000*60*60
}
こんなことをしちゃうと大変なことになる。
delayで待っている間は当然処理は動かない。
ブラウザから繋ぎに行っても止まっているので、最大1時間待たされるわけだw
ログ出力だけ別スレッドで・・・なんて思っても、コイツ(ESP8266)はシングルスレッド。
割り込み処理を組み込んだり色々手はあるけど・・・使い方がパッと見でわからなかったり
良いと思えるのがPlatformIO用だったり(ここで開発環境をPlatformIOにした のと繋がる)
面倒だなぁ・・・。
それっぽい情報をググりながら徘徊した結果、原始的だけど簡単な方法を思いつく。
millis()
という関数があって、起動時からのミリ秒を取得することができる。
返却値の型はunsigned long。
これ見ると「うわー、Cだなぁ」と実感(正直慣れない)
最近、AutoHotkeyだったりRainmeterだったりArduinoを触っているので
頭の中で凄ぇゴッチャになってるw
#define LOG_INTERVAL 10800000
・
・
・
void hogeFunc() {
//処理と一緒にログを出力してたりする関数
Serial.print("hogehoge");
}
・
・
・
void loop(void) {
server.handleClient();
now_millis = millis();
if (now_millis % LOG_INTERVAL == 0) {
hogeFunc(); //ログ出力をしている関数
delay(5); //1ms以内で処理が終わるとは思えないけどちょっとだけ待っておく
}
}
ああ、原始的。
実際には時間も出したいのでtime
関数も使っている。
ググると沢山引っかかる。しかもみんな同じ書き方w
これを起動させて放置。時々VSCでログを確認。
で、再現しなかった。_(´ཀ`」 ∠)_