ゆっくり技術ノート!

いつかきっとできるだろうよ

壁のスイッチをWi-Fi経由で操作する

Image from Gyazo

これ何

  • 2つの壁のスイッチを Wi-Fi経由で操作できます
  • 部屋の 温度、湿度と照度 を送信します
  • 別の部屋の 温度と湿度 を送信します
  • ドアの状態を送信します

ESP8266 を使って Wi-Fi経由 で壁のスイッチを操作できるものを作った。

ESP8266内で Webサーバが起動していて、ブラウザから壁のスイッチを操作できる。
壁のスイッチはサーボモータを使ってオンオフしています。
また、いちいちブラウザを起動するは面倒なので、プッシュボタンも付けています。

温度などのデータは毎分送信され、ローカルにあるサーバの InfluxDB に格納しています。

ESP8266とは

Image from Gyazo ESP8266 は Espressif Systems が製造している小型で安価な Wi-Fiモジュールです。
3.3V で動作し、大きさは100円玉くらいでとても小型ながら、2.4GHz帯の Wi-Fi(b/g/n) に接続することができます。
また、Arduino と互換性があり Wi-Fi が付いた Arduino として使うことができます。
技適に通っている ESP8266 は ESP-WROOM-02(とその派生型) パッケージだけなので、これを使います。
この手の工作ではおなじみですね。

ESP8266 - Wikipedia

部品

合計で大体 2500円。

リストに書いたもの以外にも、プログラムを書き込むための USBシリアル変換機、リード線、ピンヘッダ、ピンソケットなどが必要です。やってないですが、USBシリアル変換機は Arduino UNO などで代用できるようです。
元々持っていた物が多くて、今回買ったのは温湿度センサと三端子レギュレータだけ。
サーボは数年前に、ヴイストン ロボットセンタ 秋葉原店 で 1人 2個、1個 100円で安売りしてたやつ。

回路

初めて KiCad に挑戦してみました。(数時間でまぁまぁ使えるようになります)
Image from Gyazo

温湿度センサ

今回使用した 2つの温湿度センサ(AM2320)は I2C (Inter-Integrated Circuit) に対応していましたが、同じデバイスを同じ I2C bus で使うと device address が重複してしまいます。
そのため、device address を変更する必要があるのですが、AM2320 の device address を変更する方法がわからなかったので、今回は I2C を諦めて 1-Wire で接続しています。
1-Wire だと読み取りに失敗することがあるので何回か試行するようにしています。

リードスイッチ

リードスイッチは近くに磁石があるとオンになるスイッチです。
今回使用したものはガラス管がむき出しで壊れそうだったので、ストローに入れてホットボンドで蓋をしています。
Image from Gyazo ユニバーサル基板でテスト中の回路 と ブレッドボードでテストした回路

電源

回路図には書いてませんが、電源は iPhone の 5W充電器 から 5V を供給し三端子レギュレータで 3.3V に降圧しています Image from Gyazo とても素朴な基板ができた

接続

Device PIN name PIN name Device
3V 3V GND GND
- EN IO16 LED 1
Button 2 IO14 TOUT Illuminance
Button 1 IO12 RST Writer RST
Servo 1 IO13 IO5 ReadSW 1
Servo 2 IO15 IO1(TXD) Writer RX
Sensor 2 IO2 IO3(RXD) Writer TX
Sensor 1 IO0 IO4 ReadSW 2

回路のパターンは Numbers.app で書いた Image from Gyazo 作業風景、マグカップ

ちなみに、回路とサーボを覆う筐体は Amazon で買ったスノコ を解体したものが余っていたので、それで箱を作りました。ヒノキの良い匂いがします。

参考URL

回路の作成にあたって大変お世話になりました。ありがとうございます。

コード

github.com
コードは 600行くらい。
web server や web client は ESP8266 の標準ライブラリがあるのでそれを使っています。
温湿度センサは以下のライブラリを使わせてもらいました。
github.com

Grafana

ESP8266 から InfluxDB に送られたデータを Grafana で可視化してみた。

Image from Gyazo かっこいい。
3つの ESP8266 と 3つの Raspberry Pi が、毎分データを送信してくる。
ちなみに Raspberry Pi には赤外線LED を繋げていて、部屋の照明やテレビなどのリモコン信号が出るようにしています。
センサーは BME280, HDC1000, AM2320 を使っています。

HomeKit

Apple HomeKit は ホームオートメーション機器と通信するためのフレームワークで、家電を macOS, iOS, watchOS のホームアプリとSiri、または iOSのコントロールセンタ から操作できます。影が薄いですが、ホームアプリは iOS8 から標準で入っていますね。
Image from Gyazo 今回は、HomeKitOSS実装である Homebridge を使って HomeKit に対応しています。
ファンは動作中だと羽が回転するアニメーションがあったりして見てて楽しい。
壁のスイッチ操作は Wi-Fi経由で DB に送信されているので、Homebridge は DB を参照し家電のオンオフ状態を認識しています。
Homebridge のプラグインhomebridge-cmd4 を使っています。
温度と湿度が常にグレーでちょっと見づらいのが難点ですが、これは HomeKit の仕様っぽい。

オートメーション

今回はお風呂の照明と換気扇のスイッチを操作しているので、DB を参照して以下の操作を自動で行うようにしました。
お風呂が使用中か非使用かはドアの状態を見ています。

  • ライトを点ける: もし使用中かつ暗いなら
  • ライトを止める: もし非使用かつ点灯中なら
  • ファンを点ける: もし使用中かつ暑いなら
  • ファンを止める: もし使用中かつ暑くないなら
  • ファンを点ける: もし非使用かつ湿ってるなら
  • ファンを止める: もし非使用かつ乾いてるなら

以下を サーバ上で定期実行している
Automatically operate the bath light and fan

ハマりどころ

雑感

  • 温湿度センサは設置する高さで結構数値が変わる
  • 人がいない時、温度が下がったりしているのが見えて面白かった
  • HomeKit対応製品でここまで機能てんこ盛りの製品はないのでとても満足した
    • HomeKit対応の温度、湿度、気圧センサーが 8000円もするので、値段的にも優位
    • 自分で作ると安くできて、好きに細かい機能を作り込めるし、何より楽しい
  • Apple watch で心拍とか色々取ってきてリアルタイムに Grafana で表示してみたい
    • 室温が体温にどれだけ影響するのかみたい
  • ESP8266 の後継機 ESP32 では Bluetooth に対応しているので、分割キーボードを完全無線化してみたい (AirPods みたいに)

間違いなどがありましたら、コメントいただけるとありがたいです。
最後までお付き合いいただきありがとうございました。