最近朝起きると喉がカラカラになっているので、いい感じの湿度を保つ加湿器コントローラーを2時間で作る

この記事は [obniz Advent Calendar 2020 5日目](https://qiita.com/advent-calendar/2020/obniz)の記事です。
obniz + 赤外線 LED で、リモコンコンセント OCR-05W を動かしてみます。

4 日目は@tseigo さんの「[Node-RED から obniz ノードをつかって Grove Water Level Sensor をつなげてみる](https://qiita.com/tseigo)」でした。

## 朝起きると喉が痛い

最近、冬になって空気が乾燥してきていますね。
夜寝るときは気にならないのですが、朝起きると口から鼻から粘膜が乾燥してしまいます。

我が家にも超音波式の加湿器があるのですが、つまみで噴出量を調整するタイプのもので、

- 量が少ないと加湿しきれず、朝喉がカラカラになり、
- 量が多すぎると加湿は良いが、床がびちょびちょになり、

ちょうどつまみの回し具合を探し当てるのが大変です。

本記事では、加湿器の電源を自動で ON/OFF させることで、いい感じの湿度にしてくれるコントローラーを実働 2 時間で作成していきます。
（※[材料](https://qiita.com/tmisuoka0423/items/c8d950d9c450826845b5#%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B%E6%9D%90%E6%96%99)は前もって用意しておいてください）

## 睡眠時の適切な湿度は50％～60%

[布団の西川さんによる](https://www.nishikawa1566.com/company/laboratory/topics/03/)と、寝室の湿度は**50％～60%**が丁度良いみたいです[1]。
今回はこの範囲を狙っていきましょう。

## 動作イメージ

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">ちょっと見えにくいけど動くようになった <a href="https://t.co/y6jnFNpDqz">pic.twitter.com/y6jnFNpDqz</a></p>&mdash; Takahiro Mitsuoka (@tmitsuoka0423) <a href="https://twitter.com/tmitsuoka0423/status/1329421026334162949?ref_src=twsrc%5Etfw">November 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 用意する材料

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">HS105のエラー解決しなそうなので、赤外線でコントロールできるコンセントOCR-05Wに変更<a href="https://twitter.com/hashtag/%E6%9C%9D%E6%B4%BB?src=hash&amp;ref_src=twsrc%5Etfw">#朝活</a> <a href="https://t.co/hpvGVPc1nC">pic.twitter.com/hpvGVPc1nC</a></p>&mdash; Takahiro Mitsuoka (@tmitsuoka0423) <a href="https://twitter.com/tmitsuoka0423/status/1329229333106286592?ref_src=twsrc%5Etfw">November 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- obniz Board
    - IoT プロトタイピングボード。JavaScript で動くので Web アプリエンジニアにも優しい。
    - 6000 円くらい
    - 公式で購入：https://obniz.com/ja/products/obnizboard/
- 温湿度センサー SHT31
    - 湿度が測定できれば何でも OK。
    - 1000 円くらい
    - 秋月で購入：https://akizukidenshi.com/catalog/g/gK-12125/
- リモコンコンセント OCR-05W
    - 赤外線リモコンで ON/OFF できるコンセント
    - 2000 円くらい
    - Amazon で購入：https://www.amazon.co.jp/dp/B01ABMGGQ8
- 赤外線 LED
    - 何でも OK
    - 100 円くらい
    - 秋月で購入：https://akizukidenshi.com/catalog/g/gI-03261/
- 抵抗
    - 5Ωのもの
    - セットで 100 円くらい
    - 秋月で買えます（ページ見つからなかった）
- 加湿器
    - 電源をつけたり消したりしても継続して動くもの
    - ホームセンターで購入
- その他あると良いもの
    - ブレッドボード
    - オスオスのピン or ジャンパワイヤ

## 加湿器コントローラーを作っていく

### obnizと湿度センサー＆赤外線LEDを接続する

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">こんな感じで、”obnizの0番ピン”と”SHT31のV+”がつながるようにブレッドボードにさす <a href="https://t.co/9kO4jqUFn1">pic.twitter.com/9kO4jqUFn1</a></p>&mdash; Takahiro Mitsuoka (@tmitsuoka0423) <a href="https://twitter.com/tmitsuoka0423/status/1327251993388146688?ref_src=twsrc%5Etfw">November 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">ブレッドボードには赤外線LEDと抵抗を追加。<br>obnizの6番ピンと11番ピンに接続。<a href="https://twitter.com/hashtag/%E6%9C%9D%E6%B4%BB?src=hash&amp;ref_src=twsrc%5Etfw">#朝活</a> <a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://t.co/Pka7gwQa0I">pic.twitter.com/Pka7gwQa0I</a></p>&mdash; Takahiro Mitsuoka (@tmitsuoka0423) <a href="https://twitter.com/tmitsuoka0423/status/1329229910292905985?ref_src=twsrc%5Etfw">November 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### プログラムを書く

基本動作としては、湿度を取ってきて、赤外線 LED から信号を送るだけのシンプルなプログラムです。
1 分間隔で動作するようにループさせています。
(追記：@il9437 さんのアドバイスにより改良。ありがとうございます。)

```javascript
const Obniz = require('obniz');
const { on, off } = require('./signal');

const callback = async () => {
    const obniz = new Obniz(process.env.OBNIZ_ID);
    obniz.connect(); // obnizに接続
    await obniz.connectWait();
    const sensor = obniz.wired("SHT31", { vcc: 0, sda: 1, scl: 2, adr: 3, gnd: 4, addressmode: 5 });
    const irLed = obniz.wired('InfraredLED', { anode: 6, cathode: 11 });

    const { temperature, humidity } = await sensor.getAllWait();
    console.log(new Date(), temperature, humidity);

    if (humidity < 50) { // 湿度に応じてOCR-05WをON/OFF
        irLed.send(on);
    } else if (humidity > 60) {
        irLed.send(off);
    }

    obniz.close(); // 繰り返し実行するので1回毎に切断する
};

setInterval(callback, process.env.INTERVAL || 60 * 1000); // 1分毎に実行する
```

ソースコードは GitHub にアップしています。
https://github.com/tmitsuoka0423/obniz-auto-humidifier

SHT31 を使用して、上記の写真通りピンを接続すれば、そのまま使えるはずです。
ピンの位置を変える場合は、プログラムを修正してください。

### 実行する

以下のコマンドで動作します。
`OBNIZ_ID`は、obniz Board の画面に表示されている 4 桁-4 桁の数字を入れてください。

```bash
$ npx cross-env OBNIZ_ID=xxxx-xxxx node index.js
```

## 使ってみてわかったこと：ON/OFFさせる条件には幅を持たせた方が良い

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">さっそく動かしてみてるけど、数分おきに加湿器が動いたり止まったりして、めっちゃ気になる👀</p>&mdash; Takahiro Mitsuoka (@tmitsuoka0423) <a href="https://twitter.com/tmitsuoka0423/status/1329430956348829696?ref_src=twsrc%5Etfw">November 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

最初は、

- `if 湿度 < 55%　→　加湿器ON`
- `else　→　加湿器OFF`

で制御していたのですが、湿度が 55％を行ったり来たりするたびに加湿器が ON/OFF され、気になり寝られず、すぐに以下の条件にプログラムを修正しました。

- `if 湿度 < 50%　→　加湿器ON`
- `else if 湿度 > 60%　→　加湿器OFF`

こうすることで、湿度が 50％未満になったら加湿器が ON になり 60%を超えるまで OFF になりません（逆も然り。）。
気にならないレベルになりました。使ってみるって大事ですね。

## まとめ

実働 2 時間くらいで作りましたが、割と満足いくものができました。
寝てる間は加湿器を調整することはできないので、自動で制御させるのが良いですね。

6 日目は@youtoy さんです！

## 参考文献

1. 良い睡眠の条件 - https://www.nishikawa1566.com/company/laboratory/topics/03/