「Arduinoの基礎 - 温湿度センサ」の版間の差分
(→概要) |
|||
1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
DHT-11はサーミスタと異なり、温度と湿度のキャリブレーション済みの状態で出荷されているセンサ(デジタル信号)である。<br> | DHT-11はサーミスタと異なり、温度と湿度のキャリブレーション済みの状態で出荷されているセンサ(デジタル信号)である。<br> | ||
一般的な利用において、温度は1[℃]程度の誤差、湿度は4[%]程度の誤差で測定できる。<br> | 一般的な利用において、温度は1[℃]程度の誤差、湿度は4[%]程度の誤差で測定できる。<br> | ||
8行目: | 6行目: | ||
[[ファイル:Arduino DHT11 1.png|フレームなし|中央]] | [[ファイル:Arduino DHT11 1.png|フレームなし|中央]] | ||
<br> | <br> | ||
4本のピンは左から順に、VDD、DATA、NC(非接続) | 4本のピンは左から順に、VDD、DATA、NC(非接続)、GNDである。<br> | ||
VDDへの供給電圧は、3.3[V]〜5.5[V]の範囲である。<br> | |||
<br> | |||
データシートを確認すると、VDDとGNDの間にパワーフィルタリングとして0.1[μF]のセラミックコンデンサを設置することができる。<br> | データシートを確認すると、VDDとGNDの間にパワーフィルタリングとして0.1[μF]のセラミックコンデンサを設置することができる。<br> | ||
<br> | <br> |
2024年12月22日 (日) 07:45時点における版
概要
DHT-11はサーミスタと異なり、温度と湿度のキャリブレーション済みの状態で出荷されているセンサ(デジタル信号)である。
一般的な利用において、温度は1[℃]程度の誤差、湿度は4[%]程度の誤差で測定できる。
ピンの割り当ては、下図の通りである。
4本のピンは左から順に、VDD、DATA、NC(非接続)、GNDである。
VDDへの供給電圧は、3.3[V]〜5.5[V]の範囲である。
データシートを確認すると、VDDとGNDの間にパワーフィルタリングとして0.1[μF]のセラミックコンデンサを設置することができる。
データはシングル・バス・データフォーマットで少々面倒であるが、ArduinoではDHT用のライブラリが多数あるので、それらを使用する。
データのサンプリング間隔は最短で1[s]なので、ソフトウェア側でデータを取得する時に、delayする必要がある。
2番ピンであるDATAピンはプルアップして使用する。プルアップ抵抗は、ワイヤが20[m]以下の場合は、5[kΩ]程度が推奨される。
一般的には、4.7[kΩ]〜10[kΩ]程度がよく使用されている。
なお、Arduinoの内部プルアップ抵抗は20[kΩ]なので、DHT-11では使用できない。
サンプルコード
DHT-11およびDHT-21を使用するには、Adafruit DHTセンサライブラリをインストールする必要がある。
Adafruit DHTセンサライブラリのインストール手順を、以下に示す。
- Arduino IDEのメニューバー[スケッチ] - [ライブラリをインクルード] - [ライブラリを管理]を選択する。
- [ライブラリの管理]画面が起動するので、検索項目から"Adafruit Unified Sensor"と入力する。
- ライブラリ一覧が表示されるので、Adafruit Unified Sensorを選択して、リスト右側にある[Install]ボタンを押下する。
- 次に、Adafruit DHTセンサライブラリのGithubにアクセスして、zipファイルをダウンロードする。
- Arduino IDEのメニューバー[スケッチ] - [ライブラリをインクルード] - [.ZIP形式のライブラリをインストール]を選択する。
- ダウンロードしたzipファイルを選択して、Adafruit DHTセンサライブラリをインストールする。
まず、DHT-11から温度と湿度を取得する。
さらに、温度と湿度からヒートインデックス(体感温度)が取得できるので、それも併せて取得する。
以下のサンプルコードでは、シリアルポートに値を出力している。
これでシリアルモニタを開けば、3秒おきに結果が出力されることがわかる。
LCDに出力する場合は、Arduinoを用いてLCDに文字を表示を参照すること。
#include <DHT.h>
const int PIN_DHT = 8;
DHT dht( PIN_DHT, DHT11 );
void setup()
{
Serial.begin(9600);
Serial.println("DHT11");
dht.begin();
}
void loop()
{
delay(3000);
bool isFahrenheit = true;
float percentHumidity = dht.readHumidity();
float temperature = dht.readTemperature( isFahrenheit );
if (isnan(percentHumidity) || isnan(temperature))
{
Serial.println("ERROR");
return;
}
float heatIndex = dht.computeHeatIndex(temperature, percentHumidity, isFahrenheit);
String s = "Temp: ";
s += String(temperature, 1);
s += "[F] Humidity: ";
s += String(percentHumidity, 1);
s += "[%] HI: ";
s += String(heatIndex, 1);
Serial.println(s);
}