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

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

こんなこと、やります。

  • Ambientクラウドサービスを使ってみる
  • Raspberry Pi と Arduino(ESP32系)を使ってAmbientへデータ送信
  • Ambientでログデータをグラフ化

イメージ
イメージ

Ambientの使い方

Ambientの使い方を簡単に説明します。

Ambientとは

Ambientとは、センサなどのデータをグラフ化してくれるクラウドサービスです。無料で利用できます。自前のサーバーを用意する必要がないのでちょっとしたログを取りたいときにたいへん便利です。

Ambient–IoTデータ可視化サービス

Ambientのざっくりとした手順

  1. Ambientにログインし、新しくチャネルを作成する
  2. データを書き込む場合は「チャネルID」と「ライトキー」が必要
  3. チャネルの設定で、データ種類の分だけ項目を追加
  4. チャネルのボードを開いて、チャートを作成する

チャネルの設定
チャネルの設定

チャートの作成
チャートの作成

利用制限

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ライブラリをインストールします。

shell
$ pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.git
$ pip3 list | grep ambient
ambient       0.1.6 

Ambientを使うには、ambientrequestsをインポートします。

py
import ambient
import requests

Ambientへデータ送信

Ambientにデータを送信するやり方を説明します。

下のプログラムのように、Ambientで作成したチャネルIDライトキーを設定します。あとは am.send({'d1': 数値, 'd2': 数値}) の形でデータを送信するだけです。

py
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) をご覧ください。

水耕栽培の水温と照度をRaspberry Piで測定
水耕栽培の水温と照度をRaspberry Piで測定

こちらの図のように、Ambientでログデータをグラフ化できました。

Ambient照度グラフ
Ambient照度グラフ
Ambient水温グラフ
Ambient水温グラフ

SSHで実行するとプログラムが途中で止まってしまう場合

Raspberry PiをSSHでリモートコントロールしている場合、SSHをログアウトすると実行しているプログラムも終了してしまいます。ログアウト後もプログラムを実行し続ける場合は、$ nohupコマンドを使ってプログラムを実行させます。

shell
$ nohup python3 photo-temp.py > out.log &

プログラムを終了させる場合

nohupで実行したプログラムを終了させる場合は、$ ps x でプロセスIDを調べ、 $ kill プロセスID を実行します
shell
  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 ESP32 ESP8266 lib
Ambient ESP32 ESP8266 lib

Ambientへデータ送信

Arduino(M5StickC PLUS)からAmbientへデータ送信するプログラムを紹介します。

WiFi接続のSSIDパスワードおよび、Ambientで作成したチャネルIDライトキーを書き加えてください。ambient.set(番号, データ)の形でデータを送信します。

cpp
#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でグラフ表示させることができました。

Ambientでグラフ表示
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

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

スマート農業(スマートアグリ)で使えるセンサー
水耕栽培はじめよう!