洗濯が終わったらGoogleHomeがしゃべるIoT(ESP32)

#はじめに
我が家では洗濯が終わったのを気づかずに、しばらく洗濯機に放置してしまうことがたまにある。一応、洗濯機は「ピー！ピー！」なるのだが、リビングでテレビを観て気づかない。または何か別のことをしていて後回して忘れている。２、３時間放置したものをそのまま干すのもさすがに気持ち悪いので洗い直しになる。もちろん乾燥機が付いているような高級な洗濯機ではなく20年来の我が家の名機だ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/b647b94b-b9c8-9680-1978-974c5643dd3c.png)

##仕組みは単純
洗濯機のフタが閉まっている時間をタイマー監視してるだけ。
我が家の洗濯機は通常、開いている。使い終わったら閉めておくより開けておいた方が何となく乾いていいんじゃないかということからである。なのでフタが閉まっているのは洗濯している時だけ。洗濯も全自動の通常モード一択なので35分と決まっている。フタが閉まって35分経過したら通知するだけ。
「だったら最初からGoogleHomeで35分タイマーでいいじゃん！」と言われるかもしれないが、洗濯のたびに「OK、Google！ 35分タイマーして」は面倒である。フタを閉めると勝手にタイマー監視してくれる方がいい。

タイトルでは、「洗濯が終わったら・・・」となっているが正確には「洗濯が終わった頃に・・・」です、すみません。

振動が止まったらとか、ピーピー鳴ったらとか、LEDが消えたらとか・・・一応色々考えました。。。それはまた別の機会に。。。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/9772c789-b266-e3a9-6e9a-25575063f36f.png)

##要件
* フタが閉まったら35分タイマー設定して開始（GoogleHomeのタイマーは使いません！ESP32のDeepSleepタイマーです！）
* タイマーが終了するとGoogleHomeで「洗濯が終わりました」としゃべる
* タイマー終了後、フタが開かないと5分後に再通知
* 再通知は3回
* フタが開いたらタイマーオフ
* 起動時、フタの開閉時、タイマー終了時は LED 点灯（生存確認用）
* OTAモード中は LED 点滅（OTAは任意）

#部品
* ESP-WROOM-32D ([スイッチサイエンス](https://www.switch-science.com/catalog/3753/))￥712
* ESP-WROOM-32 ピッチ変換基板 ([スイッチサイエンス](https://www.switch-science.com/catalog/4116/))￥286
* ユニバーサル基板 ([秋月](http://akizukidenshi.com/catalog/g/gP-03229/))￥60
* 磁気センサー ([ダイソー](https://www.google.com/search?sxsrf=ALeKk02DuKfn1JechgXNvnL8fHObB6ab2g:1585311328724&q=%E3%83%80%E3%82%A4%E3%82%BD%E3%83%BC++%E3%83%89%E3%82%A2+%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%88&tbm=isch&source=univ&sa=X&ved=2ahUKEwipmu300LroAhWF-2EKHWK-DXkQsAR6BAgJEAE&biw=1840&bih=1118))￥100
* LED  ([秋月](http://akizukidenshi.com/catalog/g/gI-06247/))￥200
* 抵抗 10KΩ×3  ([秋月](http://akizukidenshi.com/catalog/g/gR-25103/))￥100
* コンデンサー 0.1μF ([秋月](http://akizukidenshi.com/catalog/g/gP-04065/))￥100
* タクトスイッチ ×2 ([秋月](http://akizukidenshi.com/catalog/g/gP-03650/))￥20
* 電池 単3×2  ([秋月](http://akizukidenshi.com/catalog/g/gB-03807/))￥80
* 電池ターミナルクリップ×4 ([秋月](http://akizukidenshi.com/catalog/g/gP-06933/))￥80
* ケース ([秋月](http://akizukidenshi.com/catalog/g/gP-07423/))￥100

トータル2,000円ぐらいですね。

##ESP-WROOM-32
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/088ec4ba-e363-1659-6aca-54391fa44d79.png" width=200> (スイッチサイエンスより)

ESP-WROOM-02 の後継ですね。ESP-WROOM-02 の方が100円お安いのですが、最近は扱いやすいESP32の方にしています。

##ESP-WROOM-32 ピッチ変換基板 コンパクト
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/8c6ba059-d60b-c79b-d1e5-cfda7a089ce0.png" width=200> (スイッチサイエンスより)
ピッチ変換しないと使いにくいので。
286円とちょっとお高い。
さらにハンダ付けが面倒。DIP化したのを出して欲しい！！もう２つほどハンダ付けでダメにした。

##磁気センサー

分解は[こちら(ラズパイで100均のドア開閉センサー検知)](https://jellyware.jp/kurage/raspi/daiso_sensorlight.html)を参考にしました.
センサー部分をちょん切って使うだけですので、ちょー簡単！

##回路図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/d2c3f967-6d81-ce5b-2600-a48170da6357.png)


##完成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/b685e1e1-f14d-c53b-a9f5-17787ad61f98.png" width=500>
このぐらいの隙間は大丈夫です。とりあえず固定は両面テープです。ダメなようなら考えます。


#プログラム

```cpp:
// google-home-notifier
const char displayName[] = "ダイニング ルーム"; // GoogleHomeの名前に変える
const char speekText[] = "洗濯が終わりました";  // 洗濯終了時の発声

#define WASHTIME_SEC        48 * 60         // 洗濯時間 min 
#define NOTIFYAGAIN_SEC      5 * 60         // 再通知間隔 5 min
#define NOTIFYAGAIN_CNT      3              // 最大再通知回数
```
洗濯時間は任意に変更してください。
発話内容を変えることもできます。


##DeepSleep
ESP32はWiFiなど使っている状態では200mA以上の大飯食らいです。単3電池2本なんて数時間も持ちません。常時WiFiを使う用途には電池運用は無理です。モバイルバッテリーでも難しいでしょう。とはいえESP32の武器はWiFiなので電池運用するには必要な時だけ繋ぐ！です。それ以外はDeepSleepで眠らせておくことです。DeepSleepの中でもHibernationモードにすると2.5μAまで落とせます。（参照：[Insight Into ESP32 Sleep Modes & Their Power Consumption](https://lastminuteengineers.com/esp32-sleep-modes-power-consumption/)）
実際にそこまで落とすのは難しいのですが、今回はフタが開いているときは 5μA。フタが閉まっているときは 500μA です。WiFi接続時は 200mA を超えますが極力短時間にします。

今回はWakeupソースとして ESP_SLEEP_WAKEUP_TIMER と ESP_SLEEP_WAKEUP_EXT1 を使用しています。
ESP_SLEEP_WAKEUP_EXT1 ではなく ESP_SLEEP_WAKEUP_EXT0 でも良いのですが、ESP_SLEEP_WAKEUP_EXT1 の方が少し消費電流を落とせます。

##esp8266-google-home-notifier
私はGoogleHomeを喋らすのはもっぱらこれ（[esp8266-google-home-notifier](https://qiita.com/horihiro/items/4ab0edf415916a2cd542)）を使っています。
インストールもここに載っています。

##HOYA VoiceText
esp8266-google-home-notifier はとても素晴らしいのですが、発声がゆっくりでちょっとイラッとします。なので、この [VoiceText](https://cloud.voicetext.jp/webapi/docs/api) と組み合わせて使っています。
[無料登録](https://cloud.voicetext.jp/webapi/api_keys/new)をしてAPIキーが必要です。
これは必ず必要ではありません。esp8266-google-home-notifier だけでも良いです。
初回起動時にAPIにて "test.mp3" として音声ファイルを作成し、SPIFS に保存しています。

##OTA
詳細は他の記事に譲ります。機能的に必須ではないので省いてしまっても良いです。

##ソース
ソースコードは以下に置いておきます。
https://github.com/nori-dev-akg/esp32-washing-machine-notifier

#おわりに
これはその家庭ならではのIoTです。生活をちょっと便利にするIoTはとても素晴らしい。
ぜひ、奥様に作ってあげてはいかがでしょう？

#SpecialThanks!!
https://jellyware.jp/kurage/raspi/daiso_sensorlight.html
https://qiita.com/horihiro/items/4ab0edf415916a2cd542