ふと,だいぶ前に大須のショップで買った電子工作用素子が目に入った.
「DHT11」という,温度と湿度を計測してシリアル通信によって出力できる素子.
寒くなってからというもの,暖房で部屋が乾燥しまくりなので,DHT11を用いて簡易湿度計を作ってみた.
久しぶりに?インドアな週末.
ArduinoとDHT11で湿度計作製
用意するモノ
- Arduino uno
- DHT11
- ブレッドボード
- LED×4
- ジャンパ線
- カーボン抵抗(510Ω×4,10kΩ×1)
DHT11とは?
電子工作に使えるセンサのひとつ.
温度と湿度を測ることができる.
測った温度・湿度は,Arduinoと接続することでシリアル通信によって値を取得することができる.
素子の値段は480円だった.大須の第1アメ横ビルにぶらっと立ち寄って買ってきたもの.
素子の写真↑
3本ピンがあって,真ん中のDATA端子をArduinoのデジタルピンに接続して使う.
ちなみにDHT11は,だいぶ前に購入したArduinoをはじめようというO’REILLY本に掲載されていてた.素子の使い方はこの本を参考にした.
動作イメージ
DHT11を使うのははじめてなので,
とりあえず温度と湿度を取得して,最低限のフィードバックとして「湿度に応じてLチカ」させてみようと思う.
動作イメージは
- LEDを4つ設置
- 湿度取得(定期的に更新)
- 湿度が低い:点灯LED少ない
湿度が高い:点灯LED多い
今下宿の部屋には温度計・湿度計がない.暖房で乾燥が気になっていて,湿度を測りたいな~と思っていたのでちょうどいい.正確性はさておき,とりあえずDHT11に測ってもらおう.
DHT11の使い方
DHT11を動かすためには,ArduinoIDEへ専用ライブラリをインクルードする必要がある.
必要なライブラリについてはこちらの記事を参考にダウンロードした.
回路図
DHT11を回路に組み込むときは,プルアップ抵抗(10k程度)が必要になる.
V_cc端子とDATA端子の間に10kΩの抵抗を組み込んで,回路図は以下の通り.
※LEDにつなぐ抵抗は,回路図では220Ωになっているが実際は510Ωをつないだ.
DHT11を動かすには電源とGNDを確保する必要があり,それらはアナログピンの横にあるピンから引っ張ってきた.
一方LEDを光らせる回路のGNDはデジタルピン側のGNDと繋ぐ.
ソースコード全体
以下に,動作させるソースコードを示す.
思いついたままをガーッと書いただけ.
#include "DHT.h" #define DHTPIN 13 // Digital pin connected to the DHT sensor #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); const int led3 = 2 ;// the number of the LED pin const int led2 = 5; const int led1 = 8; const int led0 = 11; int ledState = LOW; void setup() { // set ledpin "output" pinMode(led0, OUTPUT); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); // serial communication(DHT11) Serial.begin(9600); Serial.println(F("------start measurement-------")); dht.begin(); } void loop() { delay(1000); // Wait a few seconds between measurements. float h = dht.readHumidity(); float t = dht.readTemperature(); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) ) { Serial.println(F("Failed to read from DHT sensor!")); return; } Serial.print(F("Humidity: ")); Serial.print(h); Serial.print(F("% Temperature: ")); Serial.print(t); Serial.print(F("°C \n")); // 4つのLEDで湿度レベルを表現 // LEDを初期化 digitalWrite(led0, ledState); digitalWrite(led1, ledState); digitalWrite(led2, ledState); digitalWrite(led3, ledState); if (h >= 70) { // 除湿しましょう(カビに注意!) digitalWrite(led0, HIGH); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); delay(50); digitalWrite(led0, LOW); digitalWrite(led1, LOW); digitalWrite(led2, LOW); digitalWrite(led3, LOW); } // 適湿です else if (h >= 60) { digitalWrite(led0, HIGH); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); digitalWrite(led3, HIGH); } else if (h >= 50) { digitalWrite(led0, HIGH); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); } else if (h >= 40) { digitalWrite(led0, HIGH); digitalWrite(led1, HIGH); } else if (h >= 30) { digitalWrite(led0, HIGH); } else { // 加湿しましょう digitalWrite(led0, HIGH); delay(50); digitalWrite(led0, LOW); } }
DHT11に関するソースコードは,ライブラリからサンプル例をちょっといじくっただけ.プラスしてLEDを条件分岐で光らせるコードを追記した.
湿度については→
http://www.crecer.jp/Q-A/HTML/A-11.html
を参考に,LEDの個数を決めてみた.
ループ内に書いてあるのは以下の点灯ルールを踏まえたコード.
湿度60%以上(適湿):4つ点灯
湿度50%以上(適湿):3つ点灯
湿度40%以上(やや乾燥):2つ点灯
湿度30%以上(やや乾燥):1つ点灯
湿度30%未満(乾燥しすぎ!):1つフラッシュ
動作のようす
コードをコンパイルしてボードに書き込み,実際に動かしてみる.
シリアルモニタを起動すると…
下の写真奥にある通り,計測した湿度(Humidity)と温度(Temperature)が表示され始める.接続は成功!
また,撮影時の湿度は47%であり,条件分岐の通りLEDがちゃんと2つ点灯している.
画像だとわかりづらいので,動画もどうぞ.
まとめ:部屋はものすごく乾燥していた
以上,週末電子工作の記録.
Aruino unoのシリアル通信機能は今回初めて使ったが,なかなか楽しい.
今度は赤外線人感センサでも買ってきてライトの自動点灯とかもやってみようかな?
あと,DHT11計測結果から
部屋がものすごい乾燥していたこともわかった.
一通り遊んだら,片付けをしてamazonで加湿器をポチった.
_____________
【参考情報】
DHT11購入:アメ横第1ビル電脳街(大須),(秋月電子通商でも購入可能)
回路図作成ソフト:Fritzing (ver 0.9.4.64pc)
参考資料:Massimo Banzi,Michael Shioh,「Arduinoをはじめよう 第3版」,O’REILLY JAPAN