マイコンからAmbientへデータ送信してグラフ化

 

こんなこと、やります。

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

マイコンでAmbientへデータ送信してグラフ化
マイコンでAmbientへデータ送信してグラフ化

Ambientの使い方

Ambientの使い方をカンタンに説明します。

Ambientとは

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

Ambientのざっくりとした手順

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

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

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

利用制限

Ambientへ送れる一日のデータ件数は、1チャネルあたり3000件となってます。それ以上を超えると413エラーが返ってきます。

30秒以上の間隔を空けて送信すれば、制限以内におさまる計算になります。

Ambientの利用制限についてはこちらをご覧ください。

Raspberry PiからAmbientへ送信

Raspberry PiからAmbientへ送信する方法を解説します。

つかうもの

Raspberry Pi zero WHを使用しましたが、無線機能が使えればお好きなRaspberry Piで構いません。

そのほか、データを取得できる各種センサをお使いください。

Ambientライブラリのインストール

ラズパイでAmbientを使えるようにするため、PythonのAmbientライブラリをインストールします。

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

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

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ライブラリの詳しい使い方は、こちらをご覧になってください。

実践:照度と水温をAmbientへ送信してみた

実際に、ベランダの照度と水耕栽培の水温を測って、Ambientにデータを送信してみました。照度センサーと温度センサーの使い方は、ラズパイで照度と温度を測定してみた【フォトトランジスタ・TMP36】をご覧ください。

水耕栽培の水温と照度をラズパイで測定
水耕栽培の水温と照度をラズパイで測定

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

Ambient照度グラフ
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 ESP32 ESP8266 lib
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でグラフ表示させることができました。

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
記事に関するご質問などがあればTwitterへお返事ください。
この記事で紹介した商品
人気のラズパイ
人気のラズパイ周辺機器
Raspberry Piのオススメ入門書
関連記事