用意したもの
用意したものはこんな感じ。
ESP-WROOM-02開発ボード
今回も秋月の「ESP-WROOM-02開発ボード」を使います。
DHT11
気温と湿度が測れるセンサーです。300円ぐらいと安価に入手できます。気温は0~50℃までしか測れないらしい。 DHT11のプルアップ用に10KΩの抵抗を用意しておきました。
PL9823-F5
今回は、5mmのものを買いましたが8mmのものもあるようです。マイコン内蔵で信号線を1本つなぐだけで色を制御できるので、ケーブルがごちゃごちゃしなくて済みそう。Arduino用のライブラリが用意されていて手軽に扱えます。
データシートに「外部コンポーネントが不要」みたいなことが書かれていたので、気になって調べてみたところ、こちらのブログがヒット。参考にさせていただきました。
抵抗はなくても良さそうなので、今回は無しにしました。不安な方は適当な抵抗を用意してください。
回路図
最初に出てた写真の通りだとケーブルがごちゃごちゃしてて、わかりにくくなってしまったので回路図を変更。 この通りに組むと後述のプログラムがそのまま動くようになってます。
DHT11はVDDとDATEのピンを10KΩの抵抗でプルアップしています。
PL9823のつなぎ方はデータシートを参考にしてください。
http://akizukidenshi.com/download/ds/rita/pl9823.pdf
プログラム
ここでは以下のライブラリをつかいました。まずはインストールしておきましょう。
不快指数の算出に関してはこちらを参考にさせていただきました。 qiita.comja.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)); } elseif (55<= index && index <= 59) { pixels.setPixelColor(i, pixels.Color(0, 50, 203)); } elseif (60<= index && index <= 64) { pixels.setPixelColor(i, pixels.Color(0, 152, 203)); } elseif (65<= index && index <= 69) { pixels.setPixelColor(i, pixels.Color(0, 203, 152)); } elseif (70<= index && index <= 74) { pixels.setPixelColor(i, pixels.Color(152, 203, 0)); } elseif (75<= index && index <= 79) { pixels.setPixelColor(i, pixels.Color(203, 152, 0)); } elseif (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秒おきにチェック }