気候センサーモジュール
今回は気候センサーモジュールを接続して、気温、湿度(相対湿度)を測定してみます。気候センサーモジュールには、「Si7020」という気温・湿度センサーの半導体チップが搭載されています。このチップ自体の性能は、湿度の誤差は±4%(0~80%の場合)で、温度は、-10~85℃(誤差は最大±0.4℃)まで計測できるようです。ただし、Tessel 2のモジュールとしては、0~70℃(誤差は最大±1℃)となっています。
気候センサーの接続
Tessel 2本体の2つのポートは、基板上にプリントされているとおり、ポートA、ポートBという名前でアクセスできます。ここでは、ポートAに接続することにします。
いったんTessel 2の電源コードを抜いて、以下の写真の向きでポートAに装着します。
プロジェクトの作成
最初にプロジェクト用のフォルダを新規作成し、initコマンドで初期化しておきます。
> mkdir climate > cd climate > t2 init
次に、気候センサーを制御するための、Nodeモジュールをインストールしておきましょう。
> npm install climate-si7020
気温、湿度の表示
準備ができたので、気温、湿度を取得して表示するコードを書いてみましょう。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では、日時をフォーマットする場合など煩雑になりがちですが、このライブラリを使うと、簡潔に記述できます。
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ページを作ってみました。
$(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文字列から気温と湿度を求め、不快指数を計算しています。
まとめ
今回は、ハードウェアモジュールの紹介と、気候センサーモジュールによる気温、湿度の測定、表示などを解説しました。次回は、USBモジュールのひとつ、USBカメラを接続して、静止画やストリーム表示を行うコードを紹介しましょう。