今回は、温度センサーと接続してみます。
RaspberryPiと温度センサーの接続
センサーはmarutsuで販売している ADT7310を使用しました。
センサーのデータ取得方法については、このサンプルプログラムの主題ではないために、次のサイトをご覧いただければと思います。
Raspberry Piでも温度センサADT7310をつかってみる
配線は、上記サイトに従って次のようにしています。
ADT7310 – Raspberry Pi
- VDD – 5V
- SCL – GPIO11 SCLK
- SDO – GPIO9 MISO
- SDI – GPIO10 MOSI
- CS – GPIO8
- GND – GND
※今回は温度センサー ADT7310を利用していますが、センシングデータを取得できるものであれば、どんなセンサーでもこのSensingApp(センシングアップ)を利用して遠隔でグラフを見ることができます。
センサーの新規登録
SensingApp画面のセンサー新規登録で、次のように登録を行います。
センサー種別は半角英数字のみ入力可能です。設置場所は日本語が利用できます。また数値については半角で入力下さい。アラートはその範囲を超えたときにアラートメールが届きます。ゲージ最大値、最小値はゲージを表示するときの目盛です。
クラウドと通信するための情報
用意するのは次のとおりです。SensingApp のアカウントを用意したら、センサーを登録した後、次の情報をご確認下さい。
- USER ID
- データ送信先URL
- センサー種別
- センサー番号
以上の情報をご用意いただければ、センシングデータをSensingAppに送信してグラフ表示することが可能です。
SensingApp画面のユーザー情報で、①と②のUSER IDとデータ送信先URLを確認できます。
また、SensingApp画面のセンサー一覧で、③センサー種別と④センサー番号(No.)を確認できます。
サンプルコード(Python)
RaspberryPiで動作させるサンプルコードを示します。
※ get_data()関数部分は、前出のサイトをそのまま利用させていただいています。ご参照下さい。
# -*- coding: utf-8 -*-
# 温度計測のサンプルプログラム(自動送信)
#
import json
import urllib.request
from datetime import datetime
import traceback
import spidev
import time
# データ送信先
URL = 'https://beta.sensingapp.io/api/data/'
USER_ID = '4bf7ee7c-be3f-43f6-a732-02b14de660be'
ITEM = 'TEMP'
ITEM_NUM = '5'
# センシングデータ取得
# この関数部分にセンサーに合わせて記述を行う
def get_data():
spi = spidev.SpiDev()
spi.open(0,0)
spi.mode = 0x03
spi.max_speed_hz = 5000
spi.xfer([0xFF, 0xFF, 0xFF, 0xFF])
time.sleep(0.5)
spi.xfer([0x54])
time.sleep(1)
ret = spi.xfer([0xff,0xff])
temp = ret[0]<<8 | ret
temp = temp >> 3
if(temp >= 4096):
temp = temp - 8192
spi.close()
return(temp/16)
# メイン
def main():
while True:
try:
# センシングデータを取得し、小数点以下2桁に丸める
data = round(get_data(), 2)
# 送信データ作成
obj = {
"user_id": USER_ID,
"item": ITEM,
"item_num": ITEM_NUM,
"regist_date": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"sensing_data": str(data),
}
json_data = json.dumps(obj).encode("utf-8")
print(json_data) # for debug
# httpリクエストを準備してPOST
request = urllib.request.Request(
URL,
data=json_data,
method="POST",
headers={"Content-Type": "application/json",}
)
with urllib.request.urlopen(request) as response:
response_body = response.read().decode("utf-8")
if "Error" in response_body:
print("response_body Error")
else:
# インターバルをクラウドから取得した数値を入れる
interval_time = int(response_body)
print(interval_time)
time.sleep(interval_time) # インターバル値時間を停止
except KeyboardInterrupt: # キーボード例外を検出
print("Stopped by Ctrl+C")
break
except Exception:
print(traceback.format_exc())
if __name__ == '__main__':
main()
自動起動設定
RaspberryPiにプログラムを置いたら、それを自動起動にします。ファイル名、ディレクトリー名はご自身の環境に合わせて下さい。
温度センシングのプログラム(temp_sample.py)を実行するために、sensingapp.shを用意します。
#!/bin/sh
sleep 30
cd /home/pi
/usr/bin/python3 /home/pi/temp_sample.py
実行できるようにしておきます。
$ chmod 755 sensingapp.sh
次に、自動起動するためのサービスを用意します。
[Unit]
Description=SensingApp
After=syslog.target
[Service]
Type=simple
WorkingDirectory=/home/pi
ExecStart=/home/pi/sensingapp.sh
User=pi
Group=pi
[Install]
WantedBy=multi-user.target
自動起動の設定を行います。
$ sudo systemctl daemon-reload
$ sudo systemctl start sensingapp
$ sudo systemctl enable sensingapp
起動しているか確認します。
$ systemctl status sensingapp
● sensingapp.service – SensingApp
Loaded: loaded (/etc/systemd/system/sensingapp.service; enabled; vendor preset: enabled)
Active: active (running)
一旦、RaspberryPiを再起動して、自動起動を行います。
データ表示
自動起動がうまくいけば、次のようにダッシュボードでデータが表示されます。
データログも次のように表示されます。
計測間隔の変更
計測間隔はヘッダーメニュー(黒いところ)のデバイス設定で行えます。初期値は600秒(10分)ですが、サンプルプログラムでは次のように60秒で設定しています。60秒以上、自由に変更ができます。
アラートの設定
アラートはセンサーを新規登録したときに設定できますが、あとになっても、次のところから設定を変えることができます。このアラート値の範囲を超えた場合、自動的にアラートメールが登録しているメールに届きます。
データが表示されなかったら
ダッシュボードでデータが表示されない場合は次の理由が考えられます。
① IoTデバイスがインターネットに接続されていない。
② IoTデバイスでデータ送信するプログラムのパラメーターが正しくない。
- IoTデバイス設定の通信パラメーターをご覧ください。
- 通信が一度でも出来たあとに、登録センサー画面で、該当するセンサーを削除したり、種別を変更すると通信できなくなります。
③ システム全体が不具合を起こしている。
- この場合には画面も見られなくなっている可能性がありますので、弊社にご相談ください。
上記のように一旦、誤ってセンサーを削除したら、IoTデバイスのパラメーターを変更する必要があります。その場合には弊社にご相談ください。