気軽にIoTデバイスをつくろう

#はじめに
この記事はリンク情報システムが主催するイベント「[Tech Connect! Autumn](https://qiita.com/dgkz/items/4c3a449f3168d6c787cf)」のリレー記事です。
「[Tech Connect! Autumn](https://qiita.com/dgkz/items/4c3a449f3168d6c787cf)」は engineer.hanzomon のグループメンバによってリレーされます。
（リンク情報システムのFacebookは[こちら](https://ja-jp.facebook.com/lis.co.jp/)から）
千秋楽の担当は2度目登場のmk-takahashiです。

本日は秋分の日ですね。
秋分の日は「祖先を敬い、亡くなった人をしのぶ日」として1948年に国民の休日として制定されています。
みなさんも今日はこの記事を見た後、PCを閉じて家族と一緒に祖先の話をしたり、仏壇に手を合わせてみてはいかかでしょうか。

というわけで本題に入ります。

#きっかけ
みなさんはこんな経験ありませんか。


**「会社(or学校)行かなきゃ」**

　**~家を出て数分後~**

**「あれ、鍵閉めたっけ...」**

**「いや、閉めたはず!!」**

　**~さらに数分後~**

**「不安になってきた...」**

**「家に戻って確認しなきゃ...」**


私はたまにあります。
こんな日は朝から憂鬱な気分になります。

これを解消したいなと常々考えていました。
が、~~作るのめんどくさいし~~なかなか時間が作れなくて後回しになっていました。

そんなわけで今回はそんな悩みを解消するための何かを作ろうと思います。

#なにをつくろう
まず家の外から家の鍵の状態をチェックできるようにする必要があります。
それにはやはりIoTが最適かと思います。
鍵にセンサーを付けて、センサーの値をマイコンで拾ってサーバに投げてやればいいのです。

ただきっかけでも述べましたが、私は~~めんどくさがりで~~時間がなかなか作れないのであんまり手間のかかるものは好きではありません。

なのでタイトルにもある通り、気軽にIoTデバイスを作ろうと思います。

##モジュールの選定

最近(結構前からあるけど)ではWiFiモジュールかつファームウェアの書き換えでArduinoマイコンとしても使えるESP-WROOM-02があるのでこれを使えば楽ができそうです。
ライブラリも豊富で楽をするのにもってこいです。

ただひとつ問題があります。
ESP-WROOM-02のファームウェア書き込みを行うためには開発ボードを使用するか、書き込み基板を作る必要があります。
当然書き込み機能のある開発ボードのほうが値段が高いです。
書き込み基板はひとつ作れば使い回しできるので手間はありますが、安く済みます。

筆者としては今後、IoTデバイスを複数作って運用したいとも考えてもいるので、可能な限り費用は抑えたい。

なので今回は書き込み基板も作成します。

よって今回の記事では
　**・書き込み基板を作る編**
　**・IoTデバイスを作る編**
の２部構成でお送りします。

#書き込み基板を作る編
##使用する部品
・[ESP-WROOM-02](http://akizukidenshi.com/catalog/g/gK-09758/)
・ユニバーサル基板
・タクトスイッチ×2
・ピンソケット
・ピンヘッダ
・３端子レギュレータ 3.3V
・セラミックコンデンサ 0.1μF
・電解コンデンサ 47μF
・抵抗 10KΩ×5
・[USBシリアルアダプター](https://www.switch-science.com/catalog/342/)

##環境
・macOS High Sierra バージョン10.13.6
・Arduino IDE 1.8.6

##準備
まずArduino IDEにESP-WROOM-02のボードマネージャをインストールします。
これをしないとArduino IDEにESP-WROOM-02のボード情報がないのでビルドも書き込みも行えません。
基本的には[こちらのブログ](https://toshipedia.jp/20160111434/)の手順に沿って実施すればインストールできると思います。

一応こちらでも簡単に解説入れます。

1.[Preferences]をクリックする。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/1b0557e8-1160-bad6-27f5-2a74a09d7aac.png" width=70%>

2.[追加のボードマネージャのURL]の右横にあるアイコンをクリックする。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/55e4c0b6-2cba-cbcc-ef9a-4ede787bf34a.png" width=70%>

3.[ http://arduino.esp8266.com/stable/package_esp8266com_index.json ]をリストに貼り付ける。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/b8062db0-fa3c-8ba2-32c3-9af159c6a6a9.png" width=70%>

4.[ツール]から[ボードマネージャ]を選択する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/8b01a867-7601-0530-5147-4a7860b501d0.png" width=70%>

5.検索窓に[esp8266]と入力し、[esp8266 by ESP8266 Communlty]をインストールする。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/5e994f10-07a0-f995-0c55-b98a67950a53.png" width=70%>

6.ボードの[Generic ESP8266 Module]を選択する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/19388555-6e22-510e-f2d3-2bf523cb5c39.png" width=70%>

以上で準備完了です。

##基板作成
[](
回路図は以下の通りになります。
)[回路図は後日掲載します。]

回路図を元にして基板を作成しました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/c8dbeaa6-787d-a0b5-dec3-9d56849133d1.jpeg" width=70%>

全て外した状態
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/d0f120c8-c038-5574-d0e8-a7918896b421.jpeg" width=70%>

##書き込み
書き込みができるかどうか空のコードを書き込むことでテストします。

書き込み方は以下の手順で行います。
1.[→]ボタンを押して、コンパイルと書き込みを行う。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/66dca46d-ca08-871f-6c10-e0285d6ae1e6.png" width=70%>

2.[最大1044464バイトの〜]のログが出たタイミングでリセットボタン（黒いボタン）、書き込みモード切替ボタン（赤いボタン）の順番に押して離す。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/7e4736fb-6d8b-323b-02e3-9931a43a1d68.png" width=70%>

3.書き込み完了
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/3d36360e-793f-ee8d-2933-c7a43a265c26.png" width=70%>

以上の手順が完了したら書き込み基板を作る編は終了です。



ちなみにボタンを押すタイミングがずれると以下のようなログが出て、書き込みに失敗します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/0ba80337-a925-0db2-9303-1792ef0fe721.png" width=70%>

#IoTデバイスを作る編
##使用する部品
・[ESP-WROOM-02](http://akizukidenshi.com/catalog/g/gK-09758/)
・ユニバーサル基板
・ピンソケット
・抵抗 10KΩ× 6
・単３電池ボックス
・チルト（傾斜）センサー

うちの鍵は[サムターン](https://www.miwa-lock.co.jp/lock_day/glossary/lock/2.html)なので鍵が縦状態と横状態になっているのを検出できればOKです。
なのでチルト（傾斜）センサーを用いてその状態を測定します。

##環境
・macOS High Sierra バージョン10.13.6
・Arduino IDE 1.8.6

##準備
今回はMQTTを使用するのでArduinoのMQTTライブラリであるPubSubClientとオープンソースのMQTTブローカーであるMosquittoを導入します。

###PubSubClientの導入
1.[Git](https://github.com/Imroy/pubsubclient)から[pubsubclient-master]をダウンロードする

2.[ライブラリのインクルード]から[.ZIP形式のライブラリをインストール]を選択し、1.でダウンロードしたファイルをインストールする。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/262fb8b6-75f4-cdea-1937-c9444c70f97b.png" width=70%>

###Mosquittoの導入
1.ターミナルを開いて以下のコマンドを実行する。

```
brew install mosquitto
```

##基板作成
[](
回路図は以下の通りになります。
)[回路図は後日掲載します]

回路図を元にして基板を作成しました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/f787c6d4-de71-508c-8927-0580ccfb80e4.jpeg" width=70%>

全て外した状態
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/facf5e13-c968-508f-8b9b-7d98d527ca66.jpeg" width=70%>

※作成した基板は鍵に無理やり取り付けてください。

##コード
今回はPubSubClientのサンプルをベースに使い、Serial通信の削除、LED点灯の削除、チルトセンサーの値の読み込み等を追加しています。
チルトセンサーの値が0のときは鍵は横向き、1のときは縦向きになります。

```C:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "*******";        // 任意のアクセスポイントのSSID
const char* password = "*******";    // 任意のアクセスポイントのパスワード
const char* mqtt_server = "*******"; // MQTTブローカーを入れたPCのIPアドレス

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup_wifi() {

  delay(10);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  randomSeed(micros());
}

void reconnect() {
  while (!client.connected()) {
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str())) {
      client.publish("outTopic", "hello world");
    } else {
      delay(5000);
    }
  }
}

void setup() {
  pinMode(4, INPUT);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    value = digitalRead(4);
    snprintf (msg, 75, "value #%ld", value);
    client.publish("outTopic", msg);
  }
}
```

##動作検証
1.ターミナルを２つ立ち上げる

2.片方のターミナルに以下のコマンドを入力

```
 /usr/local/opt/mosquitto/sbin/mosquitto
```

3.もう一方のターミナルに以下のコマンドを入力

```
mosquitto_sub -h MQTTブローカーのIPアドレス -t outTopic
```

4.基板に電源投入
[mosquitto_sub]を実行しているターミナルに以下のような表示がされる。
<img src="https://qiita-image-store.s3.amazonaws.com/0/286312/5ef7dfce-85e3-8b9c-41ab-aac69570134b.png" width=70%>


#結果&今後
以上の流れでPC上から鍵の状態が監視できるようになりました。

ただ今のままの実装だと常時動き続けるので電池がすぐになくなります。
なので今後、10分に一回計測してあとはSleepするといった実装が必要になります。

また現状はIoTデバイスを作って動作確認しただけなので、外出先から鍵の状態を確認することはこのままではできません。
なのでその部分の仕組みも考える必要があります。

#参考ページ
・[ESP-WROOM-02を買ったので、環境構築をメモしておく](https://toshipedia.jp/20160111434/)
・[mosquittoコマンドのインストール・使い方](https://www.what-a-day.net/entry/2016/12/06/163717#インストール時のエラー)