Python3
IoT
IoTlt
microbit
Ambient

micro:bitとAmbientで社内の温度、環境光を可視化した

きっかけ

いつだかのIoTLTで、micro:bitを紹介して下さった方がいらっしゃって、これなら簡単に何かできそうだぞ!と思いやってみました:relieved:

何をしたのか?

micro:bitというマイコンで温度と環境光の値をpythonで受信し、そのまま値をpythonでAmbientに送信するという流れです。
それぞれの値(温度と環境光)をAmbient上で折れ線グラフで可視化してみたという話です。

micro:bitとは

25個のLED、加速度センサー、LEDを利用した光センサー(環境光)、温度センサー、Bluetooth、コンパスと、こんなにいろいろ機能がついててAmazonで2,160円で買える。(2018/04/16現在)

英BBCが教育用として開発した低消費電力、低コストのシングルボードコンピュータだそうです。(Wikiより)
なんとイギリスの11歳と12歳の小学生に無料配布されてるらしいです:innocent:
http://microbit.org/ja/

Ambientとは

AmbientはIoTデーターの可視化サービスです。
マイコンなどから送られるセンサーデーターを受信し、蓄積し、可視化(グラフ化)します。
なんとユーザ登録無料です!
https://ambidata.io

構成図

図にすると以下のような感じになります。
無題.png

  1. micro:bit から温度、環境光の値を60秒間に1回送信
  2. USB接続(シリアル通信)されたPC(Windows7)に python のアプリを常駐させて温度、環境光の値を受信
  3. 取得した値をそのまま python で Ambient に送信

1. micro:bit から温度、環境光の値を60秒間に1回送信

micro:bit は小学生の教育用として開発されただけあって、ブラウザ上から簡単にプログラムを組むことが出来ます。
書いたコードはこんな感じです。

microbit_code.PNG

このようにScratch(ブロックプログラミング)で書くことも出来るし、JavaScript、pythonでも書けます。

2. USB接続(シリアル通信)されたPC(Windows7)に python のアプリを常駐させて温度、環境光の値を受信

Windowsシリアルポートのドライバで mbed をインストールしました。これをインストール後に micro:bit が認識されました。
https://os.mbed.com/handbook/Windows-serial-configuration

Ambient の登録とチャンネル作成を以下のページを参考に先に作っておく必要があります。
https://ambidata.io/docs/gettingstarted/

これで準備が整い、あとは python のコードを書くだけです。
python でのシリアル通信には pyserial を利用しました。
コード的には下記のような感じです。

qiita.py
import serial
import ambient

// Ambient送信情報
am = ambient.Ambient(チャンネル, 'キー値')

// シリアル通信 COMポートの番号はデバイスマネージャーから確認、ボーレートは 115200
ser = serial.Serial('COM13', 115200)
line = ''
microbitdata = ''
while True:
    line = ser.readline()

    // 区切り文字(ハイフン)だったら1回分としてAmbientに温度と環境光の値を送信
    if '-' == line.decode('utf-8').strip():
        // Ambientに値を送信
        amSend(am, microbitdata)
        microbitdata = ''
    else:
        microbitdata = microbitdata + line.decode('utf-8').strip() + ':'

ser.close()

3. 取得した値をそのまま python で Ambient に送信

取得した値を送信するコードは以下です。

qiita.py
def amSend(am, d):
    a = d.split(':')

    // data = [{'d1':温度の値, 'd2':環境光の値}]
    data = [{'d1':int(a[1]), 'd2':int(a[3])}]

    // Ambientに値を送信
    r = am.send(data)

    // <Response [200]> HTTPステータスコードがプリントされる
    print(r)

下記のように環境光の値だけ送る、みたいなことは出来なかったので、温度と環境光の値を同時に送る必要がありました。

data = [{'d2':環境光の値}]
r = am.send(data)

また、Ambientの制約で1チャネル3,000件/日までのデータを登録できます。
https://ambidata.io/refs/spec/
逆を言うとこれ以上は登録できないということで、当初 am.send しまくって恐らくこの制約に引っかかりました。翌日には送れるようになってました。
まぁ普通リクエスト制限ありますよね。。。

結果

温度

温度は下記のような結果に!!
image.png

今の時期は、あまり温度変化がみられず、つまらない結果に。。。
真夏とか真冬だと温度変化が激しいと思うので、その時期に期待!

環境光

環境光は下記のような結果に!!
image.png

電気の消灯、点灯がハッキリと見られるのでこっちの方が面白い結果になりました。

朝5:30頃は清掃業者がゴミ回収に一瞬、訪れたと思われ、
8:45頃には誰かが出社したようです。
ウチは昼休みは消灯するので、12:00頃からガクンと下がってます。
15:30にも一瞬、ガクンと下がってますが、人が micro:bit の近くに来て影になってしまったためです。

出社、退社の時間もこれで何となくは分かるようになります。
また、温度変化の可視化は(別で湿度も取る必要があるかもしれませんが)室内環境の適正化だったり、
サーバールームとかに置いて適正温度から外れたらアラートメールを飛ばすなど活用出来るかもしれないですね!

以上です。