【Raspberry Pi】Ambientへセンサデータを送信してグラフ化

こんなこと、やります。 - Ambientクラウドサービスを使ってみる - Raspberry Pi と Arduino(ESP32系)を使ってAmbientへデータ送信 - Ambientでログデータをグラフ化

Ambientの使い方
Ambientの使い方を簡単に説明します。
Ambientとは
Ambientとは、センサなどのデータをグラフ化してくれるクラウドサービスです。無料で利用できます。自前のサーバーを用意する必要がないのでちょっとしたログを取りたいときにたいへん便利です。
https://ambidata.io/
Ambientのざっくりとした手順
- Ambientにログインし、新しくチャネルを作成する
- データを書き込む場合は「チャネルID」と「ライトキー」が必要
- チャネルの設定で、データ種類の分だけ項目を追加
- チャネルのボードを開いて、チャートを作成する


利用制限
Ambientへ送れる一日のデータ件数は、1チャネルあたり3000件となってます。それ以上を超えると413エラーが返ってきます。
30秒以上の間隔を空けて送信すれば、制限以内におさまる計算になります。
Ambientの利用制限についてはこちらをご覧ください。 https://ambidata.io/refs/spec/
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': 数値})
の形でデータを送信するだけです。
= ambient.Ambient(チャネルId, ライトキー)
am
try:
= am.send({'d1': 数値, 'd2': 数値})
res print('sent to Ambient (ret = %d)' % res.status_code)
except requests.exceptions.RequestException as e:
print('request failed: ', e)
PythonのAmbientライブラリの詳しい使い方は、こちらをご覧ください。 https://ambidata.io/refs/python/
実践:照度と水温をAmbientへ送信してみた
実際に、ベランダの照度と水耕栽培の水温を測って、Ambientにデータを送信してみました。照度センサと温度センサの使い方は、 をご覧ください。

こちらの図のように、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() {
.begin(115200);
Serial.println("WiFi connecting....");
Serial.begin(ssid, password); // Wi-Fiの初期化
WiFi
while (WiFi.status() != WL_CONNECTED) { // Wi-Fiアクセスポイントへの接続待ち
(500);
delay}
.println("WiFi connected!!!");
Serial
.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
ambient}
void loop() {
int v1 = rand() % 10 + 1;
int v2 = rand() % 10 + 1;
.set(1, v1);
ambient.set(2, v2);
ambient.send();
ambient
(30 * 1000); // 30秒以上あける
delay}
詳しくはこちらの公式ページをご覧ください。 https://ambidata.io/refs/arduino/
こちらの画像のように、Arduinoからデータ送信してAmbientでグラフ表示させることができました。
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
関連記事
- ESP32でESP-NOWを使って通信してみよう
- ESP32でWiFi接続を簡単にする「WiFiHelper」ライブラリ開発のリリースノート
- DS18B20の使い方|Arduino・ESP32・Raspberry Pi
- ESP32で照度センサTSL25721を使ってみた
- ESP32でNTPClientライブラリを使って現在時刻を取得する方法