CodeZine(コードジン)

特集ページ一覧

センサーモジュールでの計測

Tessel 2ではじめるお手軽IoT 第2回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2016/11/30 14:00
目次

気候センサーモジュール

 今回は気候センサーモジュールを接続して、気温、湿度(相対湿度)を測定してみます。気候センサーモジュールには、「Si7020」という気温・湿度センサーの半導体チップが搭載されています。このチップ自体の性能は、湿度の誤差は±4%(0~80%の場合)で、温度は、-10~85℃(誤差は最大±0.4℃)まで計測できるようです。ただし、Tessel 2のモジュールとしては、0~70℃(誤差は最大±1℃)となっています。

気候センサーの接続

 Tessel 2本体の2つのポートは、基板上にプリントされているとおり、ポートA、ポートBという名前でアクセスできます。ここでは、ポートAに接続することにします。

 いったんTessel 2の電源コードを抜いて、以下の写真の向きでポートAに装着します。

図1 ポートAに接続
図1 ポートAに接続

プロジェクトの作成

 最初にプロジェクト用のフォルダを新規作成し、initコマンドで初期化しておきます。

> mkdir climate
> cd climate
> t2 init

 次に、気候センサーを制御するための、Nodeモジュールをインストールしておきましょう。

> npm install climate-si7020

気温、湿度の表示

 準備ができたので、気温、湿度を取得して表示するコードを書いてみましょう。index.jsを、次のように変更します。

リスト1 index.js
var tessel = require('tessel');
// 気象センサー用モジュールの読み込み
var climatelib = require('climate-si7020');
// モジュールの初期化
var climate = climatelib.use(tessel.port['A']);            // (1)

// イベントハンドラの定義
climate.on('ready', function () {                          // (2)
  console.log('Connected to climate module');

  // 無限ループ
  setImmediate(function loop () {
    // 気温、湿度の取得
    climate.readTemperature('c', function (err, temp) {    // (3)
      climate.readHumidity(function (err, humid) {         // (4)
        console.log('気温:', temp.toFixed(2) + '℃ 湿度:', humid.toFixed(2) + '%');
        setTimeout(loop, 300);
      });
    });
  });
});

// センサーモジュールが接続していない等のエラーのとき
climate.on('error', function(err) {
  console.log('error connecting module', err);
});

 これを実行すると、次のように気温と湿度をコンソールに連続して表示します。

>t2 run index.js
INFO Looking for your Tessel...
INFO Connected to Tessel-WINGS.
INFO Building project.
INFO Writing project to RAM on Tessel-WINGS (8.192 kB)...
INFO Deployed.
INFO Running index.js...
Connected to climate module
気温: 35.40℃ 湿度: 60.23%
気温: 35.40℃ 湿度: 60.24%
気温: 35.38℃ 湿度: 60.23%

 nodeモジュールが用意されていますので、気象センサーを制御するコードは、とてもシンプルになっています。

 モジュールを読み込んだ後は、useメソッドでポートの指定(1)をします。その後センサーの初期化が完了すれば、readyイベントが発生しますので、ハンドラを定義して(2)、そこで値を取得します。

 温度の取得は、readTemperatureメソッドを使います(3)。ここでは、最初のパラメータにc(摂氏)を指定していますが、fを指定すると、華氏での値になります。

 湿度は、readHumidityメソッドで(4)、%単位の値がそのまま取得できます。

HTTPサーバを用いてJSON出力

 コンソールに表示するだけでは、おもしろくないので、今度は、HTTPサーバを作成して、JSON文字列として出力するようにしてみましょう。

 Node.jsですので、HTTPサーバも短いコードで作成することができます。

コード

 最初にnodeモジュールの、http、os、moment、moment-timezoneをインストールしておきます。なお、momentとmoment-timezoneは、JavaScriptで時刻操作を行うライブラリです。JavaScriptでは、日時をフォーマットする場合など煩雑になりがちですが、このライブラリを使うと、簡潔に記述できます。

リスト2 http-climate.js
var tessel  = require('tessel');
var climate = require('climate-si7020').use(tessel.port['A']);
var http    = require('http');
var ip      = require('os').networkInterfaces().wlan0[0].address; // ローカルIP(1)
var moment  = require('moment-timezone');

climate.on('ready', function() {
  // HTTPサーバオブジェクトの生成(2)
  http.createServer(function(req, res) {
    climate.readTemperature('c', function (err, temp) {
      climate.readHumidity(function (err, humid) {
        res.writeHead(200, {'Access-Control-Allow-Origin':'*',
                            'Content-Type': 'application/json'});
        // JSON文字列の出力(3)
        res.end( JSON.stringify({
          // 現在時刻
          date : moment().tz('Asia/Tokyo').format('YYYY-MM-DD HH:mm:ss'),
          temp : temp,
          humid : humid
        }) );
      });
    });
  }).listen(80,ip);
  console.log(ip);
});

~以下略~

 Tessel 2のローカルIPアドレスは、nodeのosオブジェクトで取得可能です(1)。Wi-Fiなら、networkInterfaces().wlan0[0]、有線なら、networkInterfaces().eth0[0]となります。

 HTTPサーバは、httpオブジェクトのcreateServerメソッドで生成します(2)。writeHeadメソッドでヘッダーを出力し、endメソッドでJSON文字列とEOFを出力しています(3)。

 なお、ヘッダーでは、Access-Control-Allow-Originに*を指定し、異なるドメインからのAJAXアクセスを許可するようにしています。

実行

 t2 runコマンドで実行すると、ローカルのIPアドレスがコンソールに出力され、HTTPサーバが起動します。ブラウザ等でアクセスすると、次のようなJSON文字列が表示されます。

{
    date: "2016-10-02 17:14:35",
    temp: 37.37419189453124,
    humid: 55.267852783203125
}

不快指数の表示

 Tessel 2のHTTPサーバで、センサーの値をJSON文字列として出力できるようになりました。このJSON文字列を定期的にポーリングしてDBに格納すれば、グラフなどもかんたんに作成することができます。

 今回は、気温と湿度から、不快指数を計算し、それをリアルタイムに表示するWebページを作ってみました。

リスト3 sample.htmlのスクリプト
$(function(){
  $.ajaxSetup({cache: false}); // キャッシュさせないようにする
  setInterval((function climate() {
    // Tessel 2のHTTPサーバからJSON文字列を取得する
    $.getJSON("http://192.168.0.100/", function(json){
       // 気温と湿度から不快指数を求める
       var index = 0.81*json.temp + 0.01*json.humid*(0.99*json.temp - 14.3) + 46.3;
       $("#date").html(json.date);
       $("#temp").html(json.temp.toFixed(1));
       $("#humid").html(json.humid.toFixed(1));
       $("#index").html(index.toFixed(1));
    });
    return climate;
  }()), 5000);
});

 jQueryを使って、5秒ごとにTessel 2のHTTPサーバにアクセスし、取得したJSON文字列から気温と湿度を求め、不快指数を計算しています。

図2 不快指数のリアルタイム表示
図2 不快指数のリアルタイム表示

まとめ

 今回は、ハードウェアモジュールの紹介と、気候センサーモジュールによる気温、湿度の測定、表示などを解説しました。次回は、USBモジュールのひとつ、USBカメラを接続して、静止画やストリーム表示を行うコードを紹介しましょう。

参考資料



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Tessel 2ではじめるお手軽IoT

著者プロフィール

  • WINGSプロジェクト 高江 賢(タカエ ケン)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5