鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

Arduinoで1秒ごとに冷蔵庫の開け閉めをカウントして、1分ごとにデータを飛ばしたい。

1秒ごとに、集計して、1分ごとに飛ばす方法。
Arduinoにつないだセンサからの値をパソコンで記録する(1) | Ukkari blog

上記を参考に、以下のようなプログラムをしてみた。
チャンネル0に1分間の開け閉めカウントを入れてさくら通信モジュールでデータを飛ばす。

  if (acc_angle_x > 100 ){ //センサーの値を検知して開けたらフラグを立てる。要調整
    openFlg = 1;
  }
  if (nextTime < millis()) {
     nextTime = nextTime + 1000;  // Set Next analyze time
     if (openFlg == 1){
       openCount++;
       openFlg = 0;
     }
  }
  if (sakuraTime < millis()) {
    sakuraTime = nextTime + 60000;  // Set Next send time
    sakuraio.enqueueTx(0,openCount);
    sakuraio.send();
    openCount = 0;   
  }


さくらで飛ばしたデータをWebSocketでつながったBluemix上のNode-REDで受ける。
それをAmbientへ飛ばす。

f:id:kechiya:20170118075959p:plain

functionの中身

var payload = msg.payload.payload;

var data = {
    "d1" : payload.channels[0].value
};
msg.payload = data;
return msg;

これで、うまくいけば表示できるはず。

都度都度データを送ってNode-REDでデータを蓄えずに、Arduinoで蓄える。

Ambientへデータを送って、解析する方法で行こうと考えたけれど、
よくよく考えたらArduinoである程度解析し、その結果をNode-REDで受けて
Ambientへ渡すのが効率的ということに気づいた。
これならNode-REDで蓄えておく必要もなくなる。

以下は、6軸ジェイセンサーの値を100msecごとにとったグラフを
ArduinoIDEのシリアルプロッタで表示。
f:id:kechiya:20170117211623p:plain

例えば、冷蔵庫の開け閉めを適当に閾値を設けて検出。
60秒間の開け閉め回数をSakuraIotで飛ばして、Ambientで可視化すればいいのかな。

Ambientは5秒ごとで受け取るのでNode-REDでデータを蓄えておくりたい

Ambientは5秒間隔以上でないとデータを受け付けない。
よってNode-REDから1秒毎にデータを送っても間引かれてしまうことになる。
そのため、Node-REDで値を溜め込んで、5秒以上の間隔で溜め込んだデータを
まとめて送る必要がある。

まとめて送る方法、データのフォーマットは以下から

https://ambidata.io/blog/2016/06/13/bulk_send/

Node-REDのflowへ配列でデータを蓄えておく。

Node-REDでデータを蓄える方法は
context,flow,globalというところがあって、
qiita.com
場面場面、適切に使わないといけません。

さくらIot+Bluemix(Node-RED)+Ambientでグラフを描写するまで

http://sssslide.com/www.slideshare.net/sakura_pr/iot-platform-20161201

Node-REDアプリの作成

BlueMixへログイン、カタログからNode-REDスターターで
アプリ名を入力して、作成ボタンを押す
起動されるので
あとはhttpでアクセスするだけ。簡単ですね。

Node-RED エディタ

WebSocketをドラッグ&ドロップする
PathへさくらのIotのWebSocketのパスを入力
f:id:kechiya:20161224081720p:plain
とりあえず、WebSocketノードとデバッグノードをGUIでつなぎこむだけでNode-RED上で値の取得が確認できた。

次はグラフ化してみましょう

グラフ表示する外部サービスAmbientへ登録
https://ambidata.io

BlueMixからAmbientノードを作るために

qiita.com

Ambientで表示するためには

Ambientで描写するためには、チャンネルの値をd1,d2…と言う値に変えて
あげる必要がある。ここはNode-Redでのコーディングが必要になります。

さくらのデータからAmbientノード用のJSONへ変換するときに

JSONが文字列なので、そのままでは値が取り出せません。オブジェクトに変換する必要ありはまりました。
qiita.com

JSONノードの後段にfunctionノードを配置して以下のように変換関数を
コーディングしてみました。

var payload = msg.payload.payload;

var data = {
    "d1" : payload.channels[0].value,
    "d2" : payload.channels[1].value,
    "d3" : payload.channels[2].value
};
msg.payload = data;
return msg;

ジャジャジャーン。表示できました。

f:id:kechiya:20161224162329p:plain

JSONノード、Functionノードをつなげるだけで、ほぼコーディングレスでグラフ化までできることが証明されたのでありました。
以下のような感じ。

f:id:kechiya:20161224163840p:plain

あとは、本物のセンサーが届くのを待つのみ!!

さくらの聖夜2016に参加

働きがい

働きがいかぁ。自分の会社だとチャレンジする人が
あまりいない感じ。社長もいつていましたがこれは
会社から与えられないもの。社員が作り出していくもの。

働きやすさ

さくら昇給3年で2割という数字に愕然。自分は10数年で
月額2千円。極貧生活。よく辞めずにいると思う。

うまいプレゼン

うまいなプレゼン。早口ではなく落ち着いた語り口。
やつぱりすごい。

コストカツトから売上拡大へ

やっぱ新規事業ですよね。

そんな感じで刺激をもらいました。
ボツチで懇親はあんまりできず。

さくらIot 通信モジュール動いているか試して見るが・・・

LEDの2回点滅が1回になって、コントロールパネルではオンラインになった。

AlphaCompatをマイコンへ書き込み、動作確認していますが「Waiting to come online」でピリオドが出力され続けるだけとなっています。

デフォルトのままで、ジャンパーピンはセットしていないので、その辺が必要なのかな?

こちらを読むと、ジャンパー設定していますね。やってみましょう。

qiita.com

あとノウハウとしては、サンプルソースはAlphaCompat(deprecated)ではなくて
以下のドキュメントにあるexampleを書き込んで、動かしました。
github.com

2回点滅(圏外)のままの時の対処

なんか、電波が安定しないぞ。ケチってArduino互換を使っているから?
と勘ぐってしまったけれど、ヒントとなるツィートを発見した。
とても助かった。AC電圧が重要らしいぞ!!!
なんか、昔ArduinoようにACアダブターを買っていたのだぁ!