HakoHiroのアイコン画像
HakoHiro 2021年05月16日作成
製作品 製作品 閲覧数 1154
HakoHiro 2021年05月16日作成 製作品 製作品 閲覧数 1154

obniz + SensorTag + Ambientによる気象状況ロギング

obniz + SensorTag + Ambientによる気象状況ロギング

概要

友人が趣味でやっている 友人自宅からちょっと離れたビニールハウス農園の気象状況をロギングします。当初は、前回の投稿キャンペーンの賞品 BME680複合センサモジュールを使用しようと考えていましたが、obnizにそのライブラリが無く、obniz環境でBME680を動かすのは負担が大きすぎると判断しました。その代替として 手持ちのTI SensorTag CC2650というBLEで通信するセンサーユニットを使用しました。

SensorTag ⇒ obnizBoard1Y ⇒ インターネット ⇒ Ambient

SensorTagのDataをobnizBoardでBLE受信し、そのDataをインターネット経由でAmbientに送信します。
したがって、友人はビニールハウスの気象状況を、自宅にいながらモニタリングできるということになります。

SensorTagとは

テキサス・インスツルメンツ社のローパワーCC2650(Cortex M3) ワイヤレス・マイコンを利用し、10種類のセンサを搭載したデモ・モジュールSensorTagは、TI storeから29ドルで入手できます。Bluetoothは技適をとっているので、日本国内で利用できます。
●搭載しているセンサ
 SensorTAGは、光、ディジタル・マイク、磁気センサ、湿度、圧力、加速度計、ジャイロスコープ、磁力計、物体の温度、周囲温度が測れるセンサを搭載しています。

赤外線および周囲温度センサ;TMP007
周辺光センサ;OPT3001
湿度センサ;HDC1000
大気圧センサ;BMP280
9 軸モーション・トラッキング・デバイス – 加速度計、ジャイロスコープ、コンパス、磁気コンセントレータ;MPU-9250
リード・スイッチ;MK24

https://www.denshi.club/pc/nodered/sensortag.html 記事から抜粋

今回は、温度センサ、湿度センサ、光センサ、大気圧センサの出力をロギングします。
通信はBLE4.2を使用します。(他2種類選べます)

構成

  • obnizBoard1Y (コンテスト応募にて頂いたもの)
  • SensorTag CC2650
  • Ambient ユーザー登録(8Channelまで無料)
  • WiFi + インターネット環境
    実はこれが一番の問題、友人の離れたところにあるビニールハウスにこの環境を設置しなければならない

ソースコード

obnizとBLEの組合せでのData受信の例は、結構elchika投稿にも上がっていますが、ほとんどがアドバタイジングデータにセンサーデータが同居していてアドバタイジングデータだけの受信例が多いようです。SensorTagは、各種サービス、キャラクタリスティックを利用しないとデータ受信できません。
プログラムでは、使用するサービス、キャラクタリスティックを直に定義しています。

60秒おきにデータを読み出し、Ambientに送信しています。
Ambientへのデータ送信は1チャネル当たり 3,000件/1日ですので、平均28.8秒のペースが可能です。

  • また、SensorTagはアドバタイズ状態で2分間放っておくとスリープモードに入って通信できなくなります。ただし、接続したままにすればスリープモードには入りません。

https://ambidata.io/samples/temphumid/sensortag/
Ambient の「SensorTagで温度、湿度などを測りRaspberry Pi3経由でAmbientに送ってグラフ化する」から引用

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script src="https://unpkg.com/obniz@3.x/obniz.js" crossorigin="anonymous" ></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/qs/6.10.1/qs.min.js" integrity="sha512-aTKlYRb1QfU1jlF3k+aS4AqTpnTXci4R79mkdie/bp6Xm51O5O3ESAYhvg6zoicj/PD6VYY0XrYwsWLcvGiKZQ==" crossorigin="anonymous"></script>
    <script src="https://unpkg.com/ambient-lib@1.0.3/lib/ambient-lib.js"></script>
  </head>
  <body>
    <div id="obniz-debug"></div>
    <script>
   // +++++++++ SensorTag BLE通信定義 Start
   //+++++++ 必要なServiceのUUIDを登録
      const UUID_SERVICE_TEMP     = "f000aa0004514000b000000000000000";
      const UUID_SERVICE_HUMIDITY = "f000aa2004514000b000000000000000";
      const UUID_SERVICE_PRESSURE = "f000aa4004514000b000000000000000";
      const UUID_SERVICE_OPTICAL  = "f000aa7004514000b000000000000000";

   //+++++++ 必要なCharactristicのUUIDを登録
      const UUID_CHARA_TEMP_DATA    = "f000aa0104514000b000000000000000";
      const UUID_CHARA_TEMP_CONFIG  = "f000aa0204514000b000000000000000";
      const UUID_CHARA_TEMP_PERIOD  = "f000aa0304514000b000000000000000";

      const UUID_CHARA_HUMIDITY_DATA    = "f000aa2104514000b000000000000000";
      const UUID_CHARA_HUMIDITY_CONFIG  = "f000aa2204514000b000000000000000";
      const UUID_CHARA_HUMIDITY_PERIOD  = "f000aa2304514000b000000000000000";

      const UUID_CHARA_PRESSURE_DATA    = "f000aa4104514000b000000000000000";
      const UUID_CHARA_PRESSURE_CONFIG  = "f000aa4204514000b000000000000000";
      const UUID_CHARA_PRESSURE_PERIOD  = "f000aa4404514000b000000000000000";

      const UUID_CHARA_OPTICAL_DATA    = "f000aa7104514000b000000000000000";
      const UUID_CHARA_OPTICAL_CONFIG  = "f000aa7204514000b000000000000000";
      const UUID_CHARA_OPTICAL_PERIOD  = "f000aa7304514000b000000000000000";

      const SENSORTAG = { localName: "CC2650 SensorTag"};
// +++++++++ SensorTag BLE通信定義 End

      var obniz = new Obniz("OBNIZ_ID_HERE");
      obniz.onconnect = async function () {
        await obniz.ble.initWait();
        var peripheral = await obniz.ble.scan.startOneWait(SENSORTAG);
        if(peripheral) {
          console.log("found");
          try {
            await peripheral.connectWait();
            console.log("connected");
            console.log("number of services=" + peripheral.services.length);
            // ====== Ambientの登録 自分の登録値で書き換えて下さい
            const am = new Ambient(チャネルID, 'ライトキー');

            //*********************** SensorTag Sensor EnableEnable処理
    //  Configuration のキャラクタリスティックに1を書き込むと
          // そのセンサーがEnableとなる 0>>Disable
            await peripheral.getService(UUID_SERVICE_TEMP).getCharacteristic(UUID_CHARA_TEMP_CONFIG).writeWait([0x01]);
            await peripheral.getService(UUID_SERVICE_HUMIDITY).getCharacteristic(UUID_CHARA_HUMIDITY_CONFIG).writeWait([0x01]);
            await peripheral.getService(UUID_SERVICE_PRESSURE).getCharacteristic(UUID_CHARA_PRESSURE_CONFIG).writeWait([0x01]);
            await peripheral.getService(UUID_SERVICE_OPTICAL).getCharacteristic(UUID_CHARA_OPTICAL_CONFIG).writeWait([0x01]);
            console.log("write success");

            var tempAddress = peripheral.getService(UUID_SERVICE_TEMP).getCharacteristic(UUID_CHARA_TEMP_DATA);
            var humAddress = peripheral.getService(UUID_SERVICE_HUMIDITY).getCharacteristic(UUID_CHARA_HUMIDITY_DATA);
            var pressAddress = peripheral.getService(UUID_SERVICE_PRESSURE).getCharacteristic(UUID_CHARA_PRESSURE_DATA);
            var optAddress = peripheral.getService(UUID_SERVICE_OPTICAL).getCharacteristic(UUID_CHARA_OPTICAL_DATA);

            obniz.repeat( async function(){
                var tempdata = await tempAddress.readWait();
                var temperature = (tempdata[3] * 256 + tempdata[2])/4*0.03125;

                var humdata = await humAddress.readWait();
                var humidity = (humdata[3] * 256 + humdata[2])/65536*100;

                var pressdata = await pressAddress.readWait()
                var pressure = (pressdata[5] * 4096 + pressdata[4] * 256 + pressdata[3])/100*2.6;

                var optdata = await optAddress.readWait()
                var opticLight = optdata[1] * 256 + optdata[0];
                console.log(temperature + "℃  " + humidity + "%  " + pressure + "hPa  " + opticLight); 
             // ====== Ambientへのデータ送信
                am.send({d1: temperature, d2: humidity, d3: pressure, d4: opticLight}, function(response) {
                    console.log(response.status);
                });
                 
            },60000) 

          } catch(e) {
            console.error(e);
          }
        }
      }

    //   called on offline
      obniz.onclose = async function() {
        
      };

    </script>
  </body>
</html>

実はNotifyを指定することにより、SensorTagから周期的にDataを送信することができるのですが、最大指定サイクルが2.55秒なのでAmbientとの兼ね合いがちょっと手間なのでNotifyは使用していません。移動平均等でデータを処理し Ambient送信間隔を調整すれば良いのですが・・

動作状況

Ambientの画面と、Obniz実行Consoleログ画面を表示します。
Data採取間隔が大きいので、あまりミバは良くないですが

ここに動画が表示されます

感想

  • obnizBoad1Y
    すばらしい仕上がり、コンパクトに機能をまとめ、LCD表示もついて最高です。

  • obniz
     インターネットに接続さえすれば、非常に簡単に高品質のIoTが開発できる。素晴らしいコンセプトです。ただ、ライブラリの充実が大変でしょうね。自前でライブラリ相当のものを作るのなら、単純にArduinoライブラリを使用して、ESP32等で開発した方が当方にとって楽です。(obnizを否定しているわけではありません。要は向き、不向きがあるということです)

  • SensorTag
    かなりの種類のセンサーを搭載していて、利用価値のあるセンサーです。ここでは紹介しませんでしたが、各センサーも設定自由度が高く、かなりなことが出来ます。
    ただし、スリープに入ってしまうと、人間が電源Onスイッチを押さないと起動しないというのは結構厳しい制限です。

反省

友人の離れた所にあるビニールハウスの気象状況ロギングという目的とはちょっとちぐはぐなものが出来てしまった。obnizはインターネット接続が前提となっていて、それにマッチングした用途は、非常に簡単に開発できる。しかし、ビニールハウスにインターネットを設置するのは、商業利用でなければ現実的ではない。
また、調べてみたら農作業支援通知システム 農業IoT『てるちゃん』というシステムが結構リーズナブルな値段で出ているのですね。

https://www.tel-chan.com
農作業支援通知システム 農業IoT『てるちゃん』

ただし、これでも費用は発生する。
当方は、ESP32の開発環境は既に完備しており、ノウハウも蓄積しており、obnizに拘る必要は無い。obnizを否定しているわけではありません。当方の利用目的設定がまずかったのです。
友人の離れた所にある趣味のビニールハウスの気象状況ロギングという目的のBest解は、
M5Atom等でサーバー(インターネットにつながらない)を建て、SensorDataをロギングし、M5Atom内に保存する。友人がビニールハウスについたら、スマホでM5Atomサーバーに接続しデータを吸い上げる
のが良いと考えます。

今後の課題

やはり農業目的なら、CO2センサー、土壌水分センサーも搭載したいところです。

HakoHiroのアイコン画像
函館在住のOldエンジニアです。マイコンは Z80ワンボードの頃から使っています。なにせあの頃は、ハンドアセンブルでプログラム作成していました。(ニーモニックを手書きで書き、それを表を見ながら機械語コードに落とします)おかげで リターンコード(RTN=0xC9)はいまだに覚えています。RTNまで来るとサブルーチンが一段落でホッとするので・・・ 現在は、電子工作の他に錫で色々作って楽しんでいます。
ログインしてコメントを投稿する