[202] 温度センサーを使ったセンシング - soracom/jp-training GitHub Wiki

[202] 温度センサーを使ったセンシング

ここでは、温度センサーを使って気温を測定し、SORACOM Harvest を使用して可視化を行います。

前提条件

以下を完了し、Raspberry Pi を SORACOM Air を使用して 3G 接続出来ていること

必要なもの

Raspberry Pi 以外に必要となるものは以下となります

  • ブレッドボード 1つ
  • ジャンパワイヤ オス-メス 3本(赤/黒/黄)
  • デジタル温度センサー DS18B20+ 1つ
  • 抵抗 4.7kΩ もしくは 10kΩ 1つ (写真には10kΩを掲載しています)

パーツ

デジタルセンサーとアナログセンサー
DS18B20+ はデジタルセンサーであるため、A/D変換回路を持たない Raspberry Pi でも容易に接続する事が可能です。
もし、LM61BIZ等のピンの電圧を計測して温度を求めるタイプのアナログセンサーを使用する場合には、A/D変換回路を別途用意する必要があります。

Raspbian の設定

/boot/config.txt に、dtoverlay=w1-gpio-pullup,gpiopin=4 という1行を追加します。 また、/etc/modules に w1-gpio と w1-therm の2行を追加します。 最後に OS を再起動します。

コマンド

echo dtoverlay=w1-gpio-pullup,gpiopin=4 | sudo tee -a /boot/config.txt
echo w1-gpio | sudo tee -a /etc/modules
echo w1-therm | sudo tee -a /etc/modules
sudo reboot

実行結果

pi@raspberrypi:~ $ echo dtoverlay=w1-gpio-pullup,gpiopin=4 | sudo tee -a /boot/config.txt
dtoverlay=w1-gpio-pullup,gpiopin=4
pi@raspberrypi:~ $ echo w1-gpio | sudo tee -a /etc/modules
w1-gpio
pi@raspberrypi:~ $ echo w1-therm | sudo tee -a /etc/modules
w1-therm
pi@raspberrypi:~ $ sudo reboot

注) 上記ではコマンドラインで追記しましたが、 vi 等のエディタで直接編集しても構いません

温度センサーのセットアップ

下図のように配線します。

写真 温度センサー

温度センサーの動作テスト

これで温度センサーが使えるようになったはずです。温度センサーのデータは /sys/bus/w1/devices/28-xxxxxxxxxxxx/w1_slave のようなパスへアクセスする事で読み出す事が出来ます(xxxの部分は個体ごとに異なり、もし複数のセンサーがある場合には別のパスとして見えます)。

コマンド

cat /sys/bus/w1/devices/28-*/w1_slave

実行結果

pi@raspberrypi:~ $ cat /sys/bus/w1/devices/28-*/w1_slave
73 01 4b 46 7f ff 0d 10 41 : crc=41 YES
73 01 4b 46 7f ff 0d 10 41 t=23187

2行目の t= 以降の数字が温度データ(摂氏の1000倍)となっているので、コマンドラインで加工してみましょう。 最後の行に対して、「=」(イコール)を区切り文字として2番目のデータを 1000 で割ります。これを awk コマンドで行うには、以下のようになります。

コマンド

awk -F= 'END {print $2/1000}' < /sys/bus/w1/devices/28-*/w1_slave

実行結果

pi@raspberrypi:~ $ awk -F= 'END {print $2/1000}' < /sys/bus/w1/devices/28-*/w1_slave
23.5

可視化

センサーデータの可視化を行うには、色々な方法があります(例えば、CSVデータにして表計算ソフトでグラフを描画する、またはデータベースなどに入れて BI ツールでアクセスするなど)。ただ、リアルタイムなデータを確認しづらかったり、準備が必要であったりと、手間がかかります。 SORACOM プラットフォームには、簡単にセンサーデータをグラフとして確認したい場合に、便利なサービス SORACOM Harvest があるので、これを利用してみましょう。

SORACOM Harvest とは

SORACOM Harvest(以下、Harvest) は、IoTデバイスからのデータを収集、蓄積するサービスです。

SORACOM Air が提供するモバイル通信を使って、センサーデータや位置情報等を、モバイル通信を介して容易に手間なくクラウド上の「SORACOM」プラットフォームに蓄積することができます。 保存されたデータには受信時刻や SIM の ID が自動的に付与され、「SORACOM」のユーザーコンソール内で、グラフ化して閲覧したり、API を通じて取得することができます。なお、アップロードされたデータは、40日間保存されます。

容易なデータ収集と蓄積

Harvest を利用することで、お客様は IoT デバイスと SORACOM Air があれば、別途サーバーやストレージを準備することなく、データの送信、保存、可視化までの一連の流れを手軽に実現することができます。アプリケーションの準備が整わずともIoTデバイスのデータの可視化を実現します。

プロトコルは、HTTP、TCP、UDPに対応しています。 デバイスは、これらの簡易な実装だけでクラウドサービスへのデータのインプットが可能となります。

データは 40日間に渡って保存されます。より本格的なデータ収集・分析を行いたい場合には、任意のタイミングで他のクラウドやストレージにデータを移行し、お客様ご自身でデータ分析基盤を構築することも可能です。

図 Harvest構成図

データの可視化

蓄積されたデータはユーザーコンソールから、グラフおよび送信されたメッセージを確認することができます。 図 Harvestグラフ 出典: https://soracom.jp/services/harvest/

SORACOM Harvest を有効化する

グループの設定で有効化します。

  1. SORACOM ユーザコンソール左上部のメニューを開き、「グループ」を選択
  2. SIM で使用しているグループをクリック
  3. SORACOM Harvest 設定をクリック
  4. スライドスイッチを「ON」にし「保存」を押す

設定は以上で完了です。

SORACOM Harvest が有効になっている SIM には書き込み回数に応じて課金がかかります。
書き込みリクエスト: 1日 2000リクエストまで、1SIMあたり 1日5円
1日で2000回を超えると、1リクエスト当り0.004円

SORAOM Harvest にデータを送信する。

SORACOM Harvest は、TCP/UDP/HTTP でデータを送信する事が出来ます。 例えば、HTTPであれば、http://harvest.soracom.io にデータを JSON 形式で POST するだけです。 簡単なシェルスクリプトを使って、データを送信してみましょう。

コマンド

wget http://soracom-files.s3.amazonaws.com/jp-training/202/temperature_harvest.sh
bash temperature_harvest.sh 5

実行結果

pi@raspberrypi:~ $ wget http://soracom-files.s3.amazonaws.com/jp-training/202/temperature_harvest.sh
--2017-09-26 15:37:03--  http://soracom-files.s3.amazonaws.com/jp-training/202/temperature_harvest.sh
Resolving soracom-files.s3.amazonaws.com... 52.219.4.49
Connecting to soracom-files.s3.amazonaws.com|52.219.4.49|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 515 [text/plain]
Saving to: ‘temperature_harvest.sh’

temperature_harvest.sh    100%[===================================>]     515  --.-KB/s    in 0s

2017-09-26 15:37:03 (32.7 MB/s) - ‘temperature_harvest.sh’ saved [515/515]
pi@raspberrypi:~ $ bash temperature_harvest.sh 5
payload={"temperature":23.812} OK
payload={"temperature":23.812} OK
payload={"temperature":23.75} OK <- 温度センサーを指で摘んで温度を上げる
payload={"temperature":24.375} OK
payload={"temperature":26.562} OK
payload={"temperature":27.375} OK
payload={"temperature":27.875} OK
payload={"temperature":28.125} OK
payload={"temperature":28.312} OK
payload={"temperature":27.937} OK
payload={"temperature":26.687} OK
payload={"temperature":25.937} OK

可視化された温度データ

とても簡単なプログラム(コマンド)で、データの可視化が出来ました。

通常、温度の変化はそれほど激しくないと思いますので、1分に1度程度にしておけば 1440リクエスト/日となり追加料金が発生しません。もし定常的にデータを記録したい場合には適宜送信の間隔を調整しましょう。

プログラムリスト解説

#!/bin/bash

# 第一引数がデータの送信間隔となる(デフォルトは60秒)
if [ "$1" = "" ]
then
	interval=60
else
	interval=$1
fi

while [ 1 ]
do
	(
		temp=$(awk -F= 'END {print $2/1000}' < /sys/bus/w1/devices/28-*/w1_slave) # 温度を読み取り、temp にセット
		payload='{"temperature":'$temp'}' # 送信するJSON文字列を作る
		echo -n payload=$payload
		curl -X POST -d $payload http://harvest.soracom.io && echo " OK" || echo " NG" # HTTP で POST する
	) &
	sleep $interval
done

温度データを読み取る部分のコマンドは、テストの時に実行したものと同じです。 こちらで得られた数字を JSON 形式にして、Harvest のエントリーポイントへ HTTP POST しています。 通常は引数を無指定(=60秒毎)で実行するとよいでしょう。