※まず、事の発端をグダグダと書く(読み飛ばして本題へ)。
ESP8266で観測データを収集してOrange Pi上のサーバに送信している。
バッテリ駆動のものもいくつかあって、電池切れ対策をいろいろやっている。
以前は電源電圧を送信して下がってきたら交換ということにしていた。
最近、レギュレータを入れて定電圧で駆動するようになったので、当然電源電圧のチェックは無意味になった。
測定データを見て途切れてたら電池交換という、何とも原始的、場当たり的なことになっている。
レギュレータに入る前の電池の電圧をモニターすればいいが、ESP8266のADCは1Vが上限で最低でも分圧回路が必要になる。
サーバー上のファイルの更新日時をチェックできれば、測定が行われていないことが逐一わかり、今よりはましになるかもと思った。
ERSP8266はストックがいくつもあるからハード的には問題はなく、あとはソフトウェアの話となる。
そもそも、観測データの処理はサーバ上に置いたPHPファイルを呼び出して行っている。
なので、今回もPHPでやることにする。
このPHPファイルは人様の見よう見まねで作ったものなので、実は長く使ってはいても完全には理解していない。
今回も見よう見まねだ。
※ここから本題。
とりあえず、こんなものをftimeget.phpとしてサーバーにアップしてブラウザから呼んでみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php $fname = $_GET["fname"]; $updateDate = ""; date_default_timezone_set('Asia/Tokyo'); if (file_exists($fname)) { $updateDate = filemtime($fname); $updateDate = date("Y-m-d H:i:s", $updateDate); echo $updateDate, "\r\n"; }else{ echo $fname; } |
http://192.168.###.###/ftimeget.php?fname=test.php
などとする。
試しなので「test.php」はサーバ上にあるファイルなら何でもいい。
以下のようにちゃんとファイル(test.php)の作成日時が表示される。
すでに忘れていたPHPのコマンドをいくつか覚書きしておく。
?fname= としてファイル名を渡す。
phpの以下の部分でそれを受け取る。
$fname = $_GET[“fname”];
タイムゾーンを設定する。
date_default_timezone_set(‘Asia/Tokyo’);
ファイル($fname)の更新日時(UNIXタイムスタンプ値)を得る。
filemtime($fname);
日時の書式を変換する。
date(“Y-m-d H:i:s”, UNIXタイムスタンプ値);
これで済めば話は終わりだが、ESP8266で読み込むとこんな感じになる。
分かりやすいように「1——————–」と「2——————–」を入れた。
この間、下の赤枠部分が出力される。
要するに、必要なもの以外にもたくさん送られてくる。
ブラウザ側で処理されて、ブラウザでは必要なものだけ表示されるが、ESP8266で丸々読み込むとこうなるということ。
もっと厳密にいえば、改行コードとかも送られてくるので以下のようになる。
上はTeraTermのデバッグモードをONにして表示したもので$0A=^J、$0D=^Mとなっている。
さて、どうやって必要な行だけを取り出すか。
どうやら、こちらで意図した出力は一番最後に行われるようだ。
なので、単純に最終行だけを取っておけばいいと思うので下のようにした。
終端コードまでの1行を送られてくる分だけどんどん読み続ける。
それをその度にDateTimeに代入する。
最終的にDateTimeに入っているものが最終行ということになる。
これを、あらためて配列にでも保存しておいて前回のものと比較すればいいわけだ。
とりあえず、上のように6つのファイルのタイムスタンプを監視できるようにした。
時刻が前回と変わっていれば赤線のようにそれを表示する。
Sleepで眠らせておいて数分おきにチェックすればいいだろうと思う。
結局、「外でバッテリー駆動の ESP-WROOM-02 + Si7021 から電圧低下の通知を受け取る。」でやった方法で、別のモニター用のESP8266モジュールに通知することにした。
Tweet