M5Stackでスマートウォッチ

##1. はじめに
[M5StackにRTCを接続しI2C通信で時刻の設定、取得を行う](https://qiita.com/pbjpkas/items/cc3bf43a5f9fd2c3415d)の続編です。RTCを搭載し時計として使用しているほか、気温や湿度、気圧のチェックにも使用しています。また、OSDを用意しtwitterやQiita、GitHubのURLをQRコードで表示したりソフトウェアのテストツールのプロトタイピングに使用するコマンドを足しています。

![IMG_9255s.jpg](https://qiita-image-store.s3.amazonaws.com/0/221758/916a86da-a3d5-f173-d85d-212040826ffc.jpeg)

温度・湿度はDHT12とBME280で示す値が異なります。温度はケース内部に収めているBME280の方がDHT12より高めに表示されるようです。一方、湿度はBME280の値は妥当というかDHT12の値がBME280の半分程度(?)で変なのですが、DHT12を別の個体に変えてもBME280の半分程度なのは変わらず深くは追っていません。。。

##2. 機能概要
実装した機能を以下に示します。
![IMG_9256s.jpg](https://qiita-image-store.s3.amazonaws.com/0/221758/9e33da1c-82f4-0205-0097-5a857ca4029e.jpeg)
![IMG_9272s.jpg](https://qiita-image-store.s3.amazonaws.com/0/221758/4a4c3ece-9d07-84db-6422-d657178743b8.jpeg)

- サンプルソースのTFT_Clockを使ったアナログウォッチ
  - 現在時刻(PCF8563T)
  - 年月日
- ケースに貼りつけたDHT12で温度・湿度の計測
- ケース内部に収めたBME280で温度・湿度・気圧の計測
- バッテリー電圧の計測
- OSDメニューおよびtwitterやQiitaなどのURLのQRコード表示
- [M5Stackでコマンド操作](https://qiita.com/pbjpkas/items/c8c26837a1a5a243f4b6)のコマンド追加、など

ソースコード一式は[GitHub](https://github.com/pbjpkas/MyM5Stack/tree/master/MyM5Stack005)にありますのでここではハードウェアと、ソフトウェアの補足をします。

##3. ハードウェア
###3.1 使用パーツ
- M5Stack
  - [M5Stack Gray(9軸IMU搭載)](https://www.switch-science.com/catalog/3648/)
  - [M5Stack用プロトモジュール](https://www.switch-science.com/catalog/3650/)(プロトタイピング基板を外して枠のみ使用します)
  - [M5Stack用プロトキット(温湿度センサ付き)](https://www.switch-science.com/catalog/3651/)
  - [M5Stack用ウォッチバンド](https://www.switch-science.com/catalog/3729/)
- BME280モジュール：[BME280搭載温湿度・気圧センサモジュール](https://www.switch-science.com/catalog/2236/)
- PCF8563Tモジュール：[RTCモジュール HZ-8563](http://www.aitendo.com/product/13987)
- バッテリー電圧計測回路：10kΩと20kΩの抵抗
- [曲がる基板100x180mm](https://www.google.com/search?q=曲がる基板100x180mm)(片面)
- DHT12をケースに貼り付けるための両面テープ：[両面クションテープCT3D-20X10-3mm ](http://www.aitendo.com/product/7397)
- Φ3mm x 20mmの六角穴付きボルト(キャップスクリュー) 2本
  - ウォッチバンドに付属のボルトではプロトモジュールの厚みに足りないため
  - ![IMG_9258s.jpg](https://qiita-image-store.s3.amazonaws.com/0/221758/9287de12-ef64-96bd-4a5d-752944e29cbf.jpeg)

###3.2 ドーターボード
ドーターボードの写真と部品配置図です。BME280モジュールはUSB端子の上に立てています。ドーターボードとM5Stack本体の間にウォッチバンドに同梱のバッテリーを配置しています。
![smartwatch_block.png](https://qiita-image-store.s3.amazonaws.com/0/221758/75ab8dae-b1cf-c8c3-1ef6-cc6ff1cca8b8.png)

参考までにBME280搭載前は空中配線でした。
![IMG_9031s.jpg](https://qiita-image-store.s3.amazonaws.com/0/221758/80beacb3-5f80-0d0d-64fa-519db1e16bf9.jpeg)

###3.3 ドーターボードの組立
ドーターボードの基板は千石電商で購入した曲がる基板100x180mm(片面)で、はさみやカッターナイフで加工します。ドーターボードとM5Stack本体の間にバッテリーを配置できるよう隙間を持たせてピンヘッダをはんだ付けします。
![IMG_9035s.jpg](https://qiita-image-store.s3.amazonaws.com/0/221758/c411f241-a38a-63cd-096b-2ba719b46f8a.jpeg)

M5Stack本体にドーターボードをはめ、はんだ付け前のBME280モジュールとプロトモジュールの枠パーツを配置した様子です。枠パーツはウォッチバンドのベースのツメが収まるようにカッターナイフで加工しています。
![IMG_9036s.jpg](https://qiita-image-store.s3.amazonaws.com/0/221758/cf4f7071-c952-29c4-10cc-f2511e1afa8a.jpeg)

I2Cのバス(Clock、Data)と3.3V電源を引き出したところです。
![IMG_9037s.jpg](https://qiita-image-store.s3.amazonaws.com/0/221758/d77ad576-e9a3-8b3c-9b1f-b7a8fdcaba3a.jpeg)

バッテリー電圧測定用の抵抗は部品面に配置します。BATT端子の電圧を10kΩと20kΩの抵抗で分圧しADC(#36ピン)へ印加します。
![IMG_9038s.jpg](https://qiita-image-store.s3.amazonaws.com/0/221758/ce81306c-cc7b-b761-a79f-e3b5706da130.jpeg)

この後、PCF8563TモジュールとBME280モジュールのI2Cと電源を配線しドーターボードの完成となります。

###3.4 ウォッチバンド
ウォッチバンドのベースとM5Stack本体はボルト2本でねじ止めするためこのままではボルトのない側に隙間ができてしまいます。そこでプロトモジュールの枠パーツにねじでアンカーを打ち、ウォッチバンドのピンを通す穴にスズメッキ線を並行して通してアンカーに巻き付けています。ねじはプロトモジュールの基板を固定しているものを利用しています。
![IMG_9257s.jpg](https://qiita-image-store.s3.amazonaws.com/0/221758/3ad0fcc1-d522-a39e-d80a-2e10e1b288bd.jpeg)

##4. ソフトウェア
###4.1 構成
ソフトウェアの構成は以下のようになっています。

|役割               |ファイル|備考
|------------------|--------|----
|アプリケーション本体 | MyM5Stack005.ino<br>MyM5Stack.h|setup、loop、CLIなど
|OSD               | MyM5OSD.cpp<br>MyM5OSD.h
|ユーティリティ      | MyM5Utils.cpp<br>MyM5Utils.h
|アナログウォッチ    | TFTClock.cpp<br>TFTClock.h      |サンプルコード(TFT_Clock.ino)を改修<br>年月日を追加
|BME280ドライバ     | SSCI_BME280.cpp<br>SSCI_BME280.h|スイッチサイエンス製BME280ドライバを改修
|PCF8564Tドライバ   | pcf8563.cpp<br>pcf8563.h        |[M5StackにRTCを接続しI2C通信で時刻の設定、取得を行う](https://qiita.com/pbjpkas/items/cc3bf43a5f9fd2c3415d)

###4.2 OSD
####4.2.1 OSDの状態遷移
ボタン押下とOSDの関係を以下に示します。

|ボタン|OSD OFF状態    |OSD ON状態
|-----|--------------|----------
|A    |なにもしない    |メニューのカーソルup
|B    |なにもしない    |メニューのカーソルdown
|C    |OSD ON状態へ遷移|選択されているメニューの実行

####4.2.2 OSDの機能

|No.|機能
|---|---
|1  |Close (OSD OFF状態へ遷移する)
|2  |QRコード表示#1(例：twitterのアドレス)
|3  |QRコード表示#2(例：Qiitaのアドレス)
|4  |QRコード表示#3(例：GitHubのアドレス)
|5  |Bright Up(液晶の明るさアップ)
|6  |Bright Down(液晶の明るさダウン)
|7  |LCD White(液晶を全面ホワイトで描画)
|8  |Power OFF(Deep Sleepへ遷移)

###4.3 テストツールのプロトタイピングに使用するコマンド

|コマンド|機能
|-------|----
|m5lcd clear|LCDを全面黒で描画する
|m5lcd str \<strings\>|任意の文字列\<strings\>を画面の中心に描画する

詳細は[M5StackとPythonで受入テスト自動化の要素技術を試す](https://qiita.com/pbjpkas/items/97b6e596a4009a71f1ab)をご参照ください。

##5. おわりに
OSDの5番目のBright Upから7番目のLCD Whiteは「[ArduinoとオシロスコープをExcelで制御して測定する(2) シャッタースピードの自動測定](https://qiita.com/pbjpkas/items/615a6eca0894c784e87a)」でシャッターボタン自動押下の様子を撮影する際にM5Stackを光源として使用するために作った機能です。M5StackはIoTデバイスとしてだけでなくちょっとした治具を作るのにもおすすめです。