洗濯物の乾き具合を知りたくて、M5StickCで物干し部屋の湿度を測って Azure IoT Central で分かるようにしてみた

#はじめに
少しずつ秋が近づいてきて、真夏のように洗濯物がすぐに乾いて、すぐに畳めるという時期もだんだん終わりに近づいてきてます。そして、これから冬にかけて少しずつ大変になってくる**洗濯物の乾かない問題**。
そこで今回は、**M5StickC** と **Azure IoT Central** を活用して、少しでも家庭の課題を解決できるようにしたいと思います。

洗濯物の乾燥についてはこんなことを思っています。

* 洗濯物が乾いたタイミングを知りたい
* 乾いたのが分かったら、手が空いているうちに畳みたい
* たくさん干し過ぎると生乾きっぽくなって困る
* もし、乾くまでに長く時間が掛かっていたら、コインランドリーに持っていきたい
* せっかく家事を頑張ったのに生乾きで臭くなってると、~~怒られる~~ 悲しい。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/c7412119-29c2-b4b7-4f45-1b8ca91a73db.png" width=40%>

#作ったもの
M5StickCに湿度センサを付けて、Azure IoT Central で可視化しました!
システム構成は、こんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/17c632b7-2be7-a3ee-ae60-9933db7fac4c.png)

**M5StickC＋温湿度センサ**

* [M5StickC](https://www.switch-science.com/catalog/5517/)
* [M5StickC ENV II Hat](https://www.switch-science.com/catalog/6559/)
* [USB-AC Adapter](https://www.amazon.co.jp/dp/B00104S0QQ/)
* [USB TypeC OTG 超小型 コンパクト アダプタ](https://www.amazon.co.jp/dp/B07RBNYMZZ)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/7acef214-0952-f856-0d50-d83fbc4ab577.jpeg" width=70%>


物干し部屋に設置します。洗濯機も一緒にあります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/2bf838b1-3b5f-8bd4-04de-f23ac38e3b9a.jpeg" width=70%>


**Azure IoT Central のダッシュボード**
物干し部屋の湿度をWEBで確認できるように可視化しています。
あとは、天気の影響もあると思うので、地元の天気が同じダッシュボード上で見られるようにしています。

* １時間ごとの天気予報
* 物干し部屋の現在の湿度
* 湿度の時系列変化と洗濯物を干したタイミング
* 画像（いらすとや）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/f1312356-ff8e-c6df-7092-0e47418d2b01.png" width=100%>

#1. デバイス側の設計

* **M5StickCの画面**
デバイス側でも湿度が分かるようにディスプレイに表示します。
これで、実際に干すときもある程度の目安になります。あとは、干し始めたタイミングが分かるように、ボタンを押したら Azure IoT Central にイベント通知するようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/f0418162-18d8-c027-bc89-6e471ce20ab2.png)

* **Blockly**
実際には動かすときは、SSID/PASSWORD、スコープID／デバイスID／主キーの設定をして下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/8b6d1ed4-746c-db5e-9ddd-370aa349797e.png)


* **Python**

```python
from m5stack import *
from m5ui import *
from uiflow import *
import wifiCfg
import json

import ntptime
import time
from IoTcloud.Azure import IoT_Central
import hat

setScreenColor(0x111111)

hat_env2_0 = hat.get(hat.ENV2)

methodmsg = None
threshold = None
temperature = None
humidity = None
pressure = None

wifiCfg.doConnect('', '')
labelHumidity = M5TextBox(6, 8, "Humidity", lcd.FONT_Default, 0xFFFFFF, rotate=0)
valueHumidity = M5TextBox(12, 51, "35", lcd.FONT_DejaVu40, 0xFFFFFF, rotate=0)
labelPercentage = M5TextBox(64, 96, "%", lcd.FONT_Default, 0xFFFFFF, rotate=0)

import math




def azure_direct_reset(payload, rid):
  global methodmsg, threshold, temperature, humidity, pressure
  methodmsg = payload

  azure.response_direct_method(0, rid, body='ok')


def buttonA_wasPressed():
  global methodmsg, threshold, temperature, humidity, pressure
  azure.publish_D2C_message(str((json.dumps(({'start':1})))))
  labelStart.setText('DRY Start')
  wait(3)
  labelStart.setText('')
  pass
btnA.wasPressed(buttonA_wasPressed)

@timerSch.event('timerSendToIoTCentral')
def ttimerSendToIoTCentral():
  global methodmsg, threshold, temperature, humidity, pressure
  azure.publish_D2C_message(str((json.dumps(({'temperature':temperature,'humidity':humidity,'pressure':pressure})))))
  pass


ntp = ntptime.client(host='ntp.nict.jp', timezone=9)
threshold = 50
azure = IoT_Central(scope_id='', device_id='', device_key='')
azure.subscribe_direct_method('reset', azure_direct_reset)
azure.start()
labelHumidity.setText('Humidity')
labelPercentage.setText('%')
labelStart.setText('')
timerSch.run('timerSendToIoTCentral', 30000, 0x00)
while True:
  temperature = hat_env2_0.temperature
  humidity = hat_env2_0.humidity
  pressure = hat_env2_0.pressure
  if humidity < threshold:
    valueHumidity.setColor(0xffffff)
  else:
    valueHumidity.setColor(0xff0000)
  valueHumidity.setText(str(round(humidity)))
  wait(3)
  if (ntp.hour()) == 6 and (ntp.minute()) == 0:
    wait(60)
  wait_ms(2)
```




#2. AzureIoTCentral

* **[デバイス テンプレート] の定義**

M5StickC側と合わせておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/953a9df0-e7e0-c8ef-3810-f5299da5dfd8.png)



#3. Azure IoT Centralのダッシュボード
こんな感じに作りました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/f1312356-ff8e-c6df-7092-0e47418d2b01.png" width=100%>


#実際にやってみた例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/b3ee16cb-3e9f-f92a-5f00-7885833d2922.png)
右下のグラフが湿度と洗濯物を干したタイミングになります。
この例では２回干しています。この日は曇り時々雨でややじめじめした天気でした。

1. 最初の湿度が急に上がった山でバスタオルやタオルなどを干し始めました
1. ２回ぐらい物干し部屋の見に行って、ドアを開けたので、ちょっとだけ湿度が下がっています
1. ２時間ぐらい干しましたが、あまり乾きません
1. 次の洗濯物をしたかったので、コインランドリーに行くことにしました
1. 洗濯物を取り込んだので、湿度が急に下がっています
1. 次の洗濯物を干し始めます。次は、比較的乾きやすい素材のものが多いです
1. その前のタオル類に比べると、湿度が下がってくるペースが速いです
1. 下がり切っているあたりで見に行ったらほぼ乾いてました
1. そこからはドアを開けていたので、緩やかに外気に近づいて行っています


#気が付いたこと
* 洗濯物を干すとやっぱり湿度は上がる（そして、結構一気にあがる）
* タオル類は乾きにくいと思っていたけど、思っていた以上に顕著に傾向が出る
* メッシュ素材のものは思ってる以上にすぐに乾いた
* 測ってみてグラフ化すると傾向が見えてくる（素材や量によって全然変わる）

#工夫した点
洗濯物を干したタイミングで、M5StickCのボタンを押すと、洗濯物を干したイベントが Azure IoT Central 側に通知されます。これで、物干し部屋の湿度変化と干し始めたタイミングが分かるようになります。干したタイミングから湿度が上がることや、除湿機を掛けながら湿度が下がっていく様子が分かりやすくなります。
あとは、天気の影響が大きそうなので、ダッシュボードに天気も分かるようにしておきました。これで、洗濯物を干す前から湿度が多いとか、今日は湿度が低いとかがより分かりやすくなります。

#最後に
**M5StickC** と **Azure IoT Central** を使うことで、前からなんとなく少し困ったなと思っていた課題がよりクリアに分かるようになりました。感覚的にそうかなと思っていても、ちゃんと見える化することは大切だと思います。
こんなお手軽に試せるのは、**M5StickC** と **Azure IoT Central** のおかげ。


初めてだけど、なんかやってみたいと思った人向けに段階的に記事に纏めてますので、良かったら。
1. [M5StickCとAzure IoT Centralを連携してデータを可視化する① ～M5StickC開発環境準備編～](https://qiita.com/yukimatsu/items/52c6b8435cc81d1c9dfa)
1. [M5StickCとAzure IoT Centralを連携してデータを可視化する② ～Azure IoT Central環境構築編～](https://qiita.com/yukimatsu/items/e35542e16792e7818720)
1. [M5StickCとAzure IoT Centralを連携してデータを可視化する③ ～M5StickCとAzure IoT Central接続編～](https://qiita.com/yukimatsu/items/c72ee84fb64cb4ba5118)




#おまけ：時系列変化の詳細

**洗濯物を干す前**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/d32d530c-589d-b70a-80d4-9dccd4673628.png)

**洗濯物を干したとき**
タイミングが分かりやすいようにしてあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/b0d4e851-a5a5-2576-3d0a-ddc7be4dc817.png)


**２時間ぐらい経過**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/f1312356-ff8e-c6df-7092-0e47418d2b01.png)


**次の洗濯をしたいから、前のを取り込んでコインランドリーに**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/8e65ee8b-dce0-bdc7-5283-e25ad5d2846a.png)


**次の洗濯物を干し始めた**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/cbd54881-6229-ce9e-b7ae-1956402b33b0.png)


**洗濯物が乾いた**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/55b45b60-36cb-e3a6-b188-db830382a168.png)

**除湿機が止まって、徐々に外気に近くなる**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/c4e570bc-1006-718e-28ab-715d15c48010.png)

**だんだん外気と一緒になるけど、思ったより時間が掛かる**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/b3ee16cb-3e9f-f92a-5f00-7885833d2922.png)

# おまけ
本記事は、以下のキャンペーンに参加しています。

https://qiita.com/official-events/b7811ce1542be54e6efe