[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日間に渡って保存されます。より本格的なデータ収集・分析を行いたい場合には、任意のタイミングで他のクラウドやストレージにデータを移行し、お客様ご自身でデータ分析基盤を構築することも可能です。
データの可視化
蓄積されたデータはユーザーコンソールから、グラフおよび送信されたメッセージを確認することができます。 出典: https://soracom.jp/services/harvest/
SORACOM Harvest を有効化する
グループの設定で有効化します。
- SORACOM ユーザコンソール左上部のメニューを開き、「グループ」を選択
- SIM で使用しているグループをクリック
- SORACOM Harvest 設定をクリック
- スライドスイッチを「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秒毎)で実行するとよいでしょう。