DHT11/DHT22温湿度センサーキット - Raspberry Pi & Arduino対応
コンポーネントと用品
| DHT11温湿度センサー(4ピン) | × | 1 |
| Raspberry Pi 2 Model B | × | 1 |
| Arduino UNO | × | 1 |
| オス-オスジャンパーワイヤー | × | 3 |
| ブレッドボード(汎用) | × | 1 |
| 4.7kΩ抵抗 | × | 1 |
| Cobblerブレークアウトキット | × | 1 |
アプリとオンラインサービス
- Microsoft Windows 10 IoT Core
- Arduino IDE
- Raspberry Pi Raspbian
- Microsoft Visual Studio 2015
- WinSCP
- PuTTY
このプロジェクトについて
はじめに
DHT11は4ピン(1ピン未使用)の温湿度センサーで、相対湿度20%〜90%、温度0〜50℃を測定可能です。動作電圧は3〜5.5V DCで、独自のOneWireプロトコルで通信します。このプロトコルはデータ取得のために非常に正確なタイミングを必要とします。LOW/HIGHビットは、信号がHIGHである時間の長さで符号化されます。測定にかかる総時間は最大23.4msで、これにはデータ転送開始に必要な18msの遅延と、最大5.4msのデータウィンドウが含まれます。個々の信号は20μs〜80μsの長さです。
背景
Windows 10 IoT Coreが利用可能になったとき、Raspberry Pi 2とDHT11センサーでC#を試しましたが、うまくいきませんでした。Windows 10 IoT CoreでのC#は、少なくとも現時点では十分な速度が出ないのが問題です。
Microsoftフォーラムに投稿し、同じ問題を抱える他の開発者とやり取りしました。最終的に、Windows 10 IoT CoreでのOneWireプロトコルについてのMicrosoftの回答を見つけました。その後、DHT11をサンプルセンサーとして、C++でWindows 10 IoT Core上でのOneWireプロトコルサポートのサンプルがMicrosoftから投稿されているのを発見しました。これをC#に移植する機会と捉えました。
このプロジェクトは、そのサンプルをC#で使えるライブラリにするものです。この人気センサーをWindows 10 IoT Coreで使えるようにするライブラリを書いた方に感謝し、このライブラリでさらに役立つものになればと思います。
ライブラリ
作成したライブラリは、Microsoftが公開したコードのシンプルなリファクタリングなので、センサー読み取りを実現した作業のクレジットは主張しません。
ライブラリは、Sensors.Dht名前空間にDht11というシンプルなクラスを提供します。C#でのオブジェクト作成は簡単です。
まず、DHT11センサーのピンが接続されているGPIOピンを開きます:
using Sensors.Dht;
GpioPin pin = GpioController.GetDefault().OpenPin(4, GpioSharingMode.Exclusive);
このピンをDht11クラスのコンストラクタに渡し、GPIOピンドライブモードを指定します。これにより、独自のプルアップ抵抗を追加するかどうかを決められます:
Dht11 dht11 = new Dht11(_pin, GpioPinDriveMode.Input);
デバイスから読み取りを取得するには、GetReadingAsyncメソッドを使います:
DhtReading reading = await dht11.GetReadingAsync().AsTask();
最大リトライ値を指定するオーバーロードもあります。デフォルト値は20です。これは、読み取りを諦めて失敗読み取りを返す前に、センサー読み取りを試行する回数を指定します。
DhtReading構造体は以下のように定義されます:
public value struct DhtReading {
bool TimedOut;
bool IsValid;
double Temperature;
double Humidity;
int RetryCount;
};
観察結果
C++では動作しますが、それでも毎回読み取りが成功するわけではありません。そのため、クラスにリトライオプションが必要です(これはMicrosoftのサンプルにも含まれています)。他のプラットフォームと比較して性能を見てみようと思いました。Raspberry Pi 2でRaspbianを動かし、Arduino Unoでもコードを試しました。両方のコードはGitHubリポジトリに含めています。
このプロジェクトに含まれるビデオで、各プラットフォームの出力をデモし、比較しています。
始め方
Raspberry Pi 2用回路の組み立て
ページ下部の図を参照しながら回路を組み立ててください(ワイヤーの色は任意ですが、組み立て時に分かりやすくするために選んでいます)。
- T字型Cobblerをハーフサイズブレッドボードの左端(番号が1から始まる側)に配置。左右の端ピンがそれぞれE1/F1、E20/F20に来るように
- 4.7kΩ抵抗をA4と3V3の間に接続
- オレンジのジャンパーワイヤーでB4とF28を接続
- 赤のジャンパーワイヤーでF29と3V3を接続
- 黒のジャンパーワイヤーでF30とGNDを接続
- DHT11センサーをJ30(-)、J29(+)、J28(s)に挿入
- リボンケーブルをCobblerとRaspberry Piに接続
Arduino用回路の組み立て
ページ下部の図を参照しながら回路を組み立ててください。
- 4.7kΩ抵抗をE12とE13の間に配置
- 白のジャンパーワイヤーでD13とArduinoのピン5を接続
- 赤のジャンパーワイヤーでD12とArduinoの5Vピンを接続
- 黒のジャンパーワイヤーでD11とArduinoのGNDを接続
- DHT11センサーをA11(-)、A12(+)、A13(s)に挿入
- USBケーブルでコンピュータとArduinoを接続




Raspberry Pi用アプリケーションの起動
Debug、ARM構成、Remote Machineを選択。プロジェクトを右クリックし、Property → Debugタブをクリック。Remote machineフィールドにRaspberry Pi 2のIPアドレスを入力し、Use authenticationのチェックを外します。
F5を押すと、アプリケーションがデバイスにデプロイされます(初回は数分かかる場合があります)。
Arduino用アプリケーションの起動
このプロジェクトのスケッチはGitHubのDht11_Speedファイルにあります。Arduino IDEでスケッチを開き、Arduinoにアップロード(Ctrl+U)、シリアルモニタを開始(Ctrl+Shift+M)。
やり方が不明な場合や初心者の方は、下のビデオでデモしています。
Raspbian用アプリケーションの起動
Raspberry Pi用のCコードは、このプロジェクトのGitHubでDht11.cファイルとして公開しています。ソースをRaspberry Piにコピーしてそこでコンパイルします。ファイルコピーにはWinSCPを使うのが好きです。持っていない場合はダウンロードしてインストールをお勧めします。ソースコードはwiringPiを使用するため、コンパイル前にインストールが必要です。
Raspberry Piでのコンパイルコマンド:
gcc -o Dht11_Speed Dht11_Speed.c -L/usr/local/lib -lwiringPi -std=c99 -lm
実行コマンド:
sudo ./Dht11_Speed 1000 10
ここで1000は1000ms(1秒)の遅延、10は読み取りサンプル数を指定します。
ビデオで、コードのコピー方法とRaspbian上でのコンパイル方法を詳しくデモしています。Raspbianのインストール方法はこちら。
ビデオ
下のビデオはアプリケーションのデモです。YouTubeでシアターモードで見ると最高画質で見られます。
コード
Visual Studio 2015 C#/C++ ソースコード(GitHub)
回路図
Dht11_RPi2.fzz


Dht11_Arduino.fzz


製造プロセス
- 5ドルI2C温度センサーで作るRaspberry Pi温度ロガー
- Raspberry PiでTMP006赤外線温度センサーを使う – Pythonライブラリとセットアップガイド
- Raspberry PiとPythonでリモート温度センサーを構築 – ステップバイステップガイド
- DS1820ワンワイヤー温度センサーをGPIOでRaspberry Piに接続する方法
- DS18B20ワンワイヤーデジタル温度計をRaspberry Piに接続 - ステップバイステップガイド
- Raspberry PiとDS18B20でマルチセンサー温度・光監視システムを構築
- Raspberry Pi、MCP9808、InfluxDB、Grafanaで作る家庭温度モニター
- Raspberry Pi 3とDHT11センサーを接続し、ThingsIo.aiクラウドへデータ送信
- 色感度プロセス向け高精度赤外線温度センシング
- 高精度ベアリング温度センサー:正確な検知と監視
- DS18B20温度センサー:産業・コンシューマー向け高精度1-Wireデジタル温度計