【遠リセBOX】(20) -アクセス不能事象の調査(2)-

例のESP-WROOM-02(ESP8266)に突如アクセス不能になる件。

 

【遠リセBOX】(18) -繋がらない 4-

 

 

 

事象は1週間で発生したり、2日で発生したりと規則性がない。

内部からWi-Fiのコネクションを確認して、切れていたら再接続 って処理を加えたけど

どうやらそのルートは通っていない模様。

 

試しにログを仕込んでみたけど、それに気づいた(?)のか1週間経っても事象は発生せず。

 

【遠リセBOX】(19) -アクセス不能事象の調査-

謎だ。

トラブル対処でもの凄く面倒な問題の1つ。

 

 

シリアルでログを出す

 

ログをESP8266内のファイルシステムに出力すれば後から確認できるけど

フラッシュメモリな上に1MBと容量が少ないため、シリアルで繋いでそこから読み取ることにした。

ファイルシステムに出力すると、それを取得して表示するスケッチを作らなきゃならんので面倒。

 

出力方法は簡単。

Serial.println("なんか文字列");

これを要所要所に入れていくだけ。

 

要所な場所はこれで良いけど、問題が1つある。

定期的に(例えば1時間ごとに)どう出力するよ という話。

 

基本的にArduino系のモノはvoid loop()の中でグリグリ回して、

その中で処理を組んで、入出力値を得たり表示したりする。

 

 

1時間ごとにログを出力したい となった場合、

void loop(){
 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

 

unsigned long now_millis;
#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でログを確認。

で、再現しなかった。_(´ཀ`」 ∠)_

 

カテゴリー: Arduino系, PC, ソフトウェア タグ: , ,  [パーマリンク]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です