ぼくのデジタルライフ

ただのガジェット好きがダラダラ書いていくブログ

DHT11とESP8266で不快指数によってLEDの色を変えてみる

f:id:computer-life:20190504230625p:plain

用意したもの

用意したものはこんな感じ。

ESP-WROOM-02開発ボード

今回も秋月の「ESP-WROOM-02開発ボード」を使います。

DHT11

気温と湿度が測れるセンサーです。300円ぐらいと安価に入手できます。気温は0~50℃までしか測れないらしいです。

PL9823-F5

今回は、5mmのものを買いましたが8mmのものもあるようです。マイコン内蔵で信号線を1本つなぐだけで色を制御できるので、ケーブルがごちゃごちゃしなくて済みそう。Arduino用のライブラリが用意されていて手軽に扱えます。

抵抗

DHT11のプルアップ用に10KΩの抵抗を用意しました。

PL9823のデータシートに書いてある「特徴」には、「外部コンポーネントはいらない」って書いてあるんだけど、 「アプリケーションノート」には抵抗とコンデンサーがある...

どういうことだろう?

とりあえず抵抗は「なし」で行くことにします。不安な方は適当な抵抗を用意してください。

回路図

最初に出てた写真の通りだとケーブルがごちゃごちゃしてて、わかりにくくなってしまったので回路図を変更。 この通りに組むと後述のプログラムがそのまま動くようになってます。

DHT11はVDDとDATEのピンを10KΩの抵抗でプルアップしています。

PL9823のつなぎ方はデータシートを参考にしてください。

http://akizukidenshi.com/download/ds/rita/pl9823.pdf

回路図

プログラム

ここでは以下のライブラリをつかいました。まずはインストールしておきましょう。

不快指数の算出に関してはこちらを参考にさせていただきました。 qiita.com ja.wikipedia.org

今回、LEDの色は以下のようにしてみました。

不快指数 体感 RGB
〜55 寒い 101, 0, 203
55〜60 肌寒い 0, 50, 203
60〜65 何も感じない 0, 152, 203
65〜70 快い 0, 203, 152
70〜75 暑くない 152, 203, 0
75〜80 やや暑い 203, 152, 0
80〜85 暑くて汗が出る 203, 101, 0
85〜 暑くてたまらない 203, 0, 0

例えば気温25℃、湿度65%だったときの不快指数は73.3。「暑くない」に該当するのでLEDが黄緑色っぽく光るはずです。

写真だと白飛びしちゃってわかりにくいですね。

ソースコード

#include <DHT.h>
#include <Adafruit_NeoPixel.h>

#define DHTPIN 14 //DHT11のピン番号
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

#define LEDPIN 2 //LEDののピン番号
#define NUMPIXELS 1 //LEDの個数
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, LEDPIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  Serial.begin(115200);

  pixels.begin(); //NeoPixel開始
  pixels.setBrightness(255); //LEDの輝度を指定
  dht.begin();  //DHT11開始
}

void loop()
{
  float humi = dht.readHumidity();  //湿度を取得
  float temp = dht.readTemperature();  //気温を取得
  int   index = 0;  // 不快指数の小数点以下切り捨て
  index = 0.81 * temp + 0.01 * humi * (0.99 * temp - 14.3) + 46.3;  //不快指数の算出

  //取得したデータをシリアルでプリント
  Serial.print("Humidity:  ");
  Serial.print(humi);
  Serial.println("%\t");
  Serial.print("Temperature:  ");
  Serial.print(temp);
  Serial.println(" *C");
  Serial.print("Discomfort Index: ");
  Serial.println(index);

  //LED表示
  for (int i = 0; i < NUMPIXELS; i++) {
    if (index <= 54) {
      pixels.setPixelColor(i, pixels.Color(101, 0, 203));
    }
    else if (55 <= index && index <= 59) {
      pixels.setPixelColor(i, pixels.Color(0, 50, 203));
    }
    else if (60 <= index && index <= 64) {
      pixels.setPixelColor(i, pixels.Color(0, 152, 203));
    }
    else if (65 <= index && index <= 69) {
      pixels.setPixelColor(i, pixels.Color(0, 203, 152));
    }
    else if (70 <= index && index <= 74) {
      pixels.setPixelColor(i, pixels.Color(152, 203, 0));
    }
    else if (75 <= index && index <= 79) {
      pixels.setPixelColor(i, pixels.Color(203, 152, 0));
    }
    else if (80 <= index && index <= 84) {
      pixels.setPixelColor(i, pixels.Color(203, 101, 0));
    }
    else {
      pixels.setPixelColor(i, pixels.Color(203, 0, 0));
    }
    pixels.show(); //色を出力
  }
  delay(5000); //5秒おきにチェック
}