気候センサーモジュール
今回は気候センサーモジュールを接続して、気温、湿度(相対湿度)を測定してみます。気候センサーモジュールには、「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カメラを接続して、静止画やストリーム表示を行うコードを紹介しましょう。
