Wio LTE君とSORACOM Beamで「だっしゅぼたん」を作る

## 作ったもの

これだよ

![IMG_0181.JPG](https://qiita-image-store.s3.amazonaws.com/0/22754/0b460d2d-77a4-7a2f-7fdc-6113a53e6364.jpeg)

このエントリーでは、このボタンを作るにあたって解説します。SORACOM Beam とか ifttt については解説しません(!?)

### 構成図

<img src="https://docs.google.com/drawings/d/e/2PACX-1vRV9OFmtwhTZxvaP2FVZLMu9F1mTx1GKH3jnjfRWYd8w1Ak-0VTZgVGQFRTbLqAddrq8a18_nXr59Rg/pub?w=892&amp;h=583">

SORACOM Beam と ifttt と MicroBot Push を組み合わせて、ガレージの「開」ボタンを押す、壮大な仕組みを実現しています

[![Handmade Dash Button](http://img.youtube.com/vi/Fhh8atuBUvM/0.jpg)](http://www.youtube.com/watch?v=Fhh8atuBUvM)

興味のある方はコメントください。

## ハードウェア編

プラボックスの中身はこんな感じです。

![IMG_0183.JPG](https://qiita-image-store.s3.amazonaws.com/0/22754/a75d7f1e-7cf1-6d3c-ae46-56114fd92366.jpeg)

※2/13: コメントにもいただきましたが、このままだとWio LTEとGrove端子台が触れ合ってしまうかもしれませんので、Grove端子台を固定するなりビニール袋等で絶縁するようにしましょう

### 買ったもののまとめ

* [日東工業 / PCS形プラボックス Φ30穴加工タイプ](https://www.monotaro.com/p/3943/8892/?displayId=4) (約1200円)
* [タカチ電機工業 / T-600型貼り付けボス](https://www.monotaro.com/p/8835/9555/?displayId=4) (約650円)
* [エスコ / M 3 x10mm 鍋頭小ねじ(ポリカーボネート/50本)](https://www.monotaro.com/g/02444859/) (約400円)
* [IDEC(和泉電気) / Φ30 押ボタンスイッチ(大形)](https://www.monotaro.com/p/5136/8713/?displayId=4) (約770円)
* [Grove Screw Terminal (端子台モジュール)](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4RLR) (約360円)

計 3380円 (Wio LTE本体は含まれてないよ)

あと10KΩ抵抗とかは一般のご家庭にもあるかと思いますので、そちらをお使いください。

### プラボックス

[日東工業 / PCS形プラボックス Φ30穴加工タイプ](https://www.monotaro.com/p/3943/8892/?displayId=4) (約1200円) を使いました。

その他「コントロールボックス」や「コマンドボックス」というキーワードで探せば見つかるでしょう
**注意**: 材質はプラスチックなモノを選びましょう。金属製なボックスでアンテナを中に格納してしまうと、電波が（すごく）弱くなります。

### プラボックスへの Wio LTE 取り付けTIPS 

Wio LTE のネジ穴サイズはM3です。通常はプラボックスに穴をあけるなどしてM3の受けを作る必要がありましたが、貼りつけタイプのボスがあるんですね、便利です。

[タカチ電機工業 / T-600型貼り付けボス](https://www.monotaro.com/p/8835/9555/?displayId=4) (約650円)
※[Mbed Cloudの話とWio LTEの話](https://qiita.com/jksoft/items/aab1b5c45766472cad24)で紹介されてた。

![IMG_0221.JPG](https://qiita-image-store.s3.amazonaws.com/0/22754/bdc66ed2-07cf-434b-acd3-a7857ffb674a.jpeg)

こんな感じで取り付けることができます。あとは裏面に粘着面があるので、それでプラボックスに貼りつければOK!

![IMG_0222.JPG](https://qiita-image-store.s3.amazonaws.com/0/22754/54d0677c-7f1f-4da1-2994-3187428ea3b8.jpeg)

ちなみにWio LTEのネジ穴周辺にも実装がされているため、金属製のネジだとショートしたりするかも。ということで、ポリカーボネートなネジを使うのがいいかもしれません。
※ただし**締めすぎると実装が剥げてしまうかもしれないので注意！！**

[エスコ / M 3 x10mm 鍋頭小ねじ(ポリカーボネート/50本)](https://www.monotaro.com/g/02444859/) (約400円)

### 押しボタンスイッチと回路

押しボタンスイッチはA接点で、直径30mmの穴にピッタリとハマり、しかも乱暴に扱っても壊れない感があるのが [IDEC(和泉電気) / Φ30 押ボタンスイッチ(大形)](https://www.monotaro.com/p/5136/8713/?displayId=4) (約770円) です。
※ちなみに直径30mmのほか、22mmってのが規格であるみたい。そっちの方が小さく済むかも。

使い方は[タクトスイッチ](http://daisuki-arduino.com/arduino_program_sw/)と全く同じです。同じなので、プルアップ抵抗も必要になります。(Wio LTE は Arduino のように内部にプルアップ抵抗の仕組みがありません)

10KΩの抵抗を、ブレッドボードなど使わず直接接続しています。
接続先はWio LTEに直接ではなく [Grove Screw Terminal (端子台モジュール)](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4RLR) に接続しました

![IMG_0219.JPG](https://qiita-image-store.s3.amazonaws.com/0/22754/cbd15756-115b-d04d-2c4a-baf8c029434b.jpeg)

![IMG_0220.JPG](https://qiita-image-store.s3.amazonaws.com/0/22754/5f573a34-8aaf-efb3-a635-53857dd0d17e.jpeg)

## ファームウェア編

`attachInterrupt()` を使ってボタンが押された時のピン状態変化に応じて `change_state()` でステートを変化させ、`loop()` 内でそのステートに応じた処理を行うようにしています

- `change_state()` 内のdelayはチャタリング回避です (雑実装)
- `send_to_soracom()` 内では毎度 "モデムON → 接続 → 送信 → 切断 → モデムOFF" をしています。消費電力削減と再接続実装の回避です (雑実装)
    - 送信が完了するまで15～20秒/回かかります
    - 送信時の最大消費電力は300mA程度、それ以外の通常時は15mA～20mA程度です

```c++
:WioLTE_dashbutton.ino
#include <WioLTEforArduino.h>
#include <stdio.h>
#define BUTTON_PIN  (WIOLTE_D38)

WioLTE Wio;

volatile bool StateChanged = false;
volatile bool State = false;

void change_state()
{
  State = !State;
  StateChanged = true;
  delay(150);
}

void send_to_soracom()
{
  Wio.PowerSupplyLTE(true);
  delay(500);
  if (!Wio.TurnOnOrReset()) { SerialUSB.println("TurnOnOrReset Error"); return; } 
  if (!Wio.Activate("soracom.io", "sora", "sora")) { SerialUSB.println("Activate Error"); return; }
  int connectId;
  connectId = Wio.SocketOpen("beam.soracom.io", 23080, WIOLTE_UDP);
  if (connectId < 0) { SerialUSB.println("SocketOpen Error"); return; }
  char data[100];
  sprintf(data, "{\"uptime\":%lu}", millis() / 1000);
  if (!Wio.SocketSend(connectId, data)) { SerialUSB.println("SocketSend Error"); return; }
  char res[128];
  int len;
  len = Wio.SocketReceive(connectId, res, sizeof (res), 3000);
  if (len < 0) { SerialUSB.println("Error len < 0"); return; }
  if (len == 0) { SerialUSB.println("Error len == 0"); return; }
  if (!Wio.SocketClose(connectId)) { SerialUSB.println("SocketClose Error"); return; }
  if (!Wio.Deactivate()) { SerialUSB.println("Deactivate Error"); return; }
  Wio.PowerSupplyLTE(false);
}

void setup()
{
  Wio.Init();
  pinMode(BUTTON_PIN, INPUT);
  attachInterrupt(BUTTON_PIN, change_state, CHANGE);
}

void loop()
{
  if (StateChanged) {
    if (State) {
      send_to_soracom();
    }
    StateChanged = false;
  }
}
```

## あとがき

壮大なピタゴラスイッチ。
電源をなんとかしたい！