アフィリエイト広告
アフィリエイト広告

温湿度センサ DHT11 を使ってみる (1)

ずいぶん前に、他の部品と一緒に買ってあった温湿度センサ DHT11 を使ってみました。

http://www.aosong.com/products-21.html

DHT11 は、現在は生産中止になっていて、バージョンアップ品として DHT20 があります。DHT20 は、通信インターフェースに I2C を使用していますので、より使いやすいかもしれません。

さて、DHT11 の通信インターフェースは独自プロトコルのようで、ググってみるとほとんどが「Arduino で使うにはライブラリをインストールする」ことになっています。

でも、データシートを見て、思ったんすけど、

これ、んなに難しいんか?

データシートを読む

ライブラリを使うにしても使わないにしても、データシートにはひととおり目を通しましょう。これ、基本。

产品参数

相対湿度の測定範囲は 5〜95%RH ±5% 、温度は -20〜60℃ ±2℃ 。そんなに高精度でもないですが、室温を測るには十分でしょう。
電源電圧は 5.0V 、測定時の電流は 1mA 、サンプリング周期は 2 秒超です。

典型电路

图2 DHT11 典型电路图

典型的な回路です。
マイクロプロセッサまわりは、まぁ好きにすれば良いですね。

センサの出力は 2 番ピンで、プルアップが必要です。
接続線が 5m 以下ならば、プルアップ抵抗は 4.7KΩ が推奨値です。5m を超えるときは抵抗値を下げろ、とのことですが、電流を 1mA 以上流せ、ってことでしょうか。

測定はデータの送出後に行なわれますので、読み出したデータは前回読み出した直後の測定値ということになります。なので、リアルタイムにデータを取得する場合は、2 回読み取れ、と。
また、正確なデータを取得するには、読み取り間隔が 2 秒を超えること、と書いてあります。

串行通信说明(单线双向)

通信プロトコルについて。
いろいろ書いてありますが、要するにこーゆーこと。

图 3 数据时序图

初めに、Arduino のポートから「起始信号」を送ります。すると、センサから「响应信号」が返ってきます。続けて、40 ビットのデータとチェックデジットが上位から順に送られてくる。最後に「结束信号」がきて、センサ出力が待機状態に戻ります。
温度と湿度の計測は、この後に行なわれ、記録されます。そして、次の「起始信号」を待ちます。

起始信号は、ホストより Low を 20ms 送ります。ホストを解放するための 13μs の High があって、响应信号は Low 83μs 、High 87μs です。

データ信号は、「0」が Low 54μs と High 24μs の、「1」が Low 54μs と High 71μs の組み合わせで、温度 2 バイト、湿度 2 バイト、チェックデジット 1 バイトの 5 バイト (40 ビット) です。
温度、湿度の各 2 バイトは、上位が整数部、下位が小数部ですが、湿度の小数部は常に 0 です。温度小数部の 8 ビット目が 1 (0x80 以上) のときは、氷点下の温度を意味します。測定値の小数点以下は 1 桁です。

チェックデジットは、温度、湿度データ 4 バイトの和となっています。チェックデジットに誤りがあったときは「放弃」、つまり諦めて (^_^;) 、再度データを受信しなさい、と。

最後の结束信号は、Low 54μs です。

ってことなので、データを受け取るには、データ信号が High になるときを捕まえて High の時間を測ればいいわけよね。High が 71μs ならば「1」、24μs ならば「0」で、そいつを頭から 8 ビットずつ並べれば良い。

パルスの時間を測る方法

パルスの High レベルの時間を測る方法。

micros() とか使って測ることができますね。High になった時間を、Low に戻った時間から引く。ポートを監視し続けるのが面倒くさいですが、難しいことではないです。
でも、Arduino には pulseIn() という関数がありますので、これ使いましょう。タイムアウトするまでポートを監視してくれるので、簡単です。

次回は、DHT11 から温度と湿度のデータを受け取るスケッチを作って、テストしてみましょう。

タイトルとURLをコピーしました