TWE-Liteで温度監視ネットワークを作る

この記事は「[さくらインターネット Advent Calendar 2015 - Qiita](http://qiita.com/advent-calendar/2015/sakura)」 11日目の記事です。

作る、というタイトルですがほぼ体験談のようなもので役に立つ情報はないかもしれません。
実際に制作したコードを公開できたらいいのですが、ちょっとまだ公開する準備ができていないのでこの記事ではサンプルコードの公開等はほぼありません。


# IoT(Internet of Temperature)
誰しもがインターネット経由でいつでもどこでも自分の部屋や飼っている魚の水槽の温度を見たいと思い、またそれが簡単に叶う時代になりました。
個人の家であればアナログ温度計を設置してそれをWebカメラで24時間ストリーミング配信など腕力での解決が可能でしょうが、例えばサーバールームの温度分布を取りたいだとかになるとそうも言っていられません。
カメラの角度のセッティングのような面倒な手間を必要とせず、置いておけば勝手に温度を監視、集約までしてくれて一目で分布が見られたら最高です。
手始めに10～20台ぐらいオフィスにバラ撒いて自分たちの身の回りの気温がどうなっているのか調べられるアイテムの制作を始めました。


# 回路

電源回路などを省略した、センサーとTWE-Lite DIPの接続図を示します。

![image](https://qiita-image-store.s3.amazonaws.com/0/102824/9465e194-c90b-0f14-cc40-5026bb5a7ce5.png)


温湿度センサーとしては[SHT-11](https://strawberry-linux.com/catalog/items?code=80001)を選定しました。しかしこのセンサーは通信方式が特殊で、I2Cのようでそうではないよくわからないプロトコルを喋ります。

後継製品でちゃんとしたI2Cを喋り、なおかつ安価な[SHT-21](https://strawberry-linux.com/catalo
g/items?code=80021)もあるのですが、ある程度の数を量産することを考えた場合センサー単体での基板への実装が人力では難しそうなため断念しました。





# SHT-1xドライバ
前述の通りSHT-11はI2Cっぽいけどそうではないよくわからないプロトコルで通信を行っています。
どうせなら楽をしたいところなのでライブラリを探すと[MONO-WIRELESS.comに転がっています](http://mono-wireless.com/jp/tech/Programming/PERIPH_HtsDriver.html)。
「必要な修正を行った上でご使用ください。」ととても気になる一文が書かれていますが、私の環境ではHtsDriver.hのピン指定を修正するだけで動作しました。

```c:HtsDriver_snip.h

// 略


/****************************************************************************/
/***        Macro Definitions                                             ***/
/****************************************************************************/

//#define HTS_DATA_DIO_BIT_MASK (1 << 12)
//#define HTS_CLK_DIO_BIT_MASK  (1 << 13)
#define HTS_DATA_DIO_BIT_MASK E_AHI_DIO8_INT // DIO8
#define HTS_CLK_DIO_BIT_MASK  E_AHI_DIO9_INT


// 略

```

他に問題があるとするなら、このライブラリを用いると温度が1℃単位でしか測定できません。
I2Cもどきで得られた数値を[SHT-1xのデータシート](http://plus.harenet.ne.jp/~seiden/sensirion_SHT1_J.pdf)に載っている変換式に通すことで物理的な値が得られるのですが、TWE-Liteで計算を精度よくやるのは少々困難です。
変換前の数値をマスターへ送信し、そちらで変換を行えばよいのですが、今回のケースでは今後センサーが混在してきた場合に対応するのが面倒なので1℃単位で妥協することにしました。

# DIO番号
基本的にTWE-LiteのピンとDIO番号の対応は[買うと付いてくるカードのピン配置表](http://mono-wireless.com/jp/products/TWE-Lite-DIP/asset/Lite_vs_LiteDIP_Pins.png)の「シルク」列の通りなのですが、読んでるうちにごっちゃになってきたり、そこにTWE-Liteの*DIP版ではない*チップでのピン番号まで考えるとわけがわからなくなるので表にしました（元々が表なのに書き直して見やすくなるのかと言われると疑問ですが）。


|  役割（ピン名） | TWE-Lite DIPでのピン番号 | TWE-Lite チップ自体でのピン番号 | DIO番号 |
|-----------------|--------------------------|---------------------------------|---------|
| AI4             | 25                       | 25                              | 1       |
| M2              | 26                       | 26                              | 2       |
| M3              | 27                       | 27                              | 3       |
| DO3             | 9                        | 6                               | 4       |
| PWM1            | 4                        | 7                               | 5       |
| TX              | 10                       | 8                               | 6       |
| RX              | 3                        | 9                               | 7       |
| PWM4            | 11                       | 10                              | 8       |
| DO4             | 12                       | 11                              | 9       |
| M1              | 13                       | 12                              | 10      |
| DI3             | 17                       | 16                              | 11      |
| DI1             | 15                       | 13                              | 12      |
| DI2             | 16                       | 15                              | 13      |
| SCL             | 2                        | 14                              | 14      |
| SDA             | 19                       | 17                              | 15      |
| DI4             | 18                       | 18                              | 16      |
| BPS             | 20                       | 19                              | 17      |
| DO1             | 5                        | 3                               | 18      |
| DO2             | 8                        | 4                               | 19      |
| PWM2            | 6                        | 1                               |         |
| PWM3            | 7                        | 2                               |         |
| GND             | 1, 14                    | 28, 30, 31, 32                  |         |
| RST             | 21                       | 21                              |         |
| AI1             | 22                       | 23                              |         |
| AI2             | 23                       | 24                              |         |
| AI3             | 24                       | 22                              |         |
| VCC             | 28                       | 5                               |         |



# 構成
マスター1台とスレーブ複数台で構成されています。

スレーブはセンサーと接続されている端末で、測定したデータを一定間隔ごとにマスターへ送信することに特化しています。

一方、マスターはスレーブから送信されてきたパケットを1カ所で受信し、送信元アドレスと測定データをJSONに変換し、シリアルポートでRaspberryPiに送信、
受信日時の情報を付加してElasticSearchに投げて情報を集約します。

# 動作例


![image](https://qiita-image-store.s3.amazonaws.com/0/102824/f6dbdce8-62ce-c58c-1762-2873943e5b65.png)

ちょうどシルバーウィーク期間中もずっと測定を続けていたのですが、(カレンダー通りに休んだとして)シルバーウィーク最終日の23日までは温湿度が大きく変動し、翌24日の9時からはエアコンが頑張って温湿度を維持しようとしていることがわかります。

休日にエアコンがどのような制御をされているのかはわからないですが、さすがに人がいる状態で室温が32℃を越したりすればエアコンの温度を弄るでしょうから、休みの日はちゃんとみんな休んでるっぽいことが読み取れます。


# おわりに
書くネタがなくなってきたのでこの辺りでおしまいです。

次はnomukenの[LepusCTF](lepus-ctf.org)ネタです。友人であり一緒に某某某某某某をやってきた仲としても楽しみな記事なので期待しています。