NefryBT と DHT11 と WaterAtomization で湿度を 制御 (コントロール) してみた。

こんにちは。野良ハックチーム ざっきーと申します。
Nefry Advent Calendar 2018の 7日目を担当します。
2018 年も NefryBT には大変お世話になったので、その"良さみ"を書き残して年を越したいと思います。

NefryBT はオンボード LED と OLED ディスプレイが付いているので、状態や各種センサーで取得したデータを直ぐに可視化できて良いですよね！

# みんな大好き DHT11 (温湿度センサー)

<a href="http://wiki.seeedstudio.com/Grove-TemperatureAndHumidity_Sensor/">Grove 端子が付いた DHT11</a> です。Grove ケーブルで NefryBT と接続してサクッと動作させることができます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/6c655631-38d8-bcd2-f50a-a2e74b6a18e7.png" width="50%">

# Water Atomization (水噴霧) デバイス

<a href="http://wiki.seeedstudio.com/Grove-Water_Atomization/">Grove 端子が付いた Water Atomization (水噴霧) デバイス</a> です。基板に付属している超音波振動子 (丸い金属板にシリコン Oリングをはめたモノ) で水を霧状にします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/9684e8cc-a7f5-f095-bb3e-69b22e67226a.jpeg" width="50%">

○ルツから購入できますが、在庫は無く海外からの輸入になるので、注文してから手元に届くまで 1ヶ月程度掛かります。(´・ω・`)
![スクリーンショット 2018-12-01 23.39.32.png](https://qiita-image-store.s3.amazonaws.com/0/72479/a8ef5225-5bef-cb57-6a52-6d2a575dc2d7.png)

# 構成・配線図
![構成配線図.png](https://qiita-image-store.s3.amazonaws.com/0/72479/7b88cfd1-7cc0-bd91-8aa0-db7e0a507505.png)

Water Atomization は動作する電源電圧が 5V となっており、残念ながら NefryBT とは Grove コネクタでは接続できません。Grove - 4 PIN ジャンパオスケーブルが必要になります。(´・ω・`)

超音波振動子は水の上にティシュを敷いてその上に置くような感じにします。
最初、水の中に沈めてしまい、全く動作しませんでした・・。(´・ω・`)
<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/3c0ab39e-bda3-91a9-a7ef-bac279309364.jpeg" width="50%">

# 動作概要
温度・湿度を測定　→ 条件 (湿度が 30% 未満) → 加湿ON / オンボードLED (赤)　→
温度・湿度を測定　→ 条件 (湿度が 30% 以上) → 加湿OFF / オンボードLED (緑) →
を繰り返します。

加湿ON (湿度が30%未満の場合)
<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/8d730042-7214-43eb-b0af-d4798a74316b.jpeg" width="50%">
加湿OFF (湿度が30%以上の場合)
<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/8992011e-9ead-e348-ea19-b81073a7b13c.jpeg" width="50%">

# ソースコード
前提条件として DHT11 ライブラリのインストールと日本語フォント対応が必要ですが、Nefry Advent Calendar 2017 で えむにわ (@m2wasabi) さんが<a href="https://qiita.com/m2wasabi/items/ec55ddb34dee8f2ceba3">記事</a>を書かれています。Water Atomization は特別なライブラリは必要ありません。(L チカと同じ要領です。)

サンプルコードは <a href="https://github.com/kitazaki/NefryBT_DHT11_WaterAtomization/blob/master/NefryBT_DHT11_WaterAtomization_01.ino">こちら</a> 。

```c:NefryBT_DHT11_WaterAtomization_01.ino
#include <Nefry.h>
#include <NefryDisplay.h>
#include <NefrySetting.h>
#include <misakiUTF16.h>
#include "DHTesp.h"

DHTesp dht;

void setting(){
  Nefry.disableDisplayStatus();
}

NefrySetting nefrySetting(setting);

void misakiPrint(int x, int y, char * pUTF8) {
  int n=0;
  byte buf[20][8];  //160x8ドットのバナー表示パターン
  while(*pUTF8)
    pUTF8 = getFontData(&buf[n++][0], pUTF8);  // フォントデータの取得

  // 文字の描画
  for (byte i=0; i < 8; i++) {
    for (byte j=0; j < n; j++) {
      for (byte k=0; k<8;k++) {
        if(bitRead(buf[j][i],7-k)) {
          NefryDisplay.setPixel(x + 8*j + k , y + i);
        }
      }
    }
  }
}

void displayInfo() {
    float temperature = dht.getTemperature();
    float humidity = dht.getHumidity();
    Serial.print("temperature: ");
    Serial.println(temperature);
    Serial.print("humidity: ");
    Serial.println(humidity);
    NefryDisplay.clear();
    NefryDisplay.setFont(ArialMT_Plain_24);
    misakiPrint(0,0, "気温:");
    misakiPrint(0,20, "湿度:");
    misakiPrint(75,10, "℃");
    misakiPrint(75,30, "%");
    char s_temperature[8];
    dtostrf(temperature, 2, 1, s_temperature);
    char s_humidity[8];
    dtostrf(humidity, 2, 1, s_humidity);
    NefryDisplay.drawString(25, 0, s_temperature);
    NefryDisplay.drawString(25, 20, s_humidity);
    NefryDisplay.display();
    if (humidity < 30) {
      Nefry.setLed(255, 0, 0);
      Serial.println("Water Atomization: ON");
      digitalWrite(A2, HIGH);
    } else {
      Nefry.setLed(0, 255, 0);
      digitalWrite(A2, LOW);
      Serial.println("Water Atomization: OFF");
    }
}

void setup() {
  Serial.begin(115200);
  dht.setup(25); // A0:IO25
  pinMode(A2, OUTPUT); // A2:Grove Water Atomization
  NefryDisplay.clear();
  NefryDisplay.setFont(ArialMT_Plain_24);
  misakiPrint(0,0, "気温:");
  misakiPrint(0,20, "湿度:");
  misakiPrint(75,10, "℃");
  misakiPrint(75,30, "%");
  NefryDisplay.display();
}

void loop() {
  delay(dht.getMinimumSamplingPeriod());
  displayInfo();
  delay(100);
}
```

# まとめ
今回は簡易的な加湿器を作ってみました。冬は乾燥するし、エアコンなどの暖房器具を使うと更に乾燥しますよね！適度な湿度を保って、インフルエンザや風邪などを引かぬよう、穏やかな年末年始をお過ごしください。

では、良き NefryBT ライフを！
<img src="https://qiita-image-store.s3.amazonaws.com/0/72479/ba9b2c21-db63-7902-6483-f8646a9ad02c.jpeg" width="75%">