Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

enebular x obnizで換気状況を可視化してみる

これはenebular Advent Calendar 2020 8日目の記事です

今年はnode RED のobnizノードがパワーアップしたので、それを使ってちょっとしたものを作ってみました。

作ったもの

スクリーンショット 2020-12-01 20.13.01.png

  • 部屋の内側と、ベランダに温度計をおいて気温差分を計測
  • 部屋の中で二酸化炭素濃度を計測して、ベストな換気タイミングを確認

空気が悪くなってきたなとおもったら、二酸化炭素濃度を確認して、そのあと温度差を見ることで 気合を入れてから 窓を開けることができます。

冬の窓を開けるには気合が必要ですからね。

きっかけ

コロナで換気が重要だ!ってことで最近二酸化炭素濃度を計測しましょうみたいな話をよく聞くようになりました。
せっかくなので作ってみよう!と思って作ってみました。

作ったハードウェア

  • 家の中用 スクリーンショット 2020-12-08 16.29.52.png

温度センサをobnizに挿して、二酸化炭素センサをobnizの横においています。
二酸化炭素センサはBLE通信のため、物理的な接続はしていません、

obnizパーツライブラリにあるこれらをチョイス
Loggta CO2
LM35DZ

  • ベランダ用 スクリーンショット 2020-12-08 16.29.57.png

ベランダでは電源が取れなかったのでモバイルバッテリーで代用しています。

温度センサは室内用と同じで良かったんですが、2個めが手元になかったのでこちらをチョイス
Keyestudio_TemperatureSensor

電子基板がベランダにあるってだけで違和感抜群ですね笑

プログラム

enebular上のノードはこんな感じです。
スクリーンショット 2020-12-01 18.17.25.png

一番上がCO2に関するもの、
2段目が室内用の温度センサに関するもの、
一番下はベランダの温度センサに関するものです。

obnizノードの使い方はこちらの記事に任せるとします。

ここではこのプログラムの書きます。

まず、外のプログラムから書くと、初期化処理で温度センサを初期化しています

スクリーンショット 2020-12-08 17.00.20.png

obniz-functionノードの中ではパーツライブラリのgetWaitのみを使用しています。
スクリーンショット 2020-12-08 17.01.04.png

時間のタイミング等も書いていませんが、それはinjectionノードの役割として、そちらで設定しています。

スクリーンショット 2020-12-08 17.02.29.png

これで温度のグラフ化ができるので、同じように室内用温度センサも作ります。

さて、室内二酸化炭素のセンサも同じようにwiredして・・・と書きたかったのですが、BLE系のセンサはBLEスキャンをしないとパーツライブラリが使えないという制約がありますので、全てfunctionノードの中でやることにしました。

こんなかんじですね
スクリーンショット 2020-12-08 17.04.18.png

node.send({debug:"start"})
  //対策
  if(obnizParts.block === true){
    return {debug:"none"};
  }
  obnizParts.block = true;

  try {

    node.send({debug:"loop"})
    const LOGTTA_CO2 = obniz.constructor.getPartsClass("Logtta_CO2");



    if (!obnizParts.targetPeripheral) {
      node.send({debug:"scan start"})
      let periherals = await obniz.ble.scan.startAllWait();
        node.send({debug:"scan finish"})

      let logttaCo2 = periherals.find(e => LOGTTA_CO2.isDevice(e));
      if (!logttaCo2) {
        node.send({debug:"not found"})
        obnizParts.block = false;
        return;
      }
      obnizParts.targetPeripheral =  new LOGTTA_CO2(logttaCo2);
      obnizParts.targetPeripheral.ondisconnect = (reason) => {
        node.send({debug:"disconnect"})
      };


     node.send({debug:"found"})
    }

    if (!obnizParts.targetPeripheral._peripheral.connected) {

      node.send({debug:"connecting"})
      await obnizParts.targetPeripheral.connectWait();

      node.send({debug:"connected"})
    }

    const co2 = await obnizParts.targetPeripheral.getWait();
      node.send({debug:`CO2 ${co2}ppm`})
      node.send({payload:co2, topic:"co2"})
  } catch (err) {
    node.send({debug:{msg:"err",err: err.message}})
  }


  obnizParts.block = false;

所々にある node.send({debug:"start"}) はデバッグ用の出力です。
switchノードを経由してデバッグコンソールに出力しています。

BLEデバイスは、検索して、つないで、やっとデータが取れる というステップを踏むため、
上記のように長くなっています。
ただ、2回目は検索しなくていいよねとか、既につないでいたらつなぐ処理もいらないよね みたいなことがあるので、状態を確認して、必要であれば検索/接続をする という形にしています。

できた

というわけでできました。

だいたい1000ppmぐらいが換気の目安らしいので、この状態はまだ大丈夫ですね
スクリーンショット 2020-12-01 18.15.57.png

でもまぁ試しにと窓を開けるとがくんと下がります
スクリーンショット 2020-12-01 20.13.01.png

二酸化炭素濃度も温度も下がってますが、温度の下がり具合に対して二酸化炭素の下がり具合が素早いですね。
もしかしたら、3分とか、5分とか、少しの時間だけ窓を開けるってことをすれば換気できるけど温度は変わらない!というぬくぬくした換気ができるかもしれませんね!

iotlt
IoT縛りの勉強会です。 毎月イベントを実施しているので是非遊びに来てください! 登壇者を中心にQiitaでも情報発信していきます。 https://iotlt.connpass.com
https://iotlt.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away