Prismjs

2019年1月8日火曜日

DHT11を使ってArduinoで温度と湿度を取得する

秋月電子でDHT11を買ったのでArduino UNOに接続して温度と湿度をシリアルモニタに表示させました。
DHT11のライブラリに付属するスケッチの例ほぼそのままで動作確認しました。
DHTクラスをインスタンスして、beginしたらあとはreadするだけで簡単に温度と湿度を取得できます。簡単にWi-Fi温度計も作れそうですね。



準備するもの

・Arduino (今回はArduino UNO互換ボード)
・Arduino書き込みUSBケーブル(Arduino UNOはtypeB)
・DHT11
・ブレッドボード
・ジャンパワイヤ

①ArduinoにDHT11を接続する

DHT11を穴が開いてる側を見て、ピンを下にしてみたとき、左からVCC、I/O、NC、GNDピンになります。

Arduinoの5VピンにVCC、2番ピンにI/O、GNDピンにGNDを接続してください。DHT11のNCには何も接続しません。


②DHT11用ライブラリを追加する

DHT11用ライブラリはライブラリマネージャ経由で追加するものと、ZIPフォルダをダウンロードして追加するもの2種類を入れる必要があります。
まずはライブラリマネージャ経由で追加しましょう。
スケッチ→ライブラリをインクルード→ライブラリを管理をクリックします。
ライブラリマネージャが開いたら、検索欄にDHTと入れてください。
複数個候補が出てきますが、Adafruit製のby Adafruitと書かれたものをインストールします。More infoを押すと、インストールボタンがあらわれるのでクリックしてインストールしてください。


次に、ライブラリのZIPファイルをGitHubからダウンロードして追加します。
https://github.com/adafruit/Adafruit_Sensorにアクセスして、Clone or download→Download ZIPをクリックするとZIP形式のファイルがダウンロードできます。解凍はしなくて大丈夫です。
 ダウンロードが終わったら、Arduino SDKに戻り、スケッチ→ライブラリをインクルード→.ZIP形式のライブラリをインストールをクリックします。
 さきほどダウンロードしたZIPファイルを指定します。
これでライブラリの追加は完了です。

③サンプルスケッチを開く

ファイル→スケッチの例→DHT sensor library→DHTtesterをクリックしてサンプルスケッチを開きます。
サンプルスケッチは開いたままの状態だとDHT22がdefineされているのでコメントアウトしてDHT11のコメントアウトを外します。「//」を書き換えるだけなので一瞬です。
#define DHTTYPE DHT22→//#define DHTTYPE DHT22
//#define DHTTYPE DHT11→#define DHTTYPE DHT11
スケッチが完成したら(コメントアウトを変えただけですが)書き込みましょう。


以下にDHT11をdefineに変更した後のスケッチを示します。

#include "DHT.h"

#define DHTPIN 2     // what digital pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
}

Serialはシリアルモニタに表示させるためだけの記述なので解説は割愛します。
#define DHTPINで指定した番号のArduinoのピンがDHT11のI/Oと接続され通信されます。
DHT dht(DHTPIN, DHTTYPE);では、先ほどのI/Oと接続されたArduinoピンと、センサーの指定(今回はDHT11)をしてDHTクラスをインスタンスしています。
setup内はdht.begin();でDHTをスタートさせているだけです。
loop内では
float h = dht.readHumidity();で湿度を取得、
float t = dht.readTemperature();では摂氏(セルシウス温度、℃)
float f = dht.readTemperature(true);では華氏(ファーレンハイト度、℉)
float hif = dht.computeHeatIndex(f, h);では体感華氏温度
float hic = dht.computeHeatIndex(t, h, false);では体感摂氏温度
を取得しています。全部float型で返ってきます。
readTemperatureでは引数にtrueを入れてやることで華氏取得に、何もいれないと摂氏取得になるようです。
computeHeatは和訳すると体感温度で、温度と湿度をある計算式に代入すると求められる温度らしいです。(くわしくはwikipediaで体感温度をググってください)
computeHeatIndexはDHT11が体感温度を測定しているわけではなくcomputeHeatIndex内部で温度と湿度から計算して出力しているだけです。ちなみに三つ目の引数としてfalseを入れると摂氏での体感温度を出します。

④シリアルモニタで温度と湿度を表示する

Arduinoにスケッチを書き込み終わったら、シリアルモニタを開きましょう。
Arduino SDKのツール→シリアルモニタをクリックします。

ボーレートは9600bpsなのでデフォルトの設定でOKです。
シリアルモニタに湿度と温度が表示されました。
手でセンサーを覆ったりすると湿度が上がり、温度も上がったりするので、一応動作はしているようです。

ただし、、、残念なことにfloatで受け取ってるのに小数点以下は全部0ですorz
ライブラリのせいなのかと思いましたが、DHT11はそもそも小数点以下は測れないみたいです。しかも温度の精度は±2℃。おもちゃとしてなら使えるけど、実用はうーんですね。
上位互換のDHT12はI2Cも付いていて小数第一位まで測れるみたいです。




0 件のコメント:

コメントを投稿