この記事は、SORACOM Advent Calendar 2017の12日目の記事です。
昨日は、 @haruka925 さんの「SORACOM Global SIMをミャンマーで使ってみた - Qiita」でした!
先日開催されたWio LTE ユーザーイベントでWio LTEと連携できるGroveを普段の実体験からというタイトルで登壇させていただきました。 @tseigo です。
その際にちょっと駆け足に説明して、もったいなかったなーと思っている、Wio LTEのIFTTTサンプルコードで色々なGroveでデジタル出力するところをお伝えします。
プログラム書いてみた
まず、
SeeedJP/WioLTEforArduino
https://github.com/SeeedJP/WioLTEforArduino
を参考にして、
WioLTEforArduino/grove-button.ino at master · SeeedJP/WioLTEforArduino
https://github.com/SeeedJP/WioLTEforArduino/blob/master/examples/grove/grove-button/grove-button.ino
が、Groveデジタル出力のサンプルコードです。
こちらをWio LTEでDFUモードにして書き出しつつ、GROVEのボタン(パネルタイプ)をD38に取り付けてArduinoのシリアルモニタで見てみます。
OFFのときは . で、ONのときは * でめちゃくちゃ分かりやすく挙動が確認できます。
IFTTTサンプルコードに合体させる
こちらを、Wio LTEのIFTTTサンプルコードと合体させます。
WioLTEforArduino/ifttt-webhook.ino at master · SeeedJP/WioLTEforArduino
https://github.com/SeeedJP/WioLTEforArduino/blob/master/examples/http/ifttt-webhook/ifttt-webhook.ino
こちらを参考に以下のように合体させます。
#include <WioLTEforArduino.h>
#include <stdio.h>
#define APN "soracom.io"
#define USERNAME "sora"
#define PASSWORD "sora"
#define WEBHOOK_EVENTNAME "wiolte_uptime"
#define WEBHOOK_KEY "WEBHOOK_KEY"
#define WEBHOOK_URL "https://maker.ifttt.com/trigger/"WEBHOOK_EVENTNAME"/with/key/"WEBHOOK_KEY
#define BUTTON_PIN (WIOLTE_D38)
#define INTERVAL (1000)
// #define INTERVAL (60000)
WioLTE Wio;
void setup() {
delay(200);
SerialUSB.println("");
SerialUSB.println("--- START ---------------------------------------------------");
pinMode(BUTTON_PIN, INPUT);
SerialUSB.println("### I/O Initialize.");
Wio.Init();
SerialUSB.println("### Power supply ON.");
Wio.PowerSupplyLTE(true);
delay(5000);
SerialUSB.println("### Turn on or reset.");
if (!Wio.TurnOnOrReset()) {
SerialUSB.println("### ERROR! ###");
return;
}
SerialUSB.println("### Connecting to \""APN"\".");
delay(5000);
if (!Wio.Activate(APN, USERNAME, PASSWORD)) {
SerialUSB.println("### ERROR! ###");
return;
}
}
void loop() {
char data[100];
int status;
int buttonState = digitalRead(BUTTON_PIN);
SerialUSB.print(buttonState ? '*' : '.');
if(buttonState == HIGH){
SerialUSB.println("### Post.");
sprintf(data, "{\"value1\":\"uptime %lu\"}", millis() / 1000);
SerialUSB.print("Post:");
SerialUSB.print(data);
SerialUSB.println("");
if (!Wio.HttpPost(WEBHOOK_URL, data, &status)) {
SerialUSB.println("### ERROR! ###");
goto err;
}
SerialUSB.print("Status:");
SerialUSB.println(status);
err:
SerialUSB.println("### Wait.");
delay(INTERVAL);
}
delay(INTERVAL);
}
改修は最低限で、IFTTTサンプルコードは60秒ごとにチェックしているため、INTERVALをGroveのON/OFFチェックのほうに寄せて1秒チェックにしつつ、押された時(buttonState == HIGH)のときだけIFTTT送信が発動するようにしています。
こちらを書き込んで動かしてみます。
Arduinoのシリアルモニタで見ていると無事反応してます。
色々なGroveでデジタル出力してみる
Groveでデジタル出力できるものは色々あります。
今回のコードを一度書き込んでおけばGrove側を物理的に取り付け替えるだけで試せるので、Groveのプロトタイプのしやすさ、そこにWio LTEによってSORACOMのLTE通信の恩恵が得れることを、すぐ試せるのでオススメです!
私の持っているものでいくつか紹介させて下さい。
レゴブロックにもくっつくGrove純正のWrapperで、試しやすいように構造を仮で作ります。
裏はこんなかんじ。バッテリーを支えています。
タッチセンサー
まずは、タッチセンサーです。
指で触るだけで反応するので、ボタンより少ない力で反応させることが出来ます。
傾きセンサー
つづいて、傾きセンサーです。登壇でもちらっと紹介させていただきました。
これは、このセンサーが傾くとONになる仕組みで、ボタンとは違った反応を取ることが出来ます。(センサーに刻印されているJ1の方向)
もちろん複雑な傾き変化であれば、加速度センサーやジャイロセンサーのほうが良いですが、普段が平坦であって転倒のような分かりやすい傾きを取りたい場合は用途にピッタリです。
磁気スイッチ
反応が変わると言えば、磁気スイッチもオススメです。
このグリーンのブツは磁石でして、近づけるとON、普段はOFFという反応をします。これをどう使うかというと、例えばドアの開閉。ドアに磁気センサーをつけておいて、ドア枠の方に磁石を付けておくと開閉がとれます。
もっとクールな実装ですと、 @yamacho1111 さんの作られた 忘年会シーズン到来!結果にコミットするモノを作ってみた にある、ベルトの締め付け判定に使われています。ぜひご参考下さい。
ほかには?
以下のセンサーも試しました。
-
GROVE - PIRモーションセンサ - スイッチサイエンス
- ちゃんと人感が取れる。ただし、数秒間ONが継続するので運用の際は調整が必要。試すには良い。
-
GROVE - 音センサ - スイッチサイエンス
- 本来、アナログ値として、音圧がとれるが、振り切れるくらいの大きな音(至近距離の拍手くらい)だとONとして捉えられる
-
GROVE - 水センサ - スイッチサイエンス
- 水滴がつくとONを取れる
ほかにも、調べるときっといろいろなデジタル出力のGroveがあると思います!
まとめ
ということで、Wio LTEのIFTTTサンプルコードで色々なGroveでデジタル出力するメモをお伝えしました。
登壇のデモは、IFTTTでは、WebHook → Slack 出力というのをやってまして、ボタンを押すたびに、このようにうまく動きました。今回の記事を書くときも、バッチリ動いていて、気持ちいい!
このように、Wio LTE + SORACOM SIM で実現しているLTE通信は安定して素晴らしいですね。Wi-Fiの場合、自前のテザリングで行ったとしても時の運というところがありますが、LTEではいつでもキビキビと良い感じに動いてました!
明日は
@kuronyankotan さんの「BLE端末から頑張ってデータ取得をしてSORACOMでデータ集積してみる」です。
私も、ちょうど、BLE関連をさわる機会が増えてきていて、BLE関連をさわる機会が増えてきていてBLEデータをネットワークにうまく送る時はいつも悩むので楽しみです!