M5 / ガーデニング / プログラミング

M5StickCでガーデニングの水やりセンサを作る ~その2 【Ambientでデータ保存編】

こんにちはLineaです 
オリンピックも始まりましたが暑さは相変わらずですね

前回に引き続きM5SitickCで水やりセンサを作っています。前回では水分センサの数値をグラフィカルに表示しましたが、計測結果を保存していませんでした。

このままだと、あまり実用性がないので今回は計測したデータをAmbientというIoT向けのサービスにアップロードして保存します。

前回の記事はこちらです

Ambientとは

AmbientとはIoT向けのデータ保存、可視化を行ってくれるサービスです。

IoTデバイスから直接データを送信して保存してグラフで可視化できます。無料でアカウント作成だけで利用できて、気軽にサーバーにデータを保存できるので個人でIoTデバイスを作ってみる用途にはいいんじゃないでしょうか。

Arduinoやpythonなど各種言語に対応したライブラリも提供されているので組み込むのも簡単です。M5SitickCとUIFlowにも対応しています。

アカウント作成とチャネル作成までできている前提で進めていきますので公式のチュートリアルを参考にチャネルを作成しておいてください。

Ambient – Ambientを使ってみる https://ambidata.io/docs/gettingstarted/

UIFlowの準備

UIFlowでAmbientにデータを送信するには専用のブロックを導入する必要があります。公式の記事でも丁寧な導入方法が解説されていますが簡単に説明します。

Ambient – UIFlow(Blockly)でAmbientにデータを送る https://ambidata.io/samples/m5stack/uiflow/

公式で追加ブロックが用意されているのでダウンロードします。下のGithubページからCode⇒Download Zipで丸ごとダウンロードしましょう。

Ambientブロック(ambient.m5b) https://github.com/AmbientDataInc/UIFlow


UIFlowのブロックのカテゴリからCustom⇒Open *.m5b fileを選択してダウンロードしたambient.m5bファイルを開きます。追加されるとCustomの下にAmbientが追加されています。

プログラム

それでは前回のプログラムを元にAmbientへデータ送信するよう変更したプログラムがこちらです。

5秒おきに計測してグラフを表示する動作については前回から変わっていません
変更、追加した点は以下の部分です

  • ネットワーク(Wifi)への接続
  • 画面描画のオンオフ(節電)
  • 1分おきのAmbientへのデータ送信

それではポイントをそれぞれ解説していきます

まず、Ambientはネット上のサービスなのでM5StickCをネットワークに接続する必要があります。Setupイベントから始まる初期化にWifiへの接続ブロックを追加しています。Wifi接続ブロックはハードウェア⇒Networkにあります。

Wifi接続ブロックに接続するWifiアクセスポイントのSSIDとパスワードを設定することで接続できます。その次のwifi connectブロックは接続を確立するとのことで入れておくと接続が確実になるようです(無くても良さそう?)

次に少しでも長時間計測できるように画面の画面の表示をオフにできるようにしてみます。計測中は放置するので画面にずっと表示する必要もないので消して節電になるはずです。Aボタンで画面のオンオフを切り開けられるようにしてみます。

isSleepという変数を作成して、画面のオンオフの状態を保存します。Aボタンが押されたらisSleepを逆の状態(反転)にしてchangeSleep関数を呼び出します。ちなみにAボタンは正面のM5のロゴが彫られた箇所のボタンになります。

changeSleep関数はisSleepの状態でifブロック(論理カテゴリ)で分岐して、画面の明るさを変更します。オンのときにはグラフの描画関数updateGraphを呼び出してグラフの表示をさせます。

今回大きく変更したのはタイマー処理の部分です。今回はここにAmbinetへのデータ送信を追加しています。

タイマーの呼び出し間隔は前回と同様に5秒おきなのですが、毎回5秒おきにデータを送信しても変化が少なくあまり意味が無さそうなので、グラフ1周分の12回計測おきに平均を計算して送信するようにしています。これで5秒*12=60秒=1分おきで送信しています。

回数のカウント用の変数measureCountを計測ごとに1ずつ足していき、resultListの長さを超えたときに送信処理に入ります。送信処理に入ったときにmeasureCountは0にリセットしておきます。また、平均計算用の変数sumを用意しておきます。

wifiに接続されているかifブロックでチェックして問題なければ送信処理を行っていきます。foreachブロック(リストカテゴリ)でresultListに貯まっている計測値を全て足していきます。

次に追加しておいたAmbientブロックでデータを送信します。ブロックのchannelIDとwritekeyはAmbientのページで作成したチャネルページに表示されているものを入力してください。writekeyはクォーテーションで囲う必要があるので注意です。

dataには必ずMapを接続する必要があります。マップ作成ブロックでマップを作成しましょう。マップ内のデータのkeyにはd1~8までの送りたいデータスロットを指定します。valueに先程計算した合計sumresultListの長さで割って求めた平均を渡します。

最後に前回までの計測ごとのグラフ更新処理をisSleepではない(画面オン)のときだけ実行されるようにしておきます。また、画面がオフでも動いているのが分かるようにM5StickのLEDを一瞬だけ点けるようにしました。

動かしてみる

完成したプログラムを実行してトマトのプランターに突っ込んで放置してみました。

しばらくしてAmbientで作成したチャンネルのページを覗いてみると…

ちゃんと表示されています!!データ送信も成功です!!ヤッター!!!!
これでいつでもどこでも計測結果が見れるわ~い🎉 🎉 🎉 🎉 👏 👏 👏 👏

と、喜んでいたのですがよく見るとデータが1時間分しかない…
どうやら画面オフにしても内蔵のバッテリーだと保たないようですね…
1時間だとあまり変化がないのでもっと長いスパンで計測したいですよね~

調べてみるとネットワークに常時接続するのが結構食うらしいです。また、M5StickC自体にはスリープモードもあるようなのですがUIFlowからは入ることができないみたい… 裏で専用ファームウェアが動いているからでしょうか?
Arduino(C/C++)だとできる(それはそう)ようです

モバイルバッテリーでゴリ押すのもできるのですが、まだ消費電力を抑える方法があるなら試したいところ!
というわけで次回はArduino環境(C/C++)でスリープを使った計測をやってみます。
乞うご期待!(いつになるか…)

投稿者

Linea
本業はゲームプログラマー プログラミングやIT系の記事を書いていきます アイコンは愛車のシトロエン DS3です

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA