title.png


第9回 気温・湿度のログを取る(後編、最終回)

 前回空かしてしまったのですが、Olive+でArduinoと通信して気温・湿度を取得し、ログを取るところまで到達したいと思います。

Olive+を使って、気温・湿度のログを取る

 「第7回 AM2302の制御手順を仕上げる」でArduino側の制御プログラム(meas_am2302.ino)が完成しています。前回の「第8回 気温・湿度のログを取る」で、Windows側の制御スクリプトを組むOlive+の拡張も済んでいますので、Olive+を使ってArduinoからデータを取得するのは、以下の様になります。

  Olive+スクリプト:
  var nbuf;
  macro lbuf;
  serialmon open, "COM3";
  serialmon write, "rrt";
  // データを受信するまでポーリング
  repeat
  {
    serialmon read, lbuf,nbuf;
  } until (nbuf>=0);
  serialmon close, 0;


 後は、date命令で現在日時を取得して、fopen命令の追記モード"a"で適切なファイルに出力したらログ取得終了です。

Webから天気予報のデータを取得する

 ここまでは、RTCとSDカードI/Fなどを接続したArduino単体でも可能なことです。PCを使って、データを取得し、ログを取るので、更に一歩進めてみましょう。

 「Webデータをダウンロードして、スクリプト処理する」をご覧ください。Olive+を使って、Web上のお天気サイトから、ピンポイント天気予報をダウンロードして、活用するサンプルが解説してあります。
 ピンポイント天気予報には、天気の他、気温、湿度、降水量、風向き、などのデータが含まれており、しかも、3時間刻みの解像度で取得することが可能です。

  「予報では外気温が○○℃くらいだった時に、室内は□□℃だった」
  「雨が降っていて、外の湿度が○○%RHだった時、室内の湿度は□□%RHだった」

 などの情報が関連して取得できるのは、興味深いです。
 さらに、夏場など、日が暮れて外気温が下がってくると、実はエアコンを使うより、外の空気を取り込んだ方が気持ちの良い時があります(夜になっても気温が下がらない熱帯夜はダメですけど……)。しかし、一度エアコンを使ってしまうと、外気温がどのくらいになっているのかわからないため、そのままエアコンを使い続けてしまうことが多いかと思います。
 このようなケース(夏場に限らず、他にも、季節の変わり目でありがちです)で、室内の気温・湿度データと、天気予報の気温・湿度データがセットで閲覧できると、暮らしやすくなるかもしれません。

 ちなみに、「Webデータをダウンロードして、スクリプト処理する」のサンプルとしてご紹介した、「Yahoo!お天気」では、2時間毎に天気予報の発表がありますので、朝一番でダウンロードした予報と、夕方過ぎにダウンロードした予報では、内容が異なります。よって、Olive+とArduinoを使って、室内の気温・湿度を測定する時に、セットで最新の天気予報をWebから取得し、ログに残すべきと考えました。

ログの形式

 ログファイルは、Excelなどで読み込むのも容易な、カンマ(,)区切りのテキストファイル、CSVファイルとします。ファイルには、1回1行で、次のデータをすべてカンマ(,)で区切って記録します。

 一時的にWebに接続できなかった場合、Arduinoからエラーが返った場合等には、ログにエラーが記録されます。

計測結果の表示

 一定時間毎に、気温・湿度データをログに残すだけではなく、測定した気温・湿度データをグラフィカルに確認できた方が有用なケースも考えられるため、測定データを表示することにします。

ar9_disp.png

 乾湿計っぽいデザインにしていますが、湿度が直読みできるスケールになっています。
 気温・湿度計のグラフィックにメインで表示されているのは、Arduino+AM2302で取得した、室温と(室内)湿度のデータです。その外側に、細い赤と青線で引いたのが天気予報の気温と(外気)湿度で、対比しやすいようにして見ました。

 ただ、このようなウインドウが表示されると邪魔な場合もあると思いますので、スクリプトの最後で以下の命令を使い分けてください。

  ウインドウを残す場合:leave stop_error;
  実行後、Olive+を終了する場合:exit 0;

自動処理専用マシンのご紹介

 すべての準備が完了しました。

 Arduinoで実行するプログラム:meas_am2302.ino
 定期的にログを取るスクリプト:meas_am2302.olv

 Arduino IDEを使って、meas_am2302.inoをArduinoへ転送しておきます。
 筆者が自動処理専用に使っている小型PCにスクリプトとOlive+をインストールしました。

 ちなみに、自動処理専用に使用している小型PCのスペックは以下です。

  PC : サードウェーブデジノスCANPC(Atom x7-Z8700 @1.60GHz、メモリ4Gバイト)
  OS : Windows 10 Home(x64)

 細身の缶コーヒーくらいのサイズで、バッテリ内蔵なので、停電してもしばらく動作することが可能です。USBから電源をもらうArduinoも動作できるはずです。
 停電している間にログ取得スクリプトが起動すると、Webからの天気情報取得は失敗します(停電で筆者宅のネットワークがダウンするため)が、室内の気温・湿度は計測して、ログに残すことができます。内蔵バッテリで、そんなに長い時間の動作は無理なので、落雷などの瞬停や短い時間の停電から復帰を待つ間くらいに限られるでしょう。一応、スペック上は6時間動作可能らしいです……。ノートPCではないのに、バッテリ内蔵なんて面白いですよね。
 このPC、残念なことに、低消費電力状態がサポートされておらず、スリープできません。スリープできれば、拙作iConClockで、設定した稼働時間だけ起動して、自動的にスリープ状態に移行、また次の日の稼働時間に自動的に復帰する、という使い方ができるのですが……。手動で、朝起きたら起動、夜寝る前にシャットダウン、しています。

 こちらのPCには、Arduino IDEをインストールしなかったのですが、ArduinoをいきなりUSBポートに繋いだところ、何事もなく、COMポートに現れました。筆者が購入した機体は互換機でしたが、USBチップにはAtmelのATmega16U2が載っていました。環境によっては、ドライバのインストールが必要になるかもしれません。

 iConClockがインストールしてあったので、「一時間毎の01分」に、気温・湿度取得スクリプトmeas_am2302.olvを実行するアラームを設定しました。

Windows update問題

 こういう使い方のPCでは、Windows updateが勝手にリセットかけるのは、絶対に許されません。

 従って、フリーソフトウェアの力を借りて、Windows updateプロセスを殺して使っています。ほぼ一日中、自動処理させるPCが、勝手にリセットされたら困るので。

 なにも、updateしたくない訳ではないのですよ。どちらかと言えば、ちゃんとupdateして、健全な状態で使用したい方の部類に属しています。しかし、勝手にupdateかけて、勝手にリセットし、何事も無かったように平然とログイン画面を表示できる神経が理解できません。
 嫌がらせの様に、「有無を言わさずupdateさせよう」とするWindowsの機能が裏目に出て、結局、ユーザにプロセスを殺すという暴挙に走らせているとは、ザマぁない。オーナ(ユーザ)の許可も得ず、勝手なことをしようとした報いです。
  Windows 8まで採用されていた、「アップデートがあります。インストールしてください」って、静かに教えてくれるくらいの方が有り難い。起動の度にでっかいウインドウが出て、消さなきゃならないのはムカつくけど、タスクトレイに静かに表示するくらいで十分でした。

 マイクロソフトによるこれらの迷惑行為は、断固拒否致します。

ログ取得結果

 前節に示した方法で、24時間ログを取った結果がこちら↓。

  実行結果(ログファイル):meas_am2302.csv

 Excelに読み込ませて、グラフを作ってみました。

ar9_graph.png

 暖色系(赤と橙)が湿度、緑系(緑と黄緑)が気温にしてあります。色の濃い方(赤、緑)がArduino+AM2302で測定した室温・(室内)湿度、色の薄い方(橙、黄緑)が予報の気温・(外気)湿度です。降水量(水色)もプロットしてありますが、この日は降水なしでした。予報の気温や湿度の方は、結構変化していますが、さすがに部屋の中は安定しているようです。それでも、緩やかな相関は見えますね。

ゴール♪

 いかがでしたか?「Arduinoを使った電子工作の部屋」で立てた目標、「部屋の気温と湿度のログを自動取得する」に、関しては、見事、ゴ〜〜〜〜ル♪と、言うことでどうでしょう?
 個人的には、良いおもちゃに出会ってしまったので、また別なテーマを見つけて挑戦するかも?ですが、今回の様に書き物で残すかどうかは未定です。

 めでたく、このシリーズは今回で最終回です。お付き合いありがとうございました。


btn_arduino.png

btn_prev.png btn_next.png

home