【Raspberry Pi】Ambientへセンサデータを送信してグラフ化
こんなこと、やります。
- Ambientクラウドサービスを使ってみる
- Raspberry Pi と Arduino(ESP32系)を使ってAmbientへデータ送信
- Ambientでログデータをグラフ化
Ambientの使い方
Ambientの使い方を簡単に説明します。
Ambientとは
Ambientとは、センサなどのデータをグラフ化してくれるクラウドサービスです。無料で利用できます。自前のサーバーを用意する必要がないのでちょっとしたログを取りたいときにたいへん便利です。
Ambientのざっくりとした手順
- Ambientにログインし、新しくチャネルを作成する
- データを書き込む場合は「チャネルID」と「ライトキー」が必要
- チャネルの設定で、データ種類の分だけ項目を追加
- チャネルのボードを開いて、チャートを作成する
利用制限
Ambientへ送れる一日のデータ件数は、1チャネルあたり3000件となってます。それ以上を超えると413エラーが返ってきます。
30秒以上の間隔を空けて送信すれば、制限以内におさまる計算になります。
Ambientの利用制限についてはこちらをご覧ください。 諸元/制限–Ambient
Raspberry PiからAmbientへ送信
Raspberry PiからAmbientへ送信する方法を解説します。
つかうもの
Raspberry Pi zero WHを使用しましたが、無線機能が使えればお好きなRaspberry Piで構いません。
そのほか、データを取得できる各種センサをお使いください。
Ambientライブラリのインストール
Raspberry PiでAmbientを使えるようにするため、PythonのAmbientライブラリをインストールします。
$ pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.git
$ pip3 list | grep ambient
ambient 0.1.6
Ambientを使うには、ambientとrequestsをインポートします。
import ambient
import requests
Ambientへデータ送信
Ambientにデータを送信するやり方を説明します。
下のプログラムのように、Ambientで作成したチャネルIDとライトキーを設定します。あとは am.send({'d1': 数値, 'd2': 数値}) の形でデータを送信するだけです。
am = ambient.Ambient(チャネルId, ライトキー)
try:
res = am.send({'d1': 数値, 'd2': 数値})
print('sent to Ambient (ret = %d)' % res.status_code)
except requests.exceptions.RequestException as e:
print('request failed: ', e)
PythonのAmbientライブラリの詳しい使い方は、こちらをご覧ください。 Pythonライブラリー–Ambient
実践:照度と水温をAmbientへ送信してみた
実際に、ベランダの照度と水耕栽培の水温を測って、Ambientにデータを送信してみました。照度センサと温度センサの使い方は、 【Raspberry Pi】照度センサ(フォトトランジスタ)と温度センサ(TMP36) をご覧ください。
こちらの図のように、Ambientでログデータをグラフ化できました。
SSHで実行するとプログラムが途中で止まってしまう場合
Raspberry PiをSSHでリモートコントロールしている場合、SSHをログアウトすると実行しているプログラムも終了してしまいます。ログアウト後もプログラムを実行し続ける場合は、$ nohupコマンドを使ってプログラムを実行させます。
$ nohup python3 photo-temp.py > out.log &
プログラムを終了させる場合
nohupで実行したプログラムを終了させる場合は、$ ps x でプロセスIDを調べ、 $ kill プロセスID を実行します PID TTY STAT TIME COMMAND
1197 ? Ss 0:00 /lib/systemd/systemd --user
1200 ? S 0:00 (sd-pam)
1215 ? S 0:00 sshd: pi@pts/0
1218 pts/0 Ss 0:00 -bash
1267 pts/0 S 0:02 python3 photo-temp.py
1275 pts/0 R+ 0:00 ps x
ArduinoからAmbientへ送信
つかうもの
ESP32 PICO内臓のM5StickC PLUSを使用しました。
ESP32などの無線モジュールを搭載のArduinoであれば構いません。
Ambientライブラリのインストール
Arduino IDEのライブラリマネージャを開き「ambient」で検索します。「Ambient ESP32 ESP8266 lib」の最新をインストールします。
Ambientへデータ送信
Arduino(M5StickC PLUS)からAmbientへデータ送信するプログラムを紹介します。
WiFi接続のSSIDとパスワードおよび、Ambientで作成したチャネルIDとライトキーを書き加えてください。ambient.set(番号, データ)の形でデータを送信します。
#include <M5StickCPlus.h>
#include "Ambient.h"
const char * ssid = "WiFi SSID";
const char * password = "WiFi パスワード";
const int channelId = チャネルID;
const char * writeKey = "ライトキー";
WiFiClient client;
Ambient ambient;
void setup() {
Serial.begin(115200);
Serial.println("WiFi connecting....");
WiFi.begin(ssid, password); // Wi-Fiの初期化
while (WiFi.status() != WL_CONNECTED) { // Wi-Fiアクセスポイントへの接続待ち
delay(500);
}
Serial.println("WiFi connected!!!");
ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
}
void loop() {
int v1 = rand() % 10 + 1;
int v2 = rand() % 10 + 1;
ambient.set(1, v1);
ambient.set(2, v2);
ambient.send();
delay(30 * 1000); // 30秒以上あける
}
詳しくはこちらの公式ページをご覧ください。 Arduinoライブラリー – Ambient
こちらの画像のように、Arduinoからデータ送信してAmbientでグラフ表示させることができました。
静電容量型の土壌湿度センサを使ってArduinoで土の水分量測定 の記事もご覧ください。
WiFiライブラリでのエラー
M5StickC PLUSでWiFiライブラリを使おうとすると、次のようなエラーが発生しSketchをアップロードできませんでした。
Traceback (most recent call last):
File "/Users/mopipico/Library/Arduino15/packages/m5stack/tools/esptool_py/3.0.0/esptool.py", line 39, in <module>
import serial
ImportError: No module named serial
Multiple libraries were found for "WiFi.h"
Used: /Users/mopipico/Library/Arduino15/packages/m5stack/hardware/esp32/1.0.7/libraries/WiFi
Not used: /Applications/Arduino.app/Contents/Java/libraries/WiFi
exit status 1
Error compiling for board M5Stick-C-Plus.
解決方法
Arduino IDEに含まれている既存のWiFiライブラリと名前が、バッティングしているとのことです。Arduino IDEに付属していたWiFiライブラリを削除するとコンパイルが通りました。
/Applications/Arduino.app/Contents/Java/libraries/WiFi