浴室乾燥機制御盤をNodeMCUとサーボで自動制御する

浴室乾燥機という機械がございます。
この機械、タイマーはついているのですが「スタートを押してn時間後に停止」しかできません。
「n時間後に乾燥運転開始」「湿度が下がったら停止」「停止したあとは乾燥ではなく換気にする」といったことはできません。

ということで、おうちはっくしてスマートにします。

# 目的と制約

1. 浴室で洗濯物を乾燥させる
2. 電気代と時間を最小におさえる
3. 浴室乾燥機制御盤の内部は改造しない（いつでも元に戻せるようにする）

# 方針

* 浴室の内外の湿度を計測
* 湿度差などの条件により運転を継続するかどうかを判定
* サーボモータで制御盤のスイッチを押す
* CdSで制御盤のLEDが点灯しているかどうかを検出する

# 材料

* NodeMCU x 1
* サーボ x 3
* CdS x 2
* 抵抗いくつか
* 温度湿度センサー DHT11またはDHT22 x 2
* OLED表示装置 x 1
* アナログマルチプレクサ x 1
* プッシュスイッチ x 1
* リードスイッチと磁石 x 1

合計金額はたぶん5000円くらい。

# ハードウェア

## NodeMCU

Arduino IDEで扱うことができるESP8266の小さなボードです。

日本国内では電波法上WiFiの部分は使えませんが、電波を出さなければ合法なので電波法の届出制度の運用開始を待つこととして無線なしで動かします。
無線なしということはIPアドレスもつかないので「IoTではない」ということになります。

ハード的には特に悩むことはありません。USBを挿せば動きます。

[USB付きWiFiモジュール \- aitendo](http://www.aitendo.com/product/14674)

## センサー

NodeMCUはA/D入力が一つしかありません。
そこに制御盤LED検出用のCdSを２つ（乾燥運転と換気運転）、人間が押すプッシュスイッチ（スタート用）、ドア開閉検出用リードスイッチ（磁石をドアにつける）の4chを検出するためアナログマルチプレクサを使って時分割で計測します。

[74HC4051搭載 8chマルチプレクサピッチ変換基板 \- スイッチサイエンス](https://www.switch-science.com/catalog/2859/)

A0は0〜1Vを1024段階で検出するので3.3Vをそのまま入れてはダメです。
上記の4つのスイッチいずれも二値（ON/OFF）が取れれば十分ですので、1Vを超えないが2値を検出するのに十分な範囲の適当な抵抗を入れてプルアップしておきます。

一人では三本の矢を*同時に*折ることはできませんが、ミリ秒単位で切り替えて各個撃破すれば同時に三本を破壊している*ようにみえる*ことでしょう（笑）。
何事も一度に同時にやる必要はありませんからね、順番にやればいいのです。

温度と湿度はDHT11を使い浴室内外に一つずつつけてデジタルI/Oに繋げます。
精度もさほど要らないので安い11で十分です。
防水ではないので浴室内では「温度湿度は計測できるが水はかからない」程度に守ってあげます。

[温湿度センサ　モジュール　ＤＨＴ１１: センサ一般 秋月電子通商\-電子部品・ネット通販](http://akizukidenshi.com/catalog/g/gM-07003/)

## i2c OLED

D1, D2をi2cに使いOLEDの表示装置を繋げます。
i2cなので他のデバイスをつなげることもできますね。
今回はDHT11を使ったのでi2cではないのですがi2cを話す温度湿度計ならここに繋げることもできます。
その場合はベンダ供給ライブラリでWire.hをどう使っているのかを調べて、同じi2cを喧嘩せずに複数のライブラリから使えるように整える必要があります。

[★0\.96インチ★OLEDモジュール★I2C★ \- aitendo](http://www.aitendo.com/product/18634)

## サーボ

秋月でSG90というサーボを買ってきました。
足が3本あります。
USBからもらう5V（3.3Vでは足りません）とGNDとGPIOにつなぎます。

[マイクロサーボ９ｇ　ＳＧ－９０: パーツ一般 秋月電子通商\-電子部品・ネット通販](http://akizukidenshi.com/catalog/g/gM-08761/)

## あとは組むだけ！

ということでできたのがこちら。

![IMG_1578.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204320/d4818d0b-38be-a23f-20fa-bada26093713.jpeg)

このままではサーボが反作用で外れてしまいますので覆いをつけて抑えました。

# ソフトウェア（部品別）

## Arduino IDE

まずシリアルドライバを入れます。

[USB \- UART ブリッジ VCP ドライバ \- Silicon Labs](https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)

Arduino IDEを起動して設定のボードマネージャ追加に

```
http://arduino.esp8266.com/stable/package_esp8266com_index.json
```

を記入、ボードマネージャからESP8266を有効化、ボードとしてNodeMCU 1.0を選びます。
ボードマネージャはv2.6では動かなかったためv2.5.0を使用。
バージョンを切り替えるときはゴミが残らないようrm -frしておく必要があります。

ボードの裏には9600bpsで書き込めと書いてありますが実際は19200でも書き込めました。

なお、場合によっては書き込みプログラムをgitから持ってきたものに差し替えるなどが必要なようです。アリババから買ったものは変更が必要でした。

## 温度センサー

みんな大好きDHT11/22!
今更説明する必要もないと思うので割愛。

[DHT11/DHT22 Sensor with Arduino \| Random Nerd Tutorials](https://randomnerdtutorials.com/complete-guide-for-dht11dht22-humidity-and-temperature-sensor-with-arduino/)

## OLED

aitendoで買ったのでaitendoの説明にあるライブラリでいきます。Arduinoと違ってNodeMCUは足が少ないのでリセットピンは省略(GND)です。

その場合は初期化の部分を

```
ssd1306_128x64_i2c_initEx(PIN_I2C_SCL, PIN_I2C_SDA, 0);
```

として0を渡します。
今回は文字しか出していませんがビットマップも描けます。

[ArduinoでOLEDディスプレイに色々表示する - Qiita](https://qiita.com/jakalada/items/793a6cf5ff2796db4e86)

## その他のセンサー

アナログマルチプレクサは高速なのでリレーのようにdelay()をたくさんいれる必要はありません。

ただし、DHTやi2cのセンサーもそうですが一回読んで終わりとすると値がフラフラします。
何回か読んで平均をとるようにします。

## サーボ

サーボは角度を絶対的に指定できます。
今回はCdSで制御盤を監視していますので「この角度まで押し込む」といった決まった値をつけるのではなく「CdSでLEDがON(またはOFF)になるまで押し込む」というフィードバックをいれた制御にします。
検出を関数にしておいて関数ポインタを渡せばすぐできますね。
ただし、誤動作で強く押し込まれると壊れてしまうので上限はつけておきます。

複数のサーボが繋がっているとノイズによる誤動作が発生しますが、制御対象のサーボ以外をpinMode(INPUT)にしておくと誤動作は減ります。
それでも関係ないサーボが多少動くこともあるので待機時は足が多少動いてもスイッチに触れない程度に離しておきます。
このへんは電源にも影響されるので良い電源をつなげましょう。

[Arduinoとサーボモーターで壁の照明スイッチを操作 - Qiita](https://qiita.com/keigoi/items/8ea458e34173dc086e23)

# 制御アルゴリズム

ここまで作成したら乾燥機の制御盤に貼り付け、まずはサーボ無しで運用開始です。

まずは乾燥機を手動で動かして値を観測して方針を決めました。
USBシリアルからの出力をmuninに書くとこんなかんじ。
時間軸は恥ずかしいので隠してありますが推測可能かとはおもいますが気にしないでね〜😅

![humi1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204320/58ade247-ce6b-5a29-2965-4d5bac028e0c.png)

緑が浴室内、青が室外です。
一部乱れているのはデバッグ中の値ですね。
結果をみてとりあえず「内外の湿度差が10ポイントを切るまで動作」としました。

# テスト運用

で、実際に洗濯物を干して動かしてみたときはこんな感じでした。

![humi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204320/31c717f2-3175-cada-fded-8bac1b814bac.png)

干してスタートスイッチを押したところから緑の差が表示されています。
3時間後に湿度差が10ポイントまで下がり洗濯物も概ね乾いていました。
今まではタイマーで動かして気づいたららカラカラにまで乾燥していたり、湿ったままだったりといったことがありましたので、この調子で無駄は減りそうです。

~~あとは細かい閾値の調整をして少しずつ変更していくわけですが、このカレンダーの公開日の時点ではまだ調整中という感じですね~~

# 本運用 (2019年末追記)

しばらく動作させてみたところ、終了条件が単なる内外の相対湿度差ではうまくいかないことに気づきました。
浴室外より、浴室内のほうが相対湿度で低くなっても、まだ乾いていないのです...
これは、寒くなってきたため動作させていると内外気温差が発生してしまうためです。
ということで、絶対湿度で内外差をとるようにしたところ、ちょうど乾いた瞬間を検出できるようになりました〜

![abshumi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204320/a06cec1a-e763-8b7b-7deb-8f3b89cf4636.png)

# 停止条件の調整 (2020年2月追記)

しばらく運用した結果、東京の冬では、以下の停止条件のORで「必要にして十分な程度は乾く」となりました。

* 絶対湿度が浴室外より乾いている
* 絶対湿度が6g/m^3を下回る

# 今後の課題

## 停止条件の季節変動がある!?

冬の停止条件は良さそうです。
では、それ以外の季節の停止条件はどうするのがよいのか。
季節によって停止条件を変更する場合、いつからいつを「春」とみなすのか。
ネットワークがない状態でどうやって「いまは春」と判定させるのか...
このへんは一年間運用してみないとわかりません。

## さらなる電気代削減

今回の乾燥機、「乾燥」モードの他に「換気」モードがあります。
いまは「乾燥」のみ使っていますが「換気」と適宜切り替えるようにすれば更に電気代が減るかもしれません。
「減るかもしれない」なので、これは時間で積分した電気代を計算してちゃんと考えないと実際は損をしているということもありえます。
Arduinoはc++のSTLが使えるので、自分でリンクリストをつくらなくても`vector<pair<time_t, float> >`などで簡単にログを蓄積して処理することができます。

電気代はBルートで取るのが一番かもしれませんが、いろいろ面倒なんで自力でなんとかしています。

[スイッチサイエンスのCTセンサをつかって家庭用コンセントの消費電力を測る - Qiita](https://qiita.com/yuuri23/items/e44780aaaf1059765473)
[3GPI とラズパイで家庭の消費電力量をグラフ表示する - Qiita](https://qiita.com/osamasao/items/a38707465e8f8a9948ed)
[おうちハックした自宅に2年すんでみたおはなし - Qiita](https://qiita.com/curtain6935/items/0fc7dc141f49fd1a48a4#%E9%9B%BB%E5%8A%9B%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC)

## WiFi

NodeMCUは技適を通っていないので普通は電波を出せないのですが法律が改正されたそうで申請をすると電波を出しても違法にならないそうです。

WiFiを使えるようになれば、このグラフを描画するためにUSBを繋げっぱなしにする必要はなくなりMQTTを使って監視したり制御したりhomebridgeから制御することも可能となります。

[ESP8266 Wifi-Module Wemos D1mini & 温湿度センサーSHT30、mac-ID でMQTT-feed を自動作成＆センサーデータvisualization - Qiita](https://qiita.com/DoiChris/items/4c89c2bef31e3d17f1ed)

# Happy おうちhacking!

## おうちハックの良いところ

1. 電気代が削減できる
2. 生活の手間が削減できる
3. 作って楽しい、暮らして楽しい
4. サーバ障害時に物理リモコンや色々を取り出して手で動かして「ワシらはどうもこの船の機械に頼りすぎていたのう」「まったくです、電気が切れたらこのざまですからね」とノーチラス号沈没ごっこができる

## おうちハックの悪いところ

1. 部品代や手間がかかる
2. 誤動作すると痛い
3. 他人が遊びに来た時に「勝手に動いて怖い」「これどうやってスイッチいれるの？」「監視されてる気分」「変な家」など散々言われてウケが良くない😭

# 追記 2022年冬

![a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204320/2319a089-7d66-69b9-59d9-7328d9f71cbd.jpeg)

ESP32にしてePaperをつけてスイッチもまともにしました。
この写真では下側の見苦しいスイッチ類が露出していますが、使用中はサーボを固定するために抑えるため見えなくなります。

バス降車スイッチはこちらのものです。
12Vに昇圧して使います。

[Amazon | 東急バス 降車ボタンキット | ボタン 通販](https://www.amazon.co.jp/%E6%9D%B1%E6%80%A5%E3%83%90%E3%82%B9-%E6%9D%B1%E6%80%A5%E3%83%90%E3%82%B9-%E9%99%8D%E8%BB%8A%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%AD%E3%83%83%E3%83%88/dp/B018I2W5K4)
[晴海埠頭でバス | jx22bの轟沈まで5秒前の日記－目から鱗でお湿りなう－](https://ameblo.jp/container-ps22/entry-12072951213.html)