9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

enebularAdvent Calendar 2020

Day 8

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

Last updated at Posted at 2020-12-08

これは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分とか、少しの時間だけ窓を開けるってことをすれば換気できるけど温度は変わらない!というぬくぬくした換気ができるかもしれませんね!

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?