Nefry BTでほぼノンプログラムな湿度管理したい


この記事は[Nefry Advent Calendar 2017](https://qiita.com/advent-calendar/2017/nefry)7日目の記事です。年末は時空歪みがち。

弊dotstudioは異常に湿度が低く、油断すると声が出なくなるので「**湿度が40%を下回ったらLINEに通知する**」という機能を作ってみました。

ちなみにQiitaをヘビーユーズしすぎてアップロード制限かかっていて苦しい感じで書いています。笑
[![https://gyazo.com/20dbb7477e4bfe2018b9ff8c7635b9e3](https://i.gyazo.com/20dbb7477e4bfe2018b9ff8c7635b9e3.png)](https://gyazo.com/20dbb7477e4bfe2018b9ff8c7635b9e3)

## 使うもの

- Nefry BT
- Grove 温湿度センサ
- （Groveケーブル 5cm）

[![https://gyazo.com/056da13768b8d0a8f1124448b1abe970](https://i.gyazo.com/056da13768b8d0a8f1124448b1abe970.jpg)](https://gyazo.com/056da13768b8d0a8f1124448b1abe970)

Nefryは小さくて省スペースなので、ケーブルもせいごさん（@tseigo）の紹介していた短いものを使ってみます！

## IFTTTにアプレットを作成
「[**Nefry BTとIFTTTでスイッチを押したらLINEを送る仕組みを作ってみよう**](https://dotstud.io/blog/nefry-ifttt-push-line/)」の記事を参考に、Nefry用のアプレットを作成します。

「Webhook」をトリガーに「LINE Notify」を送るよう設定。アウトプットはSlackでもTwitterでもGmailでもなんでもOK。
[![https://gyazo.com/256c60e37bcc433769d640b883893fc4](https://i.gyazo.com/256c60e37bcc433769d640b883893fc4.png)](https://gyazo.com/256c60e37bcc433769d640b883893fc4)

Nefry側ではWebコンソールでIFTTTのキーを設定します。キーの取得は「Webhook」のセッティングから。
[![https://gyazo.com/0411a7c9a497c19e4477b4a7d0047abe](https://i.gyazo.com/0411a7c9a497c19e4477b4a7d0047abe.png)](https://gyazo.com/0411a7c9a497c19e4477b4a7d0047abe)

ちなみにIFTTTを使ってみるスケッチが、現在最新のNefryライブラリ1.1.3だと動かないみたい。。直前まで使ってた1.0.6ではとりあえず動きました。

## 温湿度センサのサンプルスケッチを試す
GroveのArduino用の温湿度センサのサンプルプログラムをとりあえず試してみます。

下記からライブラリをダウンロード。

https://github.com/Seeed-Studio/Grove_Temperature_And_Humidity_Sensor

スケッチ例［Humidity_Temperature_Sensor］の［DHTtester］を試してみる。

スケッチにある通りA0にセンサをセット。
[![https://gyazo.com/33609c85c898e8cca5c164e1777a010f](https://i.gyazo.com/33609c85c898e8cca5c164e1777a010f.jpg)](https://gyazo.com/33609c85c898e8cca5c164e1777a010f)

シリアルモニタで確認。
[![https://gyazo.com/42934ccd6a99cd928700a1e4651aa608](https://i.gyazo.com/42934ccd6a99cd928700a1e4651aa608.png)](https://gyazo.com/42934ccd6a99cd928700a1e4651aa608)

おっ。。。

## 対策１：ピン設定を変えてみる
「[NefryBTでGroveセンサーをつなげる時の？について](https://qiita.com/HiroyukiYasui/items/cf477e9ce83682513ab1)」という記事を見ると、対応するピンというものがあるらしい。

Nefry BTドキュメントの[関連リンク](https://dotstud.io/docs/nefrybt-link/)にある「[説明書](https://drive.google.com/file/d/0B_mvDQF8yaQRLVprUHl4WTFLWVE/view)」を読んでみる。

うこさん（@ukk0）に助けてもらいつつ、A0は「25」で使えるらしいことを確認。（13ページ目）
[![https://gyazo.com/df094b2e4fe7311d6b890538c99b2ba9](https://i.gyazo.com/df094b2e4fe7311d6b890538c99b2ba9.png)](https://gyazo.com/df094b2e4fe7311d6b890538c99b2ba9)

サンプルスケッチのピンを書き換え。
[![https://gyazo.com/cedc1f67cc4ad2871275a125c77fe013](https://i.gyazo.com/cedc1f67cc4ad2871275a125c77fe013.png)](https://gyazo.com/cedc1f67cc4ad2871275a125c77fe013)

いざ！
[![https://gyazo.com/42934ccd6a99cd928700a1e4651aa608](https://i.gyazo.com/42934ccd6a99cd928700a1e4651aa608.png)](https://gyazo.com/42934ccd6a99cd928700a1e4651aa608)

 \_( :⁍ 」 )\_ 

## 対策２：ライブラリを変えてみる
Nefry製作者のわみさん（@wamisnet）にこっちのライブラリ試してみて、と言われたので下記を試す。

https://github.com/adafruit/DHT-sensor-library

そのまま書き込むと以下のエラーが順番にでる。

- DHTのライブラリが複数あるよ -> 上で入れた「Grove_Temperature_And_Humidity_Sensor」消す
- Adafruit_Sensorライブラリないよ -> これも入れる https://github.com/adafruit/Adafruit_Sensor

DHTtesterのサンプルスケッチを開き直して試す。
[![https://gyazo.com/499250057b709f95843748d50185b6e9](https://i.gyazo.com/499250057b709f95843748d50185b6e9.png)](https://gyazo.com/499250057b709f95843748d50185b6e9)

**灼　熱　地　獄**

わみさんのコメントを参考にDHT11に変更する。
[![https://gyazo.com/32b381761ebe39af2bc07c5317a07a48](https://i.gyazo.com/32b381761ebe39af2bc07c5317a07a48.png)](https://gyazo.com/32b381761ebe39af2bc07c5317a07a48)

トライ。
[![https://gyazo.com/6fb9e3ce235b5b82ab7e766ad6edb04b](https://i.gyazo.com/6fb9e3ce235b5b82ab7e766ad6edb04b.png)](https://gyazo.com/6fb9e3ce235b5b82ab7e766ad6edb04b)

読めたよーーっ！！

## まとめ
~~あと一歩でいける気がしているので12月中に頑張りたいなと思っています。。~~

湿度が40%を下回ったらLINE通知飛ばすようにできました！

[![https://gyazo.com/ff99ab43e6a083fc85ddec50c9317167](https://i.gyazo.com/ff99ab43e6a083fc85ddec50c9317167.png)](https://gyazo.com/ff99ab43e6a083fc85ddec50c9317167)

めっちゃうざい。

チェックする時間を10分に1回（たぶん）にしました。

```arduino.ino
#include <Nefry.h>
#include <NefryIFTTT.h>
#include "DHT.h"

#define DHTPIN A0
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

String Event, SecretKey;
int counter = 0;

void setup() {
  Nefry.setStoreTitle("SecretKey", 0);
  Nefry.setStoreTitle("Event", 1);
  SecretKey = Nefry.getStoreStr(0);
  Event = Nefry.getStoreStr(1);
  Serial.begin(9600);
  Serial.println("DHTxx test!");

  dht.begin();
}

void loop() {
  delay(600000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  float hif = dht.computeHeatIndex(f, h);
  float hic = dht.computeHeatIndex(t, h, false);

  if (h < 40) {
    bool sendData = IFTTT.send(Event, SecretKey, (String)h, (String)(micros()/1000000)+"秒",(String)counter); 
    if (!sendData) {
      Nefry.setLed(255, 0, 0);
    }
  }
  
  Nefry.ndelay(1000);
  Serial.print("Humidity: ");
  Serial.print(h);
}
```

40%を下回ったら通知、その後湿度が40％以上になったあとまた下回ったら通知、としたいのでよい実装法があれば教えてください(´・ω・`)